Docker Compose Profiles를 사용하여 애플리케이션 일부를 단위 테스트하기
Source: Dev.to
번역할 텍스트가 제공되지 않았습니다. 번역이 필요한 본문을 알려주시면 한국어로 번역해 드리겠습니다.
개요
Compose 프로파일을 사용하면 서비스를 그룹화하여 특정 시나리오(예: 가벼운 테스트 vs. 전체 프로덕션)에서 스택의 일부만 시작할 수 있습니다.
docker‑compose.yml 파일에서 그룹화하려는 각 서비스에 profiles 목록을 추가합니다:
services:
postgres:
profiles: ["core"]
...
jobrunner:
profiles: ["core"]
nextjs:
profiles: ["full"]
authserver:
profiles: ["full"]
작동 방식
| Command | 시작되는 서비스 |
|---|---|
docker compose up (no --profile) | profiles 키가 없는 서비스만 시작됩니다. 위 예시에서는 기본(프로필이 없는) 서비스를 정의하지 않으면 아무 것도 시작되지 않습니다. |
docker compose --profile core up | core 프로필이 지정된 서비스(postgres, jobrunner). 경량 테스트 스택에 적합합니다. |
docker compose --profile full up | full 프로필이 지정된 서비스(nextjs, authserver). |
docker compose --profile core --profile full up | core 및 full 두 프로필이 모두 지정된 서비스. |
Tip: 서비스가 항상 실행되어야 한다면
profiles키를 생략하세요. 프로필 플래그와 관계없이 시작됩니다.
Source: …
여러 데이터베이스와 프로파일
Docker Compose는 같은 이름을 가진 여러 서비스를 허용하지 않습니다—프로파일이 다르더라도 마찬가지입니다.
프로덕션 데이터베이스와 단위 테스트용 데이터베이스가 모두 필요하다면, 고유한 서비스 이름을 부여하고 각각을 별도의 프로파일에 할당하세요:
services:
app-db:
profiles: ["prod"]
unit-test-db:
profiles: ["test"]
데이터베이스 구성 전략
- 애플리케이션 컨테이너는 한 번에 하나의
DATABASE_URL만 사용합니다. - 각 프로파일이 시작될 때 어느 데이터베이스에 연결할지 결정됩니다.
| 프로파일 | DATABASE_URL |
|---|---|
test | unit-test-db |
prod | app-db |
런타임에서 토글할 수 없습니다 – 시작 시 제공되는 환경 변수에 따라, 실행하는 프로파일이 애플리케이션이 연결할 데이터베이스를 결정합니다.
대체 접근 방식
프로파일 대신 별도의 Compose 파일을 관리할 수 있습니다:
docker-compose.test.ymldocker-compose.prod.yml
각 파일에 올바른 데이터베이스 호스트를 하드코딩할 수 있습니다. 이렇게 하면 구분이 명확해지지만 여러 파일을 유지 관리해야 합니다.
unit-test-db와 app-db를 사용한 구체적인 예시
아래는 깔끔하고 완전하게 동작하는 예시입니다.
1️⃣ docker-compose.yml
services:
# -----------------
# Databases
# -----------------
unit-test-db:
image: postgres:15
container_name: unit-test-db
profiles: ["test"]
environment:
POSTGRES_USER: test
POSTGRES_PASSWORD: test
POSTGRES_DB: testdb
ports:
- "5433:5432"
app-db:
image: postgres:15
container_name: app-db
profiles: ["prod"]
environment:
POSTGRES_USER: prod
POSTGRES_PASSWORD: prod
POSTGRES_DB: proddb
ports:
- "5432:5432"
# -----------------
# Application
# -----------------
app:
build: .
depends_on:
- unit-test-db
- app-db
environment:
DATABASE_URL: ${DATABASE_URL}
2️⃣ DATABASE_URL은 다음과 같이 설정해야 합니다
Docker 내부에서는 호스트 이름이 서비스 이름입니다.
테스트 프로필 → unit-test-db에 연결
postgresql://test:test@unit-test-db:5432/testdb
프로덕션 프로필 → app-db에 연결
postgresql://prod:prod@app-db:5432/proddb
3️⃣ 서로 다른 환경 변수 세트로 실행하기
✅ 옵션 A — 별도 .env 파일 사용 (권장)
.env.test
DATABASE_URL=postgresql://test:test@unit-test-db:5432/testdb
.env.prod
DATABASE_URL=postgresql://prod:prod@app-db:5432/proddb
테스트 스택 시작
docker compose --profile test --env-file .env.test up
프로덕션 스택 시작
docker compose --profile prod --env-file .env.prod up
✅ 옵션 B — 인라인 환경 변수 사용
테스트
DATABASE_URL=postgresql://test:test@unit-test-db:5432/testdb \
docker compose --profile test up
프로덕션
DATABASE_URL=postgresql://prod:prod@app-db:5432/proddb \
docker compose --profile prod up
4️⃣ 실제로 시작되는 서비스
docker compose --profile test up
다음만 시작합니다:
unit-test-dbapp
docker compose --profile prod up
다음만 시작합니다:
app-dbapp
깨끗한 정신 모델
| 프로파일 | DB 컨테이너 | DATABASE_URL 호스트 |
|---|---|---|
| test | unit-test-db | unit-test-db |
| prod | app-db | app-db |
Docker 네트워크 내부에서 서비스 이름이 DNS 호스트명으로 변환됩니다. 각 프로파일 실행은 다음을 정의합니다:
- 어떤 데이터베이스 컨테이너가 실행되는지
- 애플리케이션이 받는
DATABASE_URL은 무엇인지
즐거운 구성 되세요!