티스토리 뷰
업무를 진행하면서 다양한 배포 환경에서 설정 파일을 다르게 적용해야 하는 경우가 생깁니다. 저희 프로젝트 같은 경우 스프링 실행 시점에 설정 파일을 환경별로 분리할 수 없다는 얘기를 들어서 빌드 파일을 생성할 때부터 프로파일을 지정하는 방법을 선택하였고 해당 과정을 기록하고자 합니다.
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)
참고
'Spring' 카테고리의 다른 글
[EventListener] 스프링에서 이벤트 발행과 구독 (0) | 2024.03.20 |
---|---|
[MessageSource] messages.properties 를 활용한 에러 메시지 처리 (1) | 2023.11.21 |
[Spring] ObjectMapper 동작 방식 (1) | 2023.11.21 |
[Jackson DataFormat] String To LocalDateTime Serialize (0) | 2023.11.16 |
[Spring Error] SpringBoot 예외 처리 (1) | 2023.10.15 |
- Total
- Today
- Yesterday
- CodeDeploy
- cloudfront
- search
- 소수
- Algorithm
- CodeCommit
- map
- spring
- CodePipeline
- DFS
- SWIFT
- 순열
- 수학
- permutation
- string
- java
- AWS
- sort
- 프로그래머스
- Baekjoon
- programmers
- Combination
- 에라토스테네스의 체
- Dynamic Programming
- EC2
- ECR
- BFS
- 조합
- array
- ionic
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |