[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=프로필" 넘겨 어플리케이션을 실행시키면 활성화한 프로필의 설정 파일을 읽어 오게 된다. 

etc-image-0

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

 

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

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

 

application-"프로필".properties

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

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

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

etc-image-1
etc-image-2

 


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

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