[Spring Boot] @DataJpaTest vs @SpringBootTest 비교

Jiwoo Kim·2021년 6월 21일
2
post-thumbnail

제대로 된 이해 없이 JpaRepository 테스트에다가 @DataJpaTest를 갖다 붙였다가 삽질을 오래오래 했다...^^ 그래서 이참에 제대로 알고 가려고 정리를 한다.

사용 버전

  • Spring Boot 2.5.1
  • JUnit 5.3.1
  • Hamcrest 2.2

@DataJpaTest

@DataJpaTest는 오직 JPA 컴포넌트들만을 테스트하기 위한 어노테이션이다.
full-auto config를 해제하고 JPA 테스트와 연관된 config만 적용한다. 그 config는 아래 리스트와 같다. @DataJpaTest가 포함하고 있는 어노테이션이다.

@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Inherited @BootstrapWith(value=org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTestContextBootstrapper.class)
@ExtendWith(value=org.springframework.test.context.junit.jupiter.SpringExtension.class)
@OverrideAutoConfiguration(enabled=false)
@TypeExcludeFilters(value=DataJpaTypeExcludeFilter.class)
@Transactional
@AutoConfigureCache
@AutoConfigureDataJpa
@AutoConfigureTestDatabase
@AutoConfigureTestEntityManager
@ImportAutoConfiguration
public @interface DataJpaTest

@Transactional

  • 자동으로 롤백된다.

@AutoConfigureTestDatabase

  • replace=AutoConfigureTestDatabase.Replace가 디폴트로 설정되어 있어, 설정해놓은 DB가 아닌 in-memory DB를 활용해서 테스트가 실행된다.
  • EmbeddedDatabaseConnection 클래스를 보면 H2, DERBY, HSQL, HSQLDB 중 사용 가능한 in-memory DB에 자동으로 컨넥션을 설정하는 것을 확인할 수 있다.
  • replace=AutoConfigureTestDatabase.NONE으로 값을 덮어 씌우면 설정해놓은 DB를 테스트에 사용할 수 있다.

@SpringBootTest

@SpringBootTest는 full application config을 로드해서 통합 테스트를 진행하기 위한 어노테이션이다.

@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Inherited
@BootstrapWith(value=SpringBootTestContextBootstrapper.class)
@ExtendWith(value=org.springframework.test.context.junit.jupiter.SpringExtension.class)
public @interface SpringBootTest

유의점

  • 설정해놓은 config, context, components를 모두 로드한다.
  • DataSource bean을 그대로 사용하기 때문에 in-memory, 로컬, 외부 상관 없이 DB를 사용해서 테스트가 실행된다.
  • 테스트할 때마다 DB가 롤백되지 않기 때문에 @Transactional을 추가로 달아주어야 한다.

0개의 댓글