[Spring Boot] 외부설정1 - Application.properties

Junseo Kim·2020년 2월 5일
10

외부 설정 파일 이란?

애플리케이션에서 사용하는 여러가지 설정 값들을 애플리케이션의 밖이나 안에 정의할 수 있는 기능을 말한다.

application.properties

이 파일은 스프링부트가 애플리케이션을 구동할 때 자동으로 로딩하는 파일이다.
key - value 형식으로 값을 정의하면 애플리케이션에서 참조하여 사용할 수 있다.

값을 참조할 때는 여러가지 방법이 있다. @Value 어노테이션으로 값을 받아올 수도 있다.

프로퍼티 random 값 사용

application.properties에 ${random.무엇}으로 랜덤 값을 줄 수도 있다.

프로퍼티 place holder

application.properties에 정의해준 값을 변수를 사용하듯이 그대로 사용할 수도 있다.

프로퍼티 우선순위

프로퍼티를 설정할 수 있는 방법은 매우 다양하다. 따라서 각 방법마다 우선순위가 있다. 여러 방법으로 같은 프로퍼티를 정의하고 있으면 우선순위가 제일 높은 방법으로 정의한 프로퍼티 값이 오버라이딩된다.

우선순위는 아래와 같다.
1. 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties

  1. 테스트에 있는 @TestPropertySource

  2. @SpringBootTest 애노테이션의 properties 애트리뷰트

  3. 커맨드 라인 아규먼트

  4. SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로티) 에 들어있는 프로퍼티

  5. ServletConfig 파라미터

  6. ServletContext 파라미터

  7. java:comp/env JNDI 애트리뷰트

  8. System.getProperties() 자바 시스템 프로퍼티

  9. OS 환경 변수

  10. RandomValuePropertySource

  11. JAR 밖에 있는 특정 프로파일용 application properties

  12. JAR 안에 있는 특정 프로파일용 application properties

  13. JAR 밖에 있는 application properties

  14. JAR 안에 있는 application properties

  15. @PropertySource

  16. 기본 프로퍼티 (SpringApplication.setDefaultProperties)

resources - application.properties는 15번 순위이다.

우선 순위가 높은 test에서 프로퍼티를 설정해보겠다.

test 디렉토리 밑에 java에 클래스를 만들고 @SpringBootTest, @RunWith(SpringRunner.class) 어노테이션을 붙여준다.

@Test 어노테이션을 붙여 메서드를 하나 만들어준다.

모든 프로퍼티들을 기본적으로 Environment를 통해서 확인할 수 있다. 따라서 Environment를 주입받아 getProperty로 프로퍼티를 받아온다.

그리고 test 디렉토리에 resources 디렉토리를 만들고 project structure에서 Modules 부분에서 만들어준 resources를 Test Resources로 바꿔준다.

그 후, 하위에 application.properties를 만들어준다. 그리고, 프로퍼티의 키는 그대로두고, 값을 바꿔준다.

그 후 테스트 파일을 돌려보면 우선순위가 높은 테스트파일의 프로퍼티가 출력된다.

테스트코드를 실행하면, 먼저 테스트코드가 빌드가 되고, 빌드를 할 때, src를 전부 빌드하여 classpath에 놓는다. 그 다음에 테스트코드를 빌드하여 classpath에 놓는다. 그 때, application.properties가 바뀌는 원리이다.

그렇기 때문에 만약 main의 application.properties에 정의되어 있는 값이 있고, test의 application.properties에는 그 값이 없으면 테스트가 깨진다. 실행 시 application.properties가 테스트 것으로 덮어쓰여지기 때문이다. 그래서 버그가 안나게 하기 위해서는 test의 것에도 똑같은 key값을 넣어줘야한다.

@TestPropertySource라는 어노테이션을 사용해서도 프로퍼티를 정해줄 수 있다. 우선순위가 2순위인 방법이다.

만약 설정해주고 싶은 프로퍼티 값이 여러개일 경우 .properties 파일을 만들어 적용해 줄 수도 있다.

classpath 기준으로 만들어준 파일의 위치를 적어준다.

application.properties의 우선순위

application.properties를 같은 위치가 아니라 다른 위치에 둘 경우는 컴파일해도 덮어쓰지 않게된다.

이 때 우선순위는 아래와 같다.
1. file:./config/ :프로젝트 디렉토리 바로 아래에 config라는 디렉토리를 만들고 그 안에 application.properties 만들어주는 방법

  1. file:./ :프로젝트 루트 바로 아래에 application.properties 만들어주는 방법

  2. classpath:/config/ :classpath 아래에 config라는 디렉토리를 만들고 그 안에 application.properties 만들어주는 방법

  3. classpath:/ :classpath 아래에 application.properties 만들어주는 방법

1개의 댓글

comment-user-thumbnail
2022년 5월 20일

좋은 내용 잘 보고 갑니다
감사합니다.

답글 달기