김찬진의 개발 블로그

24/01/02 [외부설정 - Environment, PropertySource] 본문

1일1배움/Spring (김영한 님)

24/01/02 [외부설정 - Environment, PropertySource]

kim chan jin 2024. 1. 2. 00:15

 

PropertySource

- 스프링은 PropertySource 라는 추상 클래스를 제공하고, 각각의 외부 설정를 조회하는 XxxPropertySource 구현체를 만들어두었다. 

- 예) CommandLinePropertySource, SystemEnvironmentPropertySource 등

- 스프링은 로딩 시점에 필요한 PropertySource 들을 생성하고, Environment 에서 사용할 수 있게 연결해둔다. 

 

Environment

- Environment 를 통해서 특정 외부 설정에 종속되지 않고, 일관성 있게 key=value 형식의 외부 설정에 접근할 수 있다.
- environment.getProperty(key) 를 통해서 값을 조회할 수 있다. Environment 는 내부에서 여러 과정을 거쳐서 PropertySource 들에 접근한다.

- 같은 값이 있을 경우를 대비해서 스프링은 미리 우선순위 정해두었다.

- 모든 외부 설정은 이제 Environment 통해서 조회하면 된다. 

 

우선순위

우선순위은 위에서 아래로 적용된다 (위 그림은 반대로 그려짐)

즉, 더 변경하기 쉬운 것, 범위가 더 좁은 것이 우선순위가 높다

스프링이 일치하는 프로필을 발견하면 기존값을 대체하는(덮어버리는) 방식을 갖기 때문이다

(실제로 덮는 건 아님. 우선순위에 의해 산출되는 방식이 그런 방식으로 구해진다는 것)

 

전체 우선순위

5. 설정 데이터 (application.properties)

4. OS 환경 변수

3. 자바 시스템 속성 (java 파일 실행할 때, java -Durl=[url명] -jar app.jar)

2. 커맨드 라인 옵션 인수 (IDE 의 edit configuration 에서, --url=[url명])

1. @TestPropertySource (테스트용)

 

내부 우선순위

4. jar 내부 (main/resources/application.properties)

3. jar 내부 프로필 적용 파일 (main/resources/application-[프로필이름].properties)

2. jar 외부 (build/libs/application.properties)

1. jar 외부 프로필 적용 파일 (build/libs/application-[프로필이름].properties)

 

기본적으로 jar 내부 application.properties 에 외부 설정값을 보관하고

외부설정을 추가해야 하는 변경상황이 발생했다면

우선순위가 높은 것(자바 시스템 속성, 커맨드 라인 옵션)을 추가하여 기존 외부설정을 수정할 필요가 없다!

 

아니면  jar 외부의 apllication.properties 에 외부 설정값을 수정하여 추가해도 된다!

 

4. jar 내부 application.properties 예시

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
Comments