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