[SpringBoot] 배포 환경 별 설정 파일 분리 (feat. gradle)
업무를 진행하면서 다양한 배포 환경에서 설정 파일을 다르게 적용해야 하는 경우가 생깁니다. 저희 프로젝트 같은 경우 스프링 실행 시점에 설정 파일을 환경별로 분리할 수 없다는 얘기를 들어서 빌드 파일을 생성할 때부터 프로파일을 지정하는 방법을 선택하였고 해당 과정을 기록하고자 합니다.
Spring Profile
Spring Profile 은 런타임 시 지정한 profile 값에 따라 설정 파일을 로드할 수 있습니다.
- SpringBoot 에서는 기본적으로 실행 시 resources 폴더에서 application.properties(yml)을 찾아 로드합니다.
- 그 다음으로 profile 값이 있다면 application-${profile}.properties(yml) 파일을 찾아 로드합니다.
- 설정 파일 내부의 설정 값들 중 겹치는 것이 있으면 마지막에 로드한 값으로 오버라이드 됩니다.
- profile 값을 넘겨주지 않으면 기본 값은 default 입니다.
└── resources
├── application.yml
├── application-dev.yml
├── application-prd.yml
└── application-stg.yml
위와 같이 환경 별 설정 파일을 분리하고 빌드를 하게 되면 build 디렉토리 내 resources 폴더에 모든 설정 파일이 컴파일 된 것을 확인할 수 있습니다.
그리고 jar 파일 실행 시 지정한 프로파일에 따라 (-Dspring.profiles.active) 설정 파일을 로드됩니다.
# 빌드
./gradlew bootJar
# 실행
java -jar build/libs/test-0.0.1-SNAPSHOT.jar
# 프로파일 지정 실행
java -jar -Dspring.profiles.active=dev build/libs/test-0.0.1-SNAPSHOT.jar
Gradle Profile
Gradle Profile 설정을 하면 profile 값에 해당하는 설정 파일만 컴파일 됩니다.
- build.gradle 에 설정을 추가합니다.
- 기본적으로 컴파일 시 resources 디렉토리에서 리소스들을 찾지만 찾을 리소스 디렉토리를 별도로 추가해줍니다.
...
// profile의 기본값 local로 설정
ext.profile = (!project.hasProperty('profile') || !profile) ? 'local' : profile
// 리소스 디렉토리 추가
sourceSets {
main {
resources {
srcDirs "src/main/resources-env/${profile}"
}
}
}
└── resources
└── resources-env
├── dev
│ └── application.yml
├── local
│ └── application.yml
├── prd
│ └── application.yml
└── stg
└── application.yml
build.gradle 에 리소스 디렉토리를 새로 지정하고 위와 같이 설정 파일을 환경별 디렉토리에 추가해줍니다.
그리고 나서 profile을 지정하여 빌드를 진행하면 지정한 환경에 대한 설정 파일만 컴파일 되서 추가됩니다. 따라서 실행 시 별도의 profile을 지정하지 않아도 원하는 환경의 설정 파일이 지정되는 것을 확인할 수 있습니다.
# 프로파일 지정 빌드
./gradlew clean bootjar -Pprofile=dev
# 실행
java -jar build/libs/test-0.0.1-SNAPSHOT.jar
추가로 환경에 구분되지 않는 공통 설정을 하고 싶다면 다음과 같이 resources 디렉토리 하위에 application-common.yml 같은 파일을 생성하고 각 환경별 프로파일에서 include를 해주면 됩니다. (include 된 파일이 나중에 로드되기 때문에 해당 파일의 값이 적용됩니다.)
spring:
profiles:
include: common
active: dev(or local or prd)