Springboot 외부 설정

Springboot 외부 설정

백기선님의 강의인 Springboot 개념과 활용 강의를 듣고 공부한 내용을 정리한 글

사용할 수 있는 외부 설정

스프링부트는 기본적으로 외부 설정을 위해 application.properties이라는 파일을 제공

또는 YAML, 환경변수, 커맨드 라인 아규먼트로 외부 설정이 가능하다.

프로퍼티 우선순위

  1. 홈 디렉토리에 있는 spring-boot-dev-tools.properties
  2. 테스트에 있는 @TestPropertySource
  3. @SpringBootTest 애노테이션의 properties 애트리뷰트
  4. 커맨드 라인 아규먼트
  5. SPRING_APPLICATION_JSON ( 환경 변수 또는 시스템 프로퍼티 )에 들어있는 프로퍼티
  6. ServletConfig 파라미터
  7. ServletContext 파라미터
  8. java:comp/env JNDI 애트리뷰트
  9. System.getProperties() 자바 시스템 프로퍼티
  10. OS 환경 변수
  11. RandomValuePropertySource
  12. JAR 밖에 있는 특정 프로파일용 application properties
  13. JAR 안에 있는 특정 프로파일용 application properties
  14. JAR 밖에 있는 application properties
  15. JAR 안에 있는 application properties
  16. @PropertySource

우리가 가장 일반적으로 사용하는 resource 폴더에 있는 applciation.properties 파일은 우선순위가 15위 임을 알 수 있다.

즉, argument가 현재 4순위이니까 argument에 applciation.properties에 존재하는 외부 설정을 덮어 쓰는 것이 가능하게 된다.

Test의 resource에 applciation.properties 파일을 추가함으로써 가능하다.

왜냐하면 테스트코드의 빌드 과정이 Source 코드 빌드 후 -> 테스트 코드 빌드의 순서이기 때문에 최종적으로 Test에 applciation.properties이 있다면 기존 applciation.properties을 덮어씌워버린다.

(물론 이것은 우선순위와는 조금은 무관한 이야기이긴 하다.)

그러나 이 과정에서 버그를 야기시킬 수 있다.

만약 기존 applciation.properties에 다음과 같이 정의되어 있다고 가정해보자.

스크린샷 2020-03-01 오후 6 43 44 스크린샷 2020-03-01 오후 6 43 52

그리고 Test의 applciation.properties가 다음과 같이 정의되어 있다면?

스크린샷 2020-03-01 오후 6 43 57

애플리케이션이 외부 설정을 읽어올 때 덮어씌워진 applciation.properties를 참조하기 때문에 테스트코드가 실행될 때 harry.age를 참조할 수 없어 에러가 발생하게 된다.

이러한 에러를 조심해야한다.

application.properties 우선 순위

  1. file:../config/
  2. file:../
  3. classpath:/config/
  4. classpath:/

우선순위가 높은 설정 파일이 우선순위가 낮은 파일을 덮어쓴다.

Reference

인프런 백기선님의 스프링 부트 개념과 활용



© 2022. by minkuk

Powered by minkuk