SpringBoot/테스트와 품질 관리

통합 테스트 (@SpringBootTest)

DEVLIB 2025. 4. 15. 10:55
728x90

@SpringBootTest란?

정의

@SpringBootTest는 실제 애플리케이션처럼 전체 스프링 컨텍스트를 로딩해서
서비스, 컨트롤러, 리포지토리, 보안 설정 등 모든 빈을 대상으로 테스트할 수 있도록 해주는 어노테이션입니다.

즉, **"실제 실행 환경과 거의 동일한 조건"**에서 테스트할 수 있어,
기능 검증과 버그 예방에 매우 유용합니다.


기본 사용 예

@SpringBootTest
@Transactional
class MemberIntegrationTest {

    @Autowired
    private MemberService memberService;

    @Autowired
    private MemberRepository memberRepository;

    @Test
    void 회원가입_성공_테스트() {
        // given
        MemberDto dto = new MemberDto("홍길동", "test@example.com");

        // when
        memberService.register(dto);

        // then
        Optional<Member> result = memberRepository.findByEmail("danbi@example.com");
        assertTrue(result.isPresent());
    }
}

주요 어노테이션 정리

어노테이션 설명
@SpringBootTest 스프링 컨텍스트 전체 로딩 (모든 빈 포함)
@Transactional 테스트 후 DB 자동 롤백 (DB 초기화 보장)
@Test JUnit 테스트 실행 메서드 표시
@Autowired 테스트 대상 빈 주입

설정 팁: 테스트 DB 설정

application.yml (테스트 전용)

spring:
  datasource:
    url: jdbc:h2:mem:testdb
  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true

테스트용 H2 인메모리 DB를 사용하면 빠르고 안전한 테스트 가능


장점 vs 단점

항목 설명
장점 전체 흐름을 검증 가능 (실제 환경과 동일)
단점 실행 속도 느림, 설정 복잡도 ↑, 디버깅 어려움
단위 테스트는 @WebMvcTest, @DataJpaTest로 쪼개고, 전체 흐름 테스트는 @SpringBootTest로 보완

응용: 웹 요청 포함 통합 테스트

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class MemberControllerIntegrationTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    void 회원가입_API_테스트() {
        MemberDto dto = new MemberDto("홍길동", "test@example.com");

        ResponseEntity<String> response = restTemplate.postForEntity("/api/member", dto, String.class);

        assertEquals(HttpStatus.OK, response.getStatusCode());
    }
}
옵션 설명
RANDOM_PORT 내장 톰캣을 실제 실행하여 HTTP 요청 테스트 가능
TestRestTemplate 스프링이 제공하는 API 테스트용 REST 클라이언트

마무리 요약

항목 설명
사용 어노테이션 @SpringBootTest, @Transactional
테스트 범위 전체 애플리케이션 로딩 (통합 환경)
주 대상 서비스 전체 흐름 / API 테스트 / DB 연동 검증
실무 팁 빠른 단위 테스트와 병행하여 사용 추천
LIST