어제 오늘 내일

[Spring Boot] "가짜는 가라!" 실제 DB와 붙여보는 통합 테스트 (@SpringBootTest & H2) 본문

IT/SpringBoot

[Spring Boot] "가짜는 가라!" 실제 DB와 붙여보는 통합 테스트 (@SpringBootTest & H2)

hi.anna 2026. 3. 15. 01:52

 

지난 시간에는 가짜 객체(Mock)를 써서 빠르게 로직만 검증하는 '단위 테스트'를 배웠습니다. 하지만 실무에서는 이런 일이 종종 발생합니다.

"테스트 코드는 다 통과했는데, 막상 서버 띄우니까 에러가 나요!" 😭

이유는 간단합니다. SQL 쿼리가 틀렸거나, DB 연결 설정이 잘못되었기 때문입니다. 이런 문제는 Mock 객체로는 절대 찾을 수 없습니다.

오늘은 스프링 컨테이너를 진짜로 띄워서 처음부터 끝까지 테스트하는 @SpringBootTest와, 테스트용 DB인 H2를 활용하는 방법을 알아보겠습니다.

 


 

1. 통합 테스트란?

단위 테스트가 '부품 검사'라면, 통합 테스트는 '조립 검사'입니다.

  • 단위 테스트: MemberService만 떼어내서 테스트 (가짜 DB 사용) -> 빠르지만 실제 환경과 다름.
  • 통합 테스트: 스프링 부트를 실행해서 Controller, Service, Repository, DB까지 전부 연결해서 테스트 -> 느리지만 확실함.

 


 

2. 무거운 녀석을 불러오자: @SpringBootTest

사용법은 정말 간단합니다. 테스트 클래스 위에 어노테이션 하나만 붙이면 됩니다.

@SpringBootTest // 스프링 컨테이너를 진짜로 띄웁니다! (무거움)
@Transactional  // 테스트 끝나면 롤백! (데이터 오염 방지)
class MemberServiceIntegrationTest {

    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;

    @Test
    void 회원가입() {
        // given
        Member member = new Member("hello");

        // when
        Long saveId = memberService.join(member);

        // then (진짜 DB에 들어갔는지 확인!)
        Member findMember = memberRepository.findById(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }
}

💡 @Transactional의 마법 (테스트 환경에서만!)

운영 코드에서는 커밋(Commit)을 하지만, 테스트 코드에 붙이면 무조건 롤백(Rollback)을 합니다.
즉, 테스트가 끝나면 DB에 저장했던 데이터를 싹 지워주기 때문에, 다음 테스트에 영향을 주지 않고 반복해서 실행할 수 있습니다.

 


 

3. 테스트 전용 DB: H2 데이터베이스

"제 로컬 DB에는 이미 중요한 데이터가 많은데요? 테스트하다가 지워지면 어떡해요?"
그래서 보통 테스트할 때는 인메모리 DB(In-memory DB)H2를 사용합니다.

설정 방법 (src/test/resources/application.yml)

테스트 폴더(test)에 설정 파일을 따로 만들면, 실제(main) 설정보다 우선순위를 가집니다.

spring:
  datasource:
    url: jdbc:h2:mem:testdb;MODE=MySQL # 메모리 모드로 실행!
    driver-class-name: org.h2.Driver
    username: sa
    password:

  jpa:
    hibernate:
      ddl-auto: create # 테스트 시작할 때 테이블 다 새로 만듦!

이렇게 하면 테스트를 돌릴 때마다 깨끗한 메모리 DB가 생성되고, 끝나면 사라집니다. 내 로컬 DB(MySQL 등)는 안전하겠죠?

 


 

4. 단위 테스트 vs 통합 테스트: 언제 뭘 써야 할까요?

구분 단위 테스트 (Unit) 통합 테스트 (Integration)
속도 매우 빠름 (몇 ms) 느림 (스프링 띄우는 데 수 초 걸림)
대상 비즈니스 로직 검증 (if문 등) 전체적인 흐름 & DB 연결 검증
도구 JUnit5 + Mockito @SpringBootTest + H2
비율 70% (많이 짜세요!) 30% (핵심 기능 위주로!)

꿀팁: "가능하면 단위 테스트로 검증하고, 도저히 안 될 때(SQL 확인 등)만 통합 테스트를 작성하세요."
이것이 테스트의 황금 비율입니다.

 


 

마치며

오늘의 결론입니다.

  1. @SpringBootTest는 실제 스프링을 띄워서 검증하는 확실한 방법이다.
  2. @Transactional을 붙이면 테스트 후 데이터가 자동 롤백되어 깔끔하다.
  3. test/resources/application.yml을 따로 만들어 H2 DB를 사용하자.
  4.  

이제 여러분은 로직 검증(Unit)부터 DB 연동 검증(Integration)까지 완벽하게 마스터하셨습니다!

다음 포스팅에서는 "API 문서를 엑셀로 정리하세요? 에이, 설마..." 개발자가 코드만 짜면 문서가 자동으로 만들어지는 Swagger(Springdoc)와 REST Docs에 대해 알아보겠습니다.

 

 

반응형
Comments