프로파일은 애플리케이션을 실행하는 환경(Environment)(e.g., 개발, 테스트, 운영)에 따라 서로 다른 설정을 적용할 수 있게 해주는 Spring의 강력한 기능입니다.
문제점: 개발 환경에서는 로컬 DB를 사용하고, 운영 환경에서는 실제 운영 DB를 사용해야 합니다. 이러한 환경별 설정 정보(DB 주소, 비밀번호 등)를 하나의 파일에서 관리하거나, 배포 시마다 수동으로 변경하는 것은 매우 비효율적이고 실수가 발생하기 쉽습니다.
해결책: application-{profile}.yml (또는 .properties) 형식의 파일을 사용하여 환경별 설정을 분리합니다.
application.yml: 모든 환경에서 공통으로 사용될 설정.application-dev.yml: 개발(development) 환경에서만 사용될 설정.application-prod.yml: 운영(production) 환경에서만 사용될 설정.spring.profiles.active 속성을 통해 지정합니다.application.yml에 기본값 지정:
spring:
profiles:
active: dev # 기본으로 dev 프로파일 활성화
JAR 실행 시 옵션으로 지정 (가장 일반적인 방법):
# dev 프로파일로 실행
java -jar -Dspring.profiles.active=dev my-app.jar
# prod 프로파일로 실행
java -jar -Dspring.profiles.active=prod my-app.jar
문제점: Dockerfile 하나로 소스 코드를 빌드하고, 그 결과물(JAR 파일)을 포함한 최종 이미지를 만들면, 이미지 내에 빌드 과정에서만 필요했던 불필요한 파일들(소스 코드, Gradle/Maven 캐시 등)이 그대로 남아있게 됩니다. 이로 인해 최종 이미지의 크기가 매우 커지고, 보안에 취약해집니다.
멀티 스테이지 빌드: Dockerfile 내에서 여러 개의 FROM 명령어를 사용하여, 빌드 단계를 여러 "스테이지(Stage)"로 나누는 기술입니다.
빌드 스테이지 (Build Stage):
최종 스테이지 (Final Stage):
openjdk:17-jre-slim)에서 시작합니다.COPY --from=[빌드 스테이지 이름] 명령어를 사용하여, 빌드 스테이지에서 생성된 JAR 파일만을 이 최종 스테이지로 가져옵니다.# 1. 빌드 스테이지 (as builder 라는 이름 부여)
FROM openjdk:17-jdk as builder
WORKDIR /app
COPY . .
RUN ./gradlew build
# 2. 최종 스테이지
FROM openjdk:17-jre-slim
WORKDIR /app
# builder 스테이지에서 생성된 JAR 파일만 복사
COPY --from=builder /app/build/libs/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
롤링 배포 (Rolling Update):
블루-그린 배포 (Blue-Green Deployment):
카나리 배포 (Canary Deployment):