김찬진의 개발 블로그
24/01/02 [외부설정 - Environment, PropertySource] 본문

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
'1일1배움 > Spring (김영한 님)' 카테고리의 다른 글
24/01/01 [WAS, 서블릿 컨테이너, 스프링 컨테이너] (0) | 2024.01.01 |
---|---|
[23/09/04] 트랜잭션 하나로 묶기, 트랜잭션 하나에 참여하기(전파) (1) | 2023.09.04 |
[23/08/31] Spring 이 체크예외는 커밋, 언체크예외는 롤백하는 이유 (0) | 2023.08.31 |
[23/06/06] DispatcherServlet, HandlerMapping, HandlerAdapter, ModelAndView, ViewResolver, View, RequestMappingHandlerAdapter, ArgumentResolver, ReturnValueResolver (0) | 2023.06.06 |
[23/05/03] 서블릿 객체와 서블릿 내장 객체 (0) | 2023.05.03 |