애플리케이션에서 사용하는 여러가지 설정 값들을 애플리케이션의 밖이나 안에 정의할 수 있는 기능을 말한다.
이 파일은 스프링부트가 애플리케이션을 구동할 때 자동으로 로딩하는 파일이다.
key - value 형식으로 값을 정의하면 애플리케이션에서 참조하여 사용할 수 있다.
값을 참조할 때는 여러가지 방법이 있다. @Value 어노테이션으로 값을 받아올 수도 있다.
application.properties에 ${random.무엇}으로 랜덤 값을 줄 수도 있다.
application.properties에 정의해준 값을 변수를 사용하듯이 그대로 사용할 수도 있다.
프로퍼티를 설정할 수 있는 방법은 매우 다양하다. 따라서 각 방법마다 우선순위가 있다. 여러 방법으로 같은 프로퍼티를 정의하고 있으면 우선순위가 제일 높은 방법으로 정의한 프로퍼티 값이 오버라이딩된다.
우선순위는 아래와 같다.
1. 유저 홈 디렉토리에 있는 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
기본 프로퍼티 (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를 같은 위치가 아니라 다른 위치에 둘 경우는 컴파일해도 덮어쓰지 않게된다.
이 때 우선순위는 아래와 같다.
1. file:./config/ :프로젝트 디렉토리 바로 아래에 config라는 디렉토리를 만들고 그 안에 application.properties 만들어주는 방법
file:./ :프로젝트 루트 바로 아래에 application.properties 만들어주는 방법
classpath:/config/ :classpath 아래에 config라는 디렉토리를 만들고 그 안에 application.properties 만들어주는 방법
classpath:/ :classpath 아래에 application.properties 만들어주는 방법
좋은 내용 잘 보고 갑니다
감사합니다.