솔솔
[Test/SpringBoot] Spring Boot 테스트 어노테이션 제대로 알기: @SpringBootTest vs @DataJpaTest 본문
나의보물들/Test
[Test/SpringBoot] Spring Boot 테스트 어노테이션 제대로 알기: @SpringBootTest vs @DataJpaTest
솔솔하네 2025. 3. 20. 21:42반응형
🍀 들어가기
Spring Boot에서 테스트를 공부하다보면,
Spirngframwork에서 제공하는 다양한 테스트 어노테이션을 접하게 된다.
그중에서도
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
@SpringBootTest와 @DataJpaTest를 볼 수 가 있다.
처음 테스트를 실행해 보면 두 어노테이션의 차이가 크게 느껴지지 않을 수 있지만,
실제로는 중요한 차이가 있다.
🍀 @SpringBootTest
@SpringBootTest
class OrderServiceTest {
@Autowired
private OrderService orderService;
}
- Spring Boot의 모든 빈을 로드하여 완전한 애플리케이션 컨텍스트를 실행함 → 완전한 통합 테스트가 가능
- 즉 Persistence, Business, Presentation 등 모든 계층을 테스트 테스트 할 수 있음
- 하지만 모든 빈을 로드하기 때문에 테스트 속도가 느림
🍀 @DataJpaTest
@DataJpaTest
class OrderRepositoryTest {
@Autowired
private OrderRepository orderRepository;
}
- JPA 관련 빈(Entity, Repository)만 로드 → Persistence Layer 집중적 테스트(단위 테스트)
- 테스트 후 자동으로 롤백 됨.* @DataJpaTest를 타고 들어가보면 @Transactional 어노테이션이 있음

- 빠른 테스트가 가능함
🍀 @SpringBootTest와 @DataJpaTest를 사용하면서 주의할 점
Business Layer 테스트 시 @DataJpaTest 어노테이션을 사용한다면?
@DataJpaTest
class OrderServiceTest {
@Autowired
private ProductRepository productRepository;
@Autowired
private OrderService orderService;
@DisplayName("재고와 관련된 상품이 포함되어 있는 주문번호 리스트를 받아 주문을 생성한다")
@Test
void createOderWithStock() {
...(생략)
productRepository.save(product);
orderService.createOrder(request)
...(생략)
}
}
위 코드처럼 Business Layer 테스트 시 @DataJpaTest 어노테이션을 사용한다면
아래처럼 테스트 실패를 맛 볼 것이다.

❌ 테스트 실패의 원인
@DataJpaTest는 JPA 관련 빈 만 로드하고, Business Laye의 빈은 생성하지 않기 때문이다.

@Service가 붙은 OrderService는 빈으로 등록되지 않으므로, @Autowired를 통해 주입받을 수 없음
✅ 해결 방법
@SpringBootTest로 변경하여 전체 빈을 로드하도록 하면 된다.
'나의보물들 > Test' 카테고리의 다른 글
[Test] Mockito 테스트 어노테이션 : @Mock, @MockBean, @Spy, @InjectMocks 이해하기 (0) | 2025.03.27 |
---|---|
[Test] Layered Architecture 구조적 이해와 단계별 테스트 작성법 (0) | 2025.03.25 |
[Junit] 반복되는 테스트 코드 줄이기: @ParameterizedTest로 여러 케이스 한 번에 실행하기 (0) | 2025.03.18 |