본문 바로가기
스프링/SpringBoot

[Spring Boot 3.5] 아직도 H2 쓰시나요? Testcontainers로 구현하는 2026년형 리얼 테스트

by 공부 안하고 싶은 사람 2026. 2. 27.
반응형
Advanced Testing Strategy

인메모리 DB는 이제 안녕!
Testcontainers로 만드는 무결점 테스트

 

안녕하세요, code-resting입니다. 운영 환경은 PostgreSQL이나 MySQL인데, 테스트는 H2로 돌리고 계시진 않나요? DB 전용 함수나 JSON 데이터 타입을 쓸 때마다 발생하는 테스트 실패는 개발자를 지치게 합니다. 오늘은 2026년 백엔드 개발의 필수 교양인 Testcontainers를 통해 실제 인프라와 100% 동일한 환경에서 테스트하는 법을 다뤄보겠습니다.

1. 왜 H2가 아닌 Testcontainers인가?

테스트 환경과 운영 환경이 다를 때 발생하는 '환경 격차'는 치명적인 버그의 원인이 됩니다. Testcontainers는 Docker를 기반으로 실제 DB나 메시지 브로커를 띄워 테스트를 수행합니다.

  • H2의 한계: MySQL의 JSON_EXTRACT나 Redis의 특정 모듈 등 운영 환경 전용 기능을 테스트할 수 없음.
  • Testcontainers의 장점: 프로덕션과 동일한 Docker 이미지를 사용하므로 "로컬에선 되는데 서버에선 안 돼요"라는 말이 사라짐.

2. Spring Boot 3.5+ 통합 설정

최신 스프링 부트에서는 @ServiceConnection 어노테이션을 통해 별도의 프로퍼티 설정 없이도 컨테이너 정보를 빈(Bean)에 자동으로 주입할 수 있습니다.

@SpringBootTest
@Testcontainers
class ProductRepositoryTest {

    @Container
    @ServiceConnection
    static PostgreSQLContainer<?> postgres = 
        new PostgreSQLContainer<>("postgres:16-alpine");

    @Autowired
    private ProductRepository productRepository;

    @Test
    void 데이터_저장_및_조회_테스트() {
        // 실제 PostgreSQL에서 동작하는 테스트
        Product saved = productRepository.save(new Product("노트북", 2000000));
        assertThat(productRepository.findById(saved.getId())).isPresent();
    }
}

3. 2026년 실무에서 활용하는 꿀팁

🚀 Reusable Containers (컨테이너 재사용)

테스트마다 컨테이너를 껐다 켜면 속도가 느려집니다. .withReuse(true) 설정을 통해 테스트 간에 컨테이너를 유지하여 전체 빌드 시간을 70% 이상 단축할 수 있습니다.

🌐 외부 API 모킹: WireMock + Testcontainers

외부 API 호출이 포함된 로직인가요? WireMock 컨테이너를 함께 띄우면 실제 네트워크 응답까지 완벽하게 시뮬레이션할 수 있습니다.

💡 마치며: 테스트는 자신감입니다

2026년의 개발 환경에서 '빠르고 정확한 피드백 루프'를 갖는 팀이 승리합니다. H2라는 가짜 환경 뒤에 숨지 마세요. Testcontainers를 통해 내 코드가 실제 운영 환경에서도 완벽하게 동작한다는 확신을 가지시길 바랍니다.

© 2026 code-resting. All rights reserved.

반응형

댓글