티스토리 뷰
업무를 진행하면서 다양한 배포 환경에서 설정 파일을 다르게 적용해야 하는 경우가 생깁니다. 저희 프로젝트 같은 경우 스프링 실행 시점에 설정 파일을 환경별로 분리할 수 없다는 얘기를 들어서 빌드 파일을 생성할 때부터 프로파일을 지정하는 방법을 선택하였고 해당 과정을 기록하고자 합니다.
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
 
- Algorithm
 - EC2
 - 수학
 - Combination
 - 조합
 - Dynamic Programming
 - spring
 - cloudfront
 - CodePipeline
 - 소수
 - programmers
 - ionic
 - 에라토스테네스의 체
 - BFS
 - CodeDeploy
 - java
 - 순열
 - DFS
 - array
 - ECR
 - CodeCommit
 - search
 - permutation
 - sort
 - map
 - SWIFT
 - AWS
 - 프로그래머스
 - Baekjoon
 - string
 
| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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 | 
