전체 글
-
[JPA] JpaRepository save() 메서드 주의 사항Spring 2021. 2. 17. 17:09
오늘은 JpaRepository 인터페이스의 메서드 중 주의하여 사용해야 할 save() 메서드에 대해 알아보겠습니다. 우리가 ORM 프레임워크인 JPA와 Spring 프레임워크를 연계하여 사용할 때 Spring Data에서 지원하는 JpaRepository 인터페이스를 자주 사용하는데요, 실제 동작하는 구현체인 SimpleJpaRepository는 @Repository 어노테이션이 붙어있기 때문에 스프링이 실행될 때 AnnotationApplicationContext에 의해 스프링 컨테이너에 빈으로 등록이 됩니다. 이 모든 것을 스프링이 해주기 때문에 개발자는 JpaRepository를 확장하는 인터페이스만 만들어서 Repository로 사용하면 되는 것입니다. (스프링은 알면 알수록 애플리케이션을 ..
-
[JPA] N+1 문제 해결하기Spring 2020. 12. 25. 12:01
안녕하세요. 오늘 알아볼 주제는 OneToOne 또는 ManyToOne 관계에서 발생하는 N + 1 문제 해결하기 입니다. 해당 블로그의 코드는 Github에서 제공됩니다. XToMany 관계에서 N+1 문제 해결하기는 추후에 게시할 예정입니다. 본문 JPA를 사용하다보면, 자주 만나는 문제가 N+1 문제입니다. 다음과 같이 하나의 부서(Department)에 여러명의 직원(Employee)이 소속되어 있다고 가정하겠습니다. Department와 Employee의 관계를 코드로 간단하게 표현해보겠습니다. Employee가 연관관계 주인으로써 조회할 때 Department를 지연로딩 합니다. @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTE..
-
[JPA ] Auditing 기능 살펴보기Spring 2020. 11. 26. 22:05
Spring Boot 2.4.0 / Spring Data Jpa / JDK 8 / h2database 개요 Auditing 활성화하기 BaseEntity 생성하기 Entity에 적용하기 JUnit으로 테스트해보기 1 @CreatredBy, @ModifiedBy 사용하기 JUnit으로 테스트 해보기 2 실무에서 사용하기 서론 ORM(Object Relationship Mapping) 기술인 JPA는 Application의 Entity와 DB의 Table을 매핑하여 사용합니다. DB는 해당 데이터를 누가, 언제 생성 또는 수정했는지 기록하는 것이 꽤나 중요합니다. 이 데이터들은 많은 테이블에서 사용되기 때문에 Entity에도 필드로 중복되어 들어가고, 해당 Entity가 생성 또는 수정될 때마다 개발자가 신..
-
[Spring Mvc] JPA 환경에서 Rest API를 잘 작성하는 방법Spring 2020. 11. 7. 23:25
* 이 글은 김영한님의 [실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] 강의를 참고하여 작성 하였습니다. 1. 회원 등록 API - 문제가 있는 version 1 API @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { Long id = memberService.join(member); return new CreateMemberResponse(id); } @Entity public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; @NotEmpty..
-
[OKKYCON: 2018] 이규원 - 당신들의 TDD가 실패하는 이유세미나 2020. 9. 27. 13:00
1. 개요 성공하는 팀이 어떻게 하고 있는지 하나의 사례를 엿본다. 우리 프로젝트 - Non-Startup - Business Service (B2B) - Global Market - Competitors (경쟁사들 존재) - Message-Driven (메시지 기반) - Multitenancy (멀티테넨시: 여러 사용자가 동시에 한 서비스를 공유하여 사용) - Scalable (범위성: 확장하거나 커져도 기존의 기능이 제대로 작동하는 능력) - Responsive (반응형) 우리 팀 - 본인 - 1년차 1명 - 신입 2명 초급 개발자들이 위와 같은 요구사항에 어떻게 적응하였는지 얘기해보려 한다. 2. TDD가 실패하는 이유 (개인과 조직의 시각) 준비가 안됐기 때문 성급하게 도입하고 성급하게 결과를 보..
-
[OKKYCON: 2018] 박재성 - 의식적인 연습으로 TDD, 리팩토링 연습하기세미나 2020. 9. 13. 19:28
TDD는 무작정 연습하기보다 의식적으로 연습해야 한다. 책에서 추천하는 의식적인 연습 원칙 한 단계 발전하기 위해서는 컴포트 존(익숙하고 편안한 수준)을 벗어난 지점에서 연습을 한다. 피드백을 받을 수 있는 환경(코드리뷰나 테스트 코드 등)을 만들어서 피드백에 따라 다음 단계를 연습해야 한다. 한 번에 많은걸 연습하기보다 한 가지 특정 부분을 개선하는 것이 효과적인 연습이다. 의식적인 TDD, 리팩토링 연습 과정 1단계 - 단위 테스트 연습 내가 사용하는 API (String 클래스의 split, substring 등) Input과 Output이 명확한 클래스 메서드 (보통 Util 성격의 메서드) 알고리즘 2단계 - TDD 연습 연습은 토이 프로젝트에 진행 ( 회사 프로젝트는 일정 압박에 연습이 잘 안..
-
[프로그래머스] 완주하지 못한 선수 (JAVA)알고리즘 2020. 9. 10. 22:30
Hash를 이용한 나의 풀이 import java.util.Arrays; import java.util.HashMap; import java.util.Map; import static java.util.stream.Collectors.counting; import static java.util.stream.Collectors.groupingBy; class Solution { public String solution(String[] participant, String[] completion) { Map pMaps = Arrays.stream(participant).collect(groupingBy(String::toLowerCase, counting())); for (String c : completio..
-
[OKKYCON: 2018] 정진욱 - 테스트하기 쉬운 코드로 개발하기세미나 2020. 9. 6. 23:22
테스트하기 쉬운 코드란? 같은 입력에 항상 같은 결과를 반환하는 코드 (Deterministic) 외부상태를 변경하지 않는 코드 (No side effects) 테스트하기 어려운 단계는? (2, 3) ConferenceRegistration (VO) 유효성 검사 이미 등록된 좌석 수 DB에서 읽어오기 (Not Deterministic) 요청한 좌석 수가 확보 가능한지 판단 등록 정보 저장 (Side effects) HTTP 결과 반환 테스트 코드를 만족하는 만큼만 최소한으로 구현을 하라 테스트는 1만 작성했지만 구현은 1, 2, 3을 하게되면 구현 코드 2, 3은 테스트에 커버되지 않음 TDD의 점진적인 접근 방법의 긍정적인 효과를 잃어버림 방법 테스트하기 쉬운 코드와 어려운 코드를 분리 두 부류의 코드..