스프링 부트(핵심 원리와 활용)

Ch05. 외부설정과 프로필(1) - 우선순위(전체)

webmaster 2023. 3. 15. 00:23
728x90
 

Core Features

Spring Boot lets you externalize your configuration so that you can work with the same application code in different environments. You can use a variety of external configuration sources including Java properties files, YAML files, environment variables, a

docs.spring.io

자주 사용하는 우선순위(아래로 갈수록 높다)

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

설정 데이터는 프로젝트와 같이 배포가 되기 때문에 우선순위가 가장 낮다(유연하지 x)
OS 환경 변수 -> 자바 시스템 속성 -> 커맨드 라인 옵션 인수 = 범위가 좁을수록 높은 우선순위를 가지게 되는데, OS 환경 변수가 가장 넓고, 커맨드 라인 옵션인수가 가장 좁다

 

Core Features

Spring Boot lets you externalize your configuration so that you can work with the same application code in different environments. You can use a variety of external configuration sources including Java properties files, YAML files, environment variables, a

docs.spring.io

  • jar 내부 application.properties
  • jar 내부 프로필 적용 파일 application-{profile}.properties
  • jar 외부 application.properties
  • jar 외부 프로필 적용 파일 application-{profile}.properties

우선순위 이해 방법

우선순위는 상식 선에서 딱 2가지만 생각하면 된다

  • 더 유연한 것이 우선권을 가진다. (변경하기 어려운 파일 보다 실행시 원하는 값을 줄 수 있는 자바 시스템 속성이 더 우선권을 가진다.)
  • 범위가 넒은 것 보다 좁은 것이 우선권을 가진다.
    • OS 환경변수 보다 자바 시스템 속성이 우선권이 있다.
    • 자바 시스템 속성 보다 커맨드 라인 옵션 인수가 우선권이 있다.

추가 또는 변경되는 방식

Environment를 통해서 조회하는 관점에서 보면 외부 설정값들은 계속 추가되거나 기존 값을 덮어서 변경하는 것처럼 보인다.
물론 실제 값을 덮어서 변경하는 것은 아니고, 우선순위가 높은 값이 조회되는 것이다. 그런데 이렇게 이해하면 개념적으로 더 쉽게 이해할 수 있다.

예제 1)

application.properties

  url=local.db.com

자바 시스템 속성 추가

-Dusername=local_user

조회  결과

url=local.db.com
username=local_user
  • 자바 시스템 속성에서 기존에 없던 키 값을 추가했기 때문에 속성이 추가되었다.

예제 2)

커맨드 라인 옵션 인수 추가

--url=dev.db.com

조회  결과

url=dev.db.com
username=local_user
  • 커맨드라인옵션인수는기존에있던 url이라는 키 값을 사용했기 때문에 기존에 있던 값이 새로운 값으로 변경되었다.

정리

이렇게 우선순위에 따라서 설정을 추가하거나 변경하는 방식은 상당히 편리하면서도 유연한 구조를 만들어준다.
실무에서 대부분의 개발자들은 applicaiton.properties 에 외부 설정값들을 보관한다.
이렇게 설정 데이터를 기본으로 사용하다가 일부 속성을 변경할 필요가 있다면 더 높은 우선순위를 가지는 자바 시스템 속성이나 커맨드 라인 옵션 인수를 사용하면 되는 것이다.

또는 기본적으로 application.properties를 jar 내부에 내장하고 있다가, 특별한 환경에서는 application.properties를 외부 파일로 새로 만들고 변경하고 싶은 일부 속성만 입력해서 변경하는 것도 가능하다

728x90