-
외부 설정의 우선순위스프링/스프링부트 2023. 9. 30. 16:42
1. 설정 데이터의 우선순위
application.properties
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
위와 같은 상황에서 프로필을 설정하지 않으면 default라는 기본 프로필이 적용된다. 위의 2개의 문서는 둘 다 활성화가 되지 않으며 url, username, password를 출력해보면 다 null로 뜨게 된다.
기본값
내 PC에서 개발하는 로컬 개발 환경에서 프로필을 항상 지정하는 것은 번거롭다.
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
맨 위의 문서에 spring.config.activate.on=profile=""이 없으면 프로필과 상관 없이 사용되며 default로 들어가는 값이다.
스프링은 문서를 위에서 아래 순서대로 읽으면서 설정한다. 처음의 논리 문서는 프로필 정보가 없으므로 프로필과 무관하게 설정 데이터를 읽어서 사용하고, 프로필 지정과 무관하게 사용되는 것을 기본값이라 한다.
물론 default 값이기 때문에 프로필을 설정하면 default는 프로필로 사용하지 않고 직접 설정한 프로필을 사용한다.
-> 위에서 아래로 읽기 때문에 dev 프로파일로 설정되면 default값을 덮어버리는 것이다.
2개의 프로필을 설정한다 하더라도 dev 프로파일 문서 아래에 prod 프로파일 문서가 있기 때문에 최종적으로 url=prod.db.com ~~ 등으로 출력된다.
값을 덮어쓰는 것이기 때문에 만약에 dev 파일에는 url, username, password가 있고, prod에는 username, password가 있다면 url은 dev.db.com으로 출력된다.
2. 전체 외부 설정의 우선순위
외부 설정의 우선순위는 스프링 공식 문서에도 정의되어 있다.
하지만 너무 많은 외부 설정이 있기 때문에 자주 사용하는 외부 설정의 우선순위만 정리하면 된다.
자주 사용하는 우선순위
- 설정 데이터(application.properties)
- OS 환경변수
- 자바 시스템 속성
- 커맨드 라인 옵션 인수
- @TestPropertySource (테스트에서 사용)
설정 데이터 안에서의 우선순위- jar 내부 application.properties
- jar 내부 프로필 적용 파일 application-{profile}.properties
- jar 외부 application.properties
- jar 외부 프로필 적용 파일 application-{profile}.properties
아래로 내려갈 수록 우선순위가 높은 것이다.
우선순위는 저번에도 말했지만 2가지만 고려하면 된다.
1. 더 유연한 것이 우선권을 가진다.
-> 변경하기 어려운 파일보다 실행시 원하는 값을 줄 수 있는 자바 시스템 속성이 더 우선권을 가짐
2. 범위가 넓은 것보다 좁은 것이 우선권을 가진다.
-> 자바 시스템 속성보다 커맨드 라인 옵션 인수가 우선권이 있음
결론
실무에서 대부분은 application.properties에 외부 설정값들을 보관한다. 이렇게 설정 데이터를 기본으로 사용하다 일부 속성을 변경하고 싶다면 더 높은 우선순위를 가지는 자바 시스템 속성이나 커맨드 라인 옵션 인수를 사용하면 된다.
'스프링 > 스프링부트' 카테고리의 다른 글
@ConfigurationProperties - 외부 설정 사용 (0) 2023.09.30 @Value - 외부 설정 사용 (0) 2023.09.30 외부 설정 4 - 설정 데이터 (0) 2023.09.30 외부 설정 - 스프링 통합 (0) 2023.09.30 외부 설정 3 - 커맨드 라인 인수 (0) 2023.09.30