Springboot 외부 설정
Springboot 외부 설정
백기선님의 강의인 Springboot 개념과 활용 강의를 듣고 공부한 내용을 정리한 글
사용할 수 있는 외부 설정
스프링부트는 기본적으로 외부 설정을 위해 application.properties이라는 파일을 제공
또는 YAML, 환경변수, 커맨드 라인 아규먼트로 외부 설정이 가능하다.
프로퍼티 우선순위
- 홈 디렉토리에 있는 spring-boot-dev-tools.properties
- 테스트에 있는 @TestPropertySource
- @SpringBootTest 애노테이션의 properties 애트리뷰트
- 커맨드 라인 아규먼트
- SPRING_APPLICATION_JSON ( 환경 변수 또는 시스템 프로퍼티 )에 들어있는 프로퍼티
- ServletConfig 파라미터
- ServletContext 파라미터
- java:comp/env JNDI 애트리뷰트
- System.getProperties() 자바 시스템 프로퍼티
- OS 환경 변수
- RandomValuePropertySource
- JAR 밖에 있는 특정 프로파일용 application properties
- JAR 안에 있는 특정 프로파일용 application properties
- JAR 밖에 있는 application properties
- JAR 안에 있는 application properties
- @PropertySource
우리가 가장 일반적으로 사용하는 resource 폴더에 있는 applciation.properties 파일은 우선순위가 15위 임을 알 수 있다.
즉, argument가 현재 4순위이니까 argument에 applciation.properties에 존재하는 외부 설정을 덮어 쓰는 것이 가능하게 된다.
Test의 resource에 applciation.properties 파일을 추가함으로써 가능하다.
왜냐하면 테스트코드의 빌드 과정이 Source 코드 빌드 후 -> 테스트 코드 빌드의 순서이기 때문에 최종적으로 Test에 applciation.properties이 있다면 기존 applciation.properties을 덮어씌워버린다.
(물론 이것은 우선순위와는 조금은 무관한 이야기이긴 하다.)
그러나 이 과정에서 버그를 야기시킬 수 있다.
만약 기존 applciation.properties에 다음과 같이 정의되어 있다고 가정해보자.
그리고 Test의 applciation.properties가 다음과 같이 정의되어 있다면?
애플리케이션이 외부 설정을 읽어올 때 덮어씌워진 applciation.properties를 참조하기 때문에 테스트코드가 실행될 때 harry.age를 참조할 수 없어 에러가 발생하게 된다.
이러한 에러를 조심해야한다.
application.properties 우선 순위
- file:../config/
- file:../
- classpath:/config/
- classpath:/
우선순위가 높은 설정 파일이 우선순위가 낮은 파일을 덮어쓴다.
Reference
인프런 백기선님의 스프링 부트 개념과 활용