[Spring] 배포 환경 별로 설정파일 분리하기 (프로필)

개발환경과 운영환경의 설정 분리

하나의 애플리케이션을 여러 다른 환경에서 사용해야 할 때가 있다.

예를 들어 개발환경과 운영환경이 필요할 경우 어플리케이션이 개발환경 DB에 접근하는 설정 정보와, 운영환경 DB에 접근하는 설정 정보가 다르다.

 

이를 해결 하기 위한 방법으로

하나의 내부 설정 파일 "application.properties"에서 스프링이 지원하는 "프로필"으로 각 환경 별 설정을 작성하여 관리 할 수 있다.

 

application.properties
spring.config.activate.on-profile=dev
url=dev.db.com
my_username=dev_user
password=dev_pw
#---
spring.config.activate.on-profile=prod
url=prod.db.com
my_username=prod_user
password=prod_pw

 

위 처럼 spring.config.activate.on-profile="프로필이름" 으로 설정을 하면 그 밑에 설정 값들은 key=value 형태로

그 프로필에 해당되는 설정 값으로 세팅된다.

( #--- 는 구분 기호를 뜻한다. )

 

주의사항

아래의 규칙을 지키지 않을 시에는 문서가 정상적으로 읽히지 않을 수 있다.

  • 구분 기호 #---  바로 위에는 공백이 없어야 하며 정확히 3개의 하이픈 문자가 있어야 한다.
  • 구분 기호  #--- 주석 위 아래는 주석을 적으면 안된다.

 

어플리케이션 실행 인수로 "--Dspring.profiles.active=프로필" 넘겨 어플리케이션을 실행시키면 활성화한 프로필의 설정 파일을 읽어 오게 된다. 

"--Dspring.profiles.active=dev"로 실행할 시  dev 프로필이 활성화 되면서 dev 하위 설정 데이터가 사용.
"--Dspring.profiles.active=prod"로 실행할 시 prod 프로필이 활성화 되면서  prod하위 설정 데이터가 사용.

 

만약 빌드된 Jar 파일을 프로필 옵션을 넘겨 실행할 경우에는 다음과 같이 실행하면 된다.

java -jar "빌드된 Jar 파일명" --spring.profiles.active=dev

 

application-"프로필".properties

스프링은 프로필에 따라서 위와 같은 규칙으로 해당 프로필에 맞는 내부 파일(설정 데이터)을 조회한다.

이 방식으로 프로필 설정 파일을 따로 만들어 관리할 수 도 있다.

하지만 설정 값이 한눈에 들어오지 않는 단점이 있다.

 


application.properties 우선순위

프로필 옵션을 지정하지 않고 실행하면 스프링은 기본으로 default 라는 이름의 프로필을 사용한다.

만약 default 프로필을 작성하지 않고 프로필을 옵션을 지정하지 않고 실행한다면 값은 null이 된다.

 

아래의 코드에서 맨 위에 프로필을 지정하지 않고 작성된 값 "defalut" 프로필이 된다.

url=local.db.com
username=local_user
password=local_pw
#---
spring.config.activate.on-profile=dev
url=dev.db.com
username=dev_user
password=dev_pw
#---
spring.config.activate.on-profile=prod
url=prod.db.com
username=prod_user
password=prod_pw

스프링은 문서를 위에서 아래로 순서대로 읽으면서 설정한다.

여기서 1 ~ 3번 째 줄의 값은 spring.config.activate.on-profile 와 같은 프로필 정보가 없다.

따라서 프로필과 무관하게 설정 데이터를 읽어서 사용한다.

이렇게 프로필 지정과 무관하게 사용되는 것을 default(기본값)이라 한다.

 

주의할점

스프링이 설정 파일을 위에서 아래로 순서대로 읽어서 사용할 값을 설정한다.

url=local.db.com
username=local_user
password=local_pw
#---
spring.config.activate.on-profile=dev
url=dev.db.com
username=dev_user
password=dev_pw
#---
spring.config.activate.on-profile=prod
url=prod.db.com
username=prod_user
password=prod_pw
#---
url=hello.db.com

이 설정 파일을 가지고 어플리케이션을 프로필을 설정하든 안하든 실행을 하면,

url 값은 무조건 마지막 값인 "url=hello.db.com"이 사용되게 된다.  

 

즉, 스프링은 문서를 위에서 아래로 순서대로 읽으면서 값을 설정한다. 이때 기존 데이터가 있으면 덮어쓴다.


외부 설정에 대한 우선순위

우선순위는 더 유연하고 더 자세한 것(좁은 범위)이 우선권을 갖는 것을 볼 수 있다.

만약 같은 프로필에 해당하고 기존의 키 값과 똑같은 키 값을 추가할 경우에는 더 높은 우선위에 해당하는 값이 낮은 우선순위의 값을 덮어쓴다.

 

자주 사용하는 우선순위

자주 사용하는 우선순위는 다음과 같다. (위 부터 높은 우선 순위)

  1. @TestPropertySource (테스트에서 사용)
  2. 커맨드 라인 옵션 인수
  3. 자바 시스템 속성
  4. OS 환경변수
  5. 설정 데이터( application.properties )

 

설정 데이터 우선순위

application.properties의 외부 내부 우선순위는 다음과 같다. (위 부터 높은 우선 순위)

  1. jar 외부 프로필 적용 파일 application-{profile}.properties
  2. jar 외부 application.properties
  3. jar 내부 프로필 적용 파일 application-{profile}.properties
  4. jar 내부 application.properties

참고자료 : 김영한의 스프링 부트 - 핵심원리와 활용