Spring Boot에서 Docker, Compose, Testcontainers를 함께 쓴다는 것
Spring Office Hours 시즌5 19화는 Docker, Docker Compose, Testcontainers, 그리고 Spring Boot 플러그인의 신규 기능들을 주제로 다룬다. 이 세 가지 기술은 각각 독립적으로도 활용되지만, Spring Boot 생태계 안에서 함께 엮일 때 개발 생산성과 테스트 신뢰성 모두를 끌어올리는 강력한 조합이 된다. 4년차 이상의 백엔드 개발자라면 단순히 "쓸 줄 안다"를 넘어, 이 도구들이 Spring Boot와 어떻게 통합되어 있는지 그 설계 의도를 이해하는 것이 중요하다.
Spring Boot의 Docker Compose 지원이 바꾸는 개발 워크플로우
Spring Boot 3.1부터 공식적으로 spring-boot-docker-compose 모듈이 도입되었다. 이 모듈을 의존성에 추가하면, 애플리케이션 기동 시 프로젝트 루트의 docker-compose.yml을 자동으로 감지하고 필요한 컨테이너를 함께 띄워준다. 개발자가 직접 docker compose up을 별도로 실행할 필요가 없어지는 것이다.
# docker-compose.yml
services:
postgres:
image: postgres:16
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: secret
ports:
- "5432:5432"
위와 같은 파일이 레포지토리에 존재하기만 하면, Spring Boot가 기동되면서 PostgreSQL 컨테이너를 자동으로 실행하고 application.properties 없이도 DataSource 설정을 자동으로 연결해준다. 팀 온보딩 시간을 줄이고, "내 로컬에서는 됐는데"류의 환경 불일치 문제를 구조적으로 제거한다.
Testcontainers 통합으로 테스트 신뢰성 확보하기
Testcontainers는 JUnit 테스트 실행 시 실제 Docker 컨테이너를 띄워 통합 테스트를 수행하게 해주는 라이브러리다. Spring Boot 3.1 이후에는 @ServiceConnection 어노테이션을 통해 Testcontainers와의 연동이 더욱 간결해졌다.
@SpringBootTest
class OrderServiceIntegrationTest {
@Container
@ServiceConnection
static PostgreSQLContainer<?> postgres =
new PostgreSQLContainer<>("postgres:16");
@Test
void 주문_저장_후_조회_성공() {
// 실제 DB 연결로 동작하는 통합 테스트
}
}
@ServiceConnection 하나로 컨테이너 포트와 DataSource 설정을 자동으로 연결해주기 때문에, 기존처럼 @DynamicPropertySource로 포트를 수동 바인딩하는 보일러플레이트 코드가 사라진다. H2 같은 인메모리 DB 대신 실제 운영 DB 엔진을 테스트에 활용할 수 있어, 방언(dialect) 차이로 인한 숨은 버그를 사전에 차단할 수 있다.
Paketo Buildpacks과 Spring Boot 플러그인의 역할
에피소드에서는 Paketo Buildpacks도 함께 다룬다. Spring Boot Maven/Gradle 플러그인의 bootBuildImage 태스크는 내부적으로 Paketo Buildpacks를 활용해 Dockerfile 없이도 프로덕션 수준의 OCI 이미지를 생성한다. JVM 튜닝, 레이어 캐싱, 메모리 계산기 등이 기본 탑재되어 있어 직접 Dockerfile을 관리하는 것보다 보안 패치나 JDK 업그레이드 대응이 수월하다. CI/CD 파이프라인에서 이미지 빌드 단계를 표준화하려는 팀에게 특히 유용한 선택지다.
정리
- Spring Boot의 Docker Compose 자동 통합으로 로컬 개발 환경 설정 비용과 팀 간 환경 불일치를 구조적으로 줄일 수 있다.
@ServiceConnection을 활용한 Testcontainers 통합은 실제 DB 엔진 기반의 신뢰도 높은 통합 테스트를 간결하게 작성하게 해준다.- Paketo Buildpacks 기반
bootBuildImage는 Dockerfile 없이 표준화된 프로덕션 이미지 빌드를 가능하게 하며, 운영 유지보수 부담을 낮춘다.