Repository 관련 팁
EntityManager 는 @PersistenceContext 어노테이션을 필드에 붙여주면 주입받을 수 있다.
스프링부트와 함께 사용 시, EntityManager 를 생성자로 주입받을 수도 있다.
Service 관련 팁
JPA 사용 시, 영속성 컨텍스트는 트랜잭션 내에서만 사용할 수 있으므로 모든 메서드에 트랜잭션 처리가 필요하다. 따라서, 서비스 클래스에 @Transactional 어노테이션을 붙이자.
데이터 수정이 발생하지 않는 메서드는 @Transactional 에 readOnly 속성을 true로 설정해주자. (JPA 관련 최적화)
스프링부트 관련 팁
주입을 받을 때는 생성자 주입을 활용하자. (다양한 방법이 있지만 가장 좋은 방법)
생성자 주입을 활용하는 패턴은 주입받을 필드를 final 로 선언하고 @RequiredArgsConstructor 어노테이션을 활용하자.
테스트 관련 팁
강의에서는 @SpringBootTest 와 @RunWith(SpringRunner.class) 두 어노테이션을 사용하여 테스트 클래스에 붙여주지만(테스트에 필요한 것들만 가져오도록 하는 설정, Junit 4 버전), JUnit5 부터는 @SpringBootTest 어노테이션만 사용하면 내부에서 @ExtendWith 를 통해 SpringRunner 를 사용하여 하나의 어노테이션만 붙여주면 된다.
JPA 는 영속성 컨텍스트를 활용하여 객체의 동일성을 보장하므로 테스트에서 @EqualsAndHashCode 를 사용하지 않아도 비교를 할 수 있다.
@Transactional 어노테이션을 테스트 클래스에 붙이면 테스트 이후 자동으로 트랜잭션을 롤백하여 반복 테스트가 가능하다.
직접 확인해보고 싶다면 해당 테스트에 @Rollback(false) 를 주어 커밋되게 할 수도 있다.
쿼리를 직접 확인하고 싶다면 엔티티매니저를 주입받아 flush 메서드를 호출하여 커밋 전에 쿼리가 나가도록 하고, 쿼리를 로그로 남기는 설정을 통해 확인해볼 수 있다.
테스트 폴더 하위에 resources 폴더를 만들고, 하위에 application.yml을 두면 테스트용 설정을 따로 관리해줄 수 있다.
spring.datasource.url 값을 jdbc:h2:mem:test 로 설정해주면 jvm 내에 메모리 H2 를 띄워 테스트를 한 뒤 종료한다. (스프링부트의 테스트 기본 값이므로 설정하지 않아도 됨)