Docker Compose Profiles를 사용하여 애플리케이션 일부를 단위 테스트하기

발행: (2026년 2월 20일 오후 06:26 GMT+9)
6 분 소요
원문: Dev.to

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 upcore 프로필이 지정된 서비스(postgres, jobrunner). 경량 테스트 스택에 적합합니다.
docker compose --profile full upfull 프로필이 지정된 서비스(nextjs, authserver).
docker compose --profile core --profile full upcore full 두 프로필이 모두 지정된 서비스.

Tip: 서비스가 항상 실행되어야 한다면 profiles 키를 생략하세요. 프로필 플래그와 관계없이 시작됩니다.

Source:

여러 데이터베이스와 프로파일

Docker Compose는 같은 이름을 가진 여러 서비스를 허용하지 않습니다—프로파일이 다르더라도 마찬가지입니다.
프로덕션 데이터베이스와 단위 테스트용 데이터베이스가 모두 필요하다면, 고유한 서비스 이름을 부여하고 각각을 별도의 프로파일에 할당하세요:

services:
  app-db:
    profiles: ["prod"]

  unit-test-db:
    profiles: ["test"]

데이터베이스 구성 전략

  • 애플리케이션 컨테이너는 한 번에 하나의 DATABASE_URL 사용합니다.
  • 각 프로파일이 시작될 때 어느 데이터베이스에 연결할지 결정됩니다.
프로파일DATABASE_URL
testunit-test-db
prodapp-db

런타임에서 토글할 수 없습니다 – 시작 시 제공되는 환경 변수에 따라, 실행하는 프로파일이 애플리케이션이 연결할 데이터베이스를 결정합니다.

대체 접근 방식

프로파일 대신 별도의 Compose 파일을 관리할 수 있습니다:

  • docker-compose.test.yml
  • docker-compose.prod.yml

각 파일에 올바른 데이터베이스 호스트를 하드코딩할 수 있습니다. 이렇게 하면 구분이 명확해지지만 여러 파일을 유지 관리해야 합니다.

unit-test-dbapp-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-db
  • app
docker compose --profile prod up

다음만 시작합니다:

  • app-db
  • app

깨끗한 정신 모델

프로파일DB 컨테이너DATABASE_URL 호스트
testunit-test-dbunit-test-db
prodapp-dbapp-db

Docker 네트워크 내부에서 서비스 이름이 DNS 호스트명으로 변환됩니다. 각 프로파일 실행은 다음을 정의합니다:

  • 어떤 데이터베이스 컨테이너가 실행되는지
  • 애플리케이션이 받는 DATABASE_URL은 무엇인지

즐거운 구성 되세요!

0 조회
Back to Blog

관련 글

더 보기 »

따뜻한 소개

소개 여러분, 안녕하세요! 여기서 진행되는 deep tech 토론에 매료되었습니다. 커뮤니티가 번창하는 모습을 보는 것은 정말 놀랍습니다. 프로젝트 개요 저는 열정적입니다...