@SpringBootTest와 @DataJpaTest 차이
연관관계 매핑 test를 하기 위해 어노테이션 설정을 했다.
이 전에 실제 db가 아닌 h2로 테스트 하기 위해서 test용 application으로 설정했었다.
@TestPropertySource(locations = "/application.properties")
또, @Transactional을 설정했는데 이를 한꺼번에 해주는 어노테이션이 있었다.
🐣 @Transactional
@Transactional
을 사용하는 이유는 트랜잭션 처리를 하기 위해서다.- 일련의 작업들을 묶어서 하나의 단위로 처리
- 자동으로 트랜잭션을 걸어서 테스트를 실행해주고 끝날 때는 rollback 처리를 해준다.
- 관련 글
@SpringBootTest
full application config을 로드해서 통합 테스트를 진행하기 위한 어노테이션이다.
- ApplicationContext에 모든 Bean들을 등록한다.
- SpringBoot 어플리케이션을 실행했을 때와 동일하게 컨테이너에 Bean들을 등록한다.
설정해놓은 config, context, components를 모두 로드한다.
DataSource bean을 그대로 사용하기 때문에 in-memory, 로컬, 외부 상관 없이 DB를 사용해서 테스트가 실행된다.
- 테스트할 때마다 DB가 롤백되지 않기 때문에 @Transactional을 추가로 설정해줘야 한다.
@DataJpaTest
- @DataJpaTest 어노테이션은 JPA 관련 테스트 설정만 로드한다.
- Component Scan을 하지 않아 컨테이너에 @Component 빈들이 등록되지 않는다.
JPA를 사용하여 데이터를 제대로 생성, 수정, 삭제하는지 등의 테스트가 가능하다.
기본적으로 in-memory embedded DB를 사용한다. (
Replace.ANY;
)@Transactional
이 포함되어있다.
@AutoConfigureTestDatabase
@DataJpaTest
에 있는 @AutoConfigureTestDatabase
에 Replace.ANY;
를 통해서
실제 db를 사용하지 않고 테스트 db로 테스트 할 수 있다. (기본적으로 내장된 임베디드 데이터베이스를 사용한다.)
Any 속성 외에도 AUTO_CONFIGURED와 NONE이 있다.
- ANY
- 자동 구성, 수동 구성된 DataSource 빈 모두 교체함
- AUTO_CONFIGURED
- 자동 구성된 DataSource 빈만 교체함
- NONE
- 어플리케이션에 기본 값으로 설정된 DataSource를 교체하지 않음
@DataJpaTest
에서 in-memory 데이터베이스로 사용할 수 있는 db 유형
EmbeddedConnection으로 제공하고 있는것은 H2, DERBY, HSQL을 제공하고 있다.
실제 db를 사용하려면?
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
를 작성한다.
정리
기존 프로젝트에서 @SpringBootTest를 사용한 test 코드를 작성했을 때
db를 h2로 사용했을 때는 문제가 없었으나 mysql로 변경하면서
@SpringBootTest 어노테이션이 존재하는 클래스는
테스트를 실행하면 @SpringBootApplication 어노테이션을 검색하고
@SpringBootApplication에서 설정된 값을 읽어와서, 테스트에서 사용하기 때문에 mysql로 연결이 되었다.
테스트 코드에서는 기존 db대신 test용 임시 데이터로 사용해야 해서
test용 application.properties
에서 h2 설정을 하고 여러 어노테이션을 붙였었는데
Jpa 관련 테스트를 할 때는 @DataJpaTest를 사용하는게 더 좋고 @SpringBootTest 보다 실행 속도가 더 빠르다.
출처
Spring DB : DB 테스트
[Spring] @SpringBootTest vs @DataJpaTest
[JPA] DataJpaTest: 테스트시에 실제 DB 사용하기
💥[@DataJpaTest] Error creating bean with name ‘dataSource’ 에러
스프링 부트 테스트 : @DataJpaTest
[Spring Boot] @DataJpaTest vs @SpringBootTest 비교