솔솔

[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로 변경하여 전체 빈을 로드하도록 하면 된다.