서비스의 설정값을 변경해주었는데도, 반영이 안 되는 경우가 있다🫠
설정값들이 위치하는 설정파일의 우선순위를 공부하고, 알맞은 파일에 설정값을 변경해주자.
no | Priority | Property |
---|---|---|
1 | High | devtools 활성 상태일 때 $HOME/.config/spring-boot 디렉토리 내 devtools 전역 설정 |
2 | @TestPropertySource | |
3 | @SpringBootTest와 함께 사용된 properties | |
4 | Command Line Arguments | |
5 | SPRING_APPLICATION_JSON(환경 변수 또는 시스템 변수에 포함된 인라인 JSON) | |
6 | ServletConfig 초기화를 위한 매개변수 | |
7 | ServletContext 초기화를 위한 매개변수 | |
8 | JNDI attributes(java:comp/env) | |
9 | 자바 시스템 변수(System.getProperties()) | |
10 | OS 환경 변수 | |
11 | application.properties 파일 | |
12 | @Configuration 클래스 | |
13 | Low | 기본 속성(SpringApplication.setDefaultProperties) |
11번 application.properties(yml)
의 경우 파일 위치와 프로파일에 따른 우선순위가 적용된다.
Priority | Property Location |
---|---|
High | classpath 내부에 존재하면서 .config 디렉토리에 위치한 application.properties |
classpath 내부에 존재하면서 .config 디렉토리에 위치한 application-{profile}.properties | |
classpath 내부에 존재하는 application.properties | |
classpath 내부에 존재하는 application-{profile}.properties | |
classpath 외부에 존재하면서 config 디렉토리에 위치한 application.properties | |
classpath 외부에 존재하면서 config 디렉토리에 위치한 application-{profile}.properties | |
classpath 외부에 존재하는 application.properties | |
Low | classpath 외부에 존재하는 application-{profile}.properties |
classpath 은 보통 src/main/resources
로 설정되어있다.
spring:
config:
import: optional:/...
import 시에는 이 설정값이 최우선된다.
공식 문서에서도 외부에서 import된 값이 우선순위를 지닌다고 명시되어 있다.
Values from the imported config file
will take precedence over the file that triggered the import.
🤔 외부 설정값은 보통 config server 를 쓰는 경우가 많다. 만약 나의 로컬 서버에서 config server 있는 동일한 설정값을 덮어쓰기 하고 싶다면 어떻게 해야할까?
remote properties
에 아래 설정을 해주어야 override
가 된다.
로컬에는 백날 설정해도 설정이 먹지 않는다..🫠
spring:
cloud:
config:
allowOverride: true
overrideNone: true
override
옵션을 추가해야 로컬에서 해당값을 덮어쓰기 했을 때 동작한다.