카테고리 없음
                
              Spring boot Properties
                머룽
                 2023. 4. 23. 14:05
              
              
            
            오늘은 Spring boot properties에 대해서 이야기 해보도록 하자. 
Spring boot 에는 다양한 설정파일을 제공하고 있다. 
.properties, .yaml 파일뿐만 아니라 다른 여러방법도 존재한다. 
이것뿐만 아니라 우선순위 등 잘 사용하는 방법을 알아보도록 하자.
Random
properties에 random 함수를 사용할 수 있다. 실제로는 자주 사용하지는 않겠지만 테스트할 경우에는 유용할 수 있는 랜덤함수이다. 하지만 필자도 한번도 사용한적이 없다는.. int, long, uuid, 원하는 범위의 int 등으로 설정할 수 있다.name=${random.int}
name=${random.long}
name=${random.value}
name=${random.int(10)}
name=${random.int[1024,65536]}
RandomValuePropertySource 클래스이니 참고하길 바란다.
xml?
우리가 흔히 알고 있는.properties, .yaml 파일의 확장자뿐만 아니라 xml 파일도 설정파일로 작성할 수 있다. 그렇지만 잘 사용하지 않는 이유는 properties나 yaml이 더욱 간편해서? 아마 그런거 같은데 xml도 설정파일로도 가능하니 사용하고 싶으면 사용해도 된다.
application.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>comment</comment>
    <entry key="name">wonwoo</entry>
</properties>
wonwoo 라는 값이 들어가 있을 것이다. 
음 이것은 java의 Properties 클래스를 이용하는 거 보니까 java의 스펙인 것 같다. 더 자세한 정보들은 인터넷 또는 스펙을 찾아보면 될 것 같다.
또한 Spring boot 에서 지원해주는 것은 위와 같이 .properties, .yml, xml 이지만 만약 자신은 다른 파일, 예를들어 json 파일로 설정파일을 하고 싶다면 다음과 같이 구현만 해주면 된다.
public class JsonPropertySourceLoader extends YamlPropertySourceLoader {
    @Override
    public String[] getFileExtensions() {
        return new String[]{"json"};
    }
}
{
  "name": "blabla"
}
우선순위
Spring boot properties는 우선순위가 존재한다. 예를들어application.properties, 와 application-dev.properties 존재하는 가운데 profile을 dev로 한다면 어떻게 될까? 우선순위가 높은건 application-dev.properties 파일이 된다. 우선순위가 낮다고 해서 application.properties가 사라지는 건 아니고 application-dev.properties 파일을 먼저 읽고 그 다음에 application.properties를 읽게 된다.
applciation.properties
name=kevin
address=seoul
applcation-dev.properties
name=wonwoo
dev 파일을 읽지만 address는 dev에 존재하지 않으니 application.properties 파일에 있는 address를 읽게 된다. 우선순위가 높은게 오버라이딩되니 참고하면 되겠다.
Spring boot 에서는 classpath에 있는 properties 말고도 다른 파일들을 로드하려고 한다. 예를들어 classpath:config/ 위치에 properties가 존재해도 그 파일을 읽는다. 
기본적으로는 네 군데의 위치에서 파일을 읽는다.
- 해당 프로젝트의 루트 /config/ file:./config/
- 해당 프로젝트의 루트 file:./
- 해당 프로젝트의 클래스패스의 /config/ classpath:/config/
- 해당 프로젝트의 클래스패스 classpath:/
spring.config.location=classpath:/test/
SPRING_CONFIG_LOCATION=classpath:/test/
  참고로 spring.config.location 프로퍼티는 시스템 환경설정이나 args로 넣어야 동작한다. 왜냐하면 그 파일을 읽기 위해 바로 로드되어야 하기 떄문이다.
또한 spring.config.additional-location 속성을 통해 확장할 수 있다. spring.config.location 은 해당 파일만 읽어들이는 거라면 spring.config.additional-location은 설정한 해당 파일을 읽고 나머지 기본설정도 읽는 기능이다.
spring.config.additional-location=classpath:/additional/ 
SPRING_CONFIG_ADDITIONAL_LOCATION=classpath:/additional/
classpath:/additional/ 아래의 파일들 이다. 그리고 나머지는 기본값과 동일하다.
- classpath:/additional/
- file:./config/
- file:./
- classpath:/config/
- classpath:/
참고로 만약 classpath:/additional/ 와 file:./additional/ 같이 설정하였다면 file: 이 항상 우선순위가 높다. spring.config.location 도 동일하다. properties와 yaml 의 우선순위는 properties가 높다. 아마도 파일명으로 정렬을 하는듯 싶다.
spring.application.json
Spring boot는 설정정보를 json으로 바로 작성해서 환경설정을 할 수 있다.spring.application.json={"name":"won1"}
SPRING_APPLICATION_JSON={"name":"won1"}
spring.config.additional-location 보다 spring.application.json이 우선순위가 더 높다. 만약 additional-location과 application.json을 같이 사용했을 경우에는 spring.application.json에 작성했던 json이 먼저 환경설정에 들어가게 된다.
오늘은 이렇게 Spring boot의 properties에 대해서 살펴봤다. 우선순위가 조금 헷갈려서 다시 한번 찾아보는 계기가 되었다.