💡 개요
오늘은 Spring에서 테스트에 사용되는 어노테이션인 @DataJpaTest과 @SpringBootTest에 대해 정리해 보자.
📕 @DataJpaTest
@DataJpaTest는 Spring에서 JpaRepository를 테스트할 때 사용되는 어노테이션이다.
@DataJpaTest의 가장 주요한 특징으론 실제 쿼리가 DB에 반영되지 않는다.
일반적으로 JPA는 개발자가 요청한 쿼리를 영속성 컨텍스트에 담아뒀다가 커밋하기전에 모든 쿼리를 DB에 반영하는 flush()을 수행한다.
하지만 @DataJpaTest의 경우엔 flush()가 동작하지 않는다.
그렇기 때문에 flush()가 동작하는 @SpringBootTest 보다 빠르다고 느낄 수 있다.
뿐만 아니라 @DataJpaTest 내부를 보면 @Transactional 어노테이션이 달려있다.
이는 테스트가 끝난 후 자동으로 롤백되도록 하기 위함이다.
즉, @DataJpaTest를 사용하면 테스트 중 수행된 모든 데이터 변경 작업이 자동으로 롤백되므로, 실제 DB 상태를 변경하지 않고도 JPA 관련 로직을 검증할 수 있다.
이는 테스트 간 데이터 정합성을 유지하는 데도 유리하다.
또한 @AutoConfigureTestDatabase을 포함하고 있기 때문에 별도의 DB 설정 없이, 인메모리를 DB로 사용할 수 있다.
📕 @SpringBootTest
@SpringBootTest는 @DataJpaTest와 달리 실제 데이터베이스를 사용할 수 있으며, 기본적으로 트랜잭션이 설정되어 있지 않다.
이로 인해 영속성 컨텍스트에 저장된 변경 사항이 모두 정상적으로 flush()되며, 실제 데이터베이스에 반영된다. 즉, 테스트 중 수행된 쿼리가 롤백되지 않고 그대로 DB에 저장된다.
이러한 특징 때문에 @SpringBootTest는 JPA 테스트보다는 실제 비즈니스 로직을 검증하는 Service 레이어 테스트에 적합하다.
Service 레이어는 Repository를 통해 데이터를 조회하고 가공하는 역할을 하므로, 실제 DB 환경에서 테스트하는 것이 더욱 현실적인 시나리오를 검증하는 데 도움이 된다.
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.04.05 - N+1 문제 (JPA) (0) | 2025.04.05 |
---|---|
[개발 일기] 2025.04.04 - isBlank() vs isEmpty() (0) | 2025.04.04 |
[개발 일기] 2025.04.02 - Spring Boot 서버가 작동될 때 발생되는 일 (0) | 2025.04.02 |
[개발 일기] 2025.04.01 - Blocking & Non-blocking IO (0) | 2025.04.01 |
[개발 일기] 2025.03.31 - WSS (WebSocket Secure) (0) | 2025.03.31 |