티스토리 뷰

업무를 진행하면서 다양한 배포 환경에서 설정 파일을 다르게 적용해야 하는 경우가 생깁니다. 저희 프로젝트 같은 경우 스프링 실행 시점에 설정 파일을 환경별로 분리할 수 없다는 얘기를 들어서 빌드 파일을 생성할 때부터 프로파일을 지정하는 방법을 선택하였고 해당 과정을 기록하고자 합니다.

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)

참고

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함