Spring Boot를 통해 Data JPA를 테스트하고자 하는 경우 @DataJpaTest
를 사용할 수 있다. 이 어노테이션을 사용할 경우 in-memory embedded database가 설정되며 @Entity 클래스를 스캔한다.
일반적인 @Component 빈은 로드하지 않는다.
설명했던 @WebMvcTest와 동일하게 필요한 클래스만 로드하므로 빠르고 가벼운 테스트를 지원한다.
Data Jpa Test는 기본적으로 트랜잭션을 지원하며 각 테스트가 끝날 때마다 롤백처리를 수행합니다.
@DataJpaTest 어노테이션은 @Transactional을 포함하고 있기 때문에 별도의 설정을 해줄 필요는 없다.
만약 트랜잭션 기능이 필요하지 않다면 아래와 같이 설정한다.
1 | import org.junit.runner.RunWith; |
Data Jpa Test는 기존 표준인 EntityManager의 테스트를 위한 대안인 TestEntityManager 빈을 주입할 수 있다. EntityManager는 데이터베이스에 엑세스를 담당하는 클래스로 엔티티를 데이터베이스에 CRUD(등록, 조회, 수정, 삭제) 처리한다. 기본 키를 기준으로 엔티티를 탐색한다.
비영속성과 영속성이란 개념을 먼저 이해할 필요가 있다. 비영속성인 상태는 EntityManager(영속성 컨텍스트)나 데이터베이스에 반영되지 않은 순수한 엔티티 객체 상태를 의미한다. 이러한 비영속성 객체는 persist() 메서드를 통해 영속성 컨텍스트에 저장된다. 저장된 후부터 영속 상태라 불린다. 영속상태의 엔티티는 영속성 컨텍스트에 find() 메소드를 통해 탐색할 수 있다. 이외에 영속성 컨텍스트의 다른 메소드들은 다음과 같다.
- entityManager.find() : 엔티티 조회
- entityManager.persist() : 엔티티 등록
- entityManager.remove() : 엔티티 삭제
- entityManager.flush() : 영속성 컨텍스트에 저장된 엔티티를 데이터베이스에 반영
- entityManager.detach() : 엔티티를 준영속 상태로 전환
- entityManager.merge() : 준영속 상태의 엔티티를 영속상태로 변경(병합)
- entityManager.clear() : 영속성 컨텍스트 초기화
- entityManager.close() : 영속성 컨텍스트 종료
1 |
|
우선 Entity 객체를 생성한다.
1 | import org.springframework.data.jpa.repository.JpaRepository; |
Entity의 Repository를 생성한다.
1 | (SpringRunner.class) |
위와 같이 데이터를 영속성으로 등록하고 삭제하는 테스트를 해보았다.
내장된 In-memory Database는 일반적으로 빠르고 별도의 설치가 없기때문에 간단한 테스트에 적합하다. 그러나 실제 데이터베이스에 대한 테스트에 비해 정확성이 떨어질 수 있다. 만약 실제 데이터베이스에서 테스트를 수행하고자 한다면 아래와 같이 @AutoConfigureTestDatabase
어노테이션을 사용한다.
1 | (SpringRunner.class) |
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
어노테이션 속성을 추가할 경우 실제 데이터베이스를 통한 테스트가 가능하다.