Docker ‐ Docker에서 프로필 분리 방법 - dnwls16071/Backend_Summary GitHub Wiki

❗문제

  • 최근 아래와 같은 내용을 중점적으로 공부하기 위해 프론트엔드 개발자 1명과 실시간 상품 주문 및 주문 현황 대시보드 설계 토이 프로젝트를 진행 중에 있다.
  • 클라우드를 활용한 배포는 마지막에 하기로 합의를 보아 프론트엔드 분이 로컬에서 개발하기 용이한 구조롤 설계를 해야하는 상황이 발생했다.
  • Docker로 스프링 애플리케이션 컨테이너 1대와 PostgreSQL 컨테이너 1대를 띄우기로 했다. 이 때, 나도 로컬 환경에서 개발을 해야했기에 매번 조정을 하기 어려워 고민을 하는 와중에 Docker Profile 개념을 찾아보게 되었다.

📚 Docker Profile

  • Profiles help you adjust your Compose application for different environments or use cases by selectively activating services.
  • Services can be assigned to one or more profiles; unassigned services start/stop by default, while assigned ones only start/stop when their profile is active.
  • This setup means specific services, like those for debugging or development, to be included in a single compose.yml file and activated only as needed.

🫢해결

  • 소프트웨어 개발에서는 다양한 환경(개발, 테스트, 운영 등)에 따라 설정값을 유연하게 변경할 필요가 있다.
  • Spring은 이런 요구사항을 효과적으로 해결하기 위해 profile 기능을 제공한다.
  • @Profile 어노테이션도 활용이 가능하며 application-{profile}.yml와 같이 유연하게 분리를 해서 처리를 할 수 있었는데 나는 후자의 방법이 적합하다고 판단해서 후자로 처리했다. 테스트 코드 측에서는 @Profile 어노테이션을 사용했다.
services:
  my-app-db:
    container_name: "my-app-db"
    image: postgres
    ports:
      - "5432:5432"
    expose:
      - "5432"
    volumes:
      - "./pgdata:/var/lib/postgresql/data"
    environment:
      - "POSTGRES_DB=my-app-db"
      - "POSTGRES_USER=postgres"
      - "POSTGRES_PASSWORD=root"
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -U postgres -d my-app-db" ]
      interval: 10s
      timeout: 5s
      retries: 5

  spring-application:
    container_name: "spring-application"
    build: .
    ports:
      - "8080:8080"
    environment:
      - "SPRING_DATASOURCE_URL=jdbc:postgresql://my-app-db:5432/my-app-db"
      - "SPRING_PROFILES_ACTIVE=docker"
    depends_on:
      my-app-db:
        condition: service_healthy
    profiles:
      - "for_front"
$ docker-compose --profile for_front up -d