Spring application.yaml 파일 분리 및 사용 방법

1 minute read

배경

Java profile에 맞는 환경 마다 동작하게 만드는 properties 파일을 다르게 설정하고 싶었습니다. 이런 환경에서 다양한 방법이 있는데 제가 생각했을 때 편한 방법을 설명해드리겠습니다.

.properties vs .yaml

둘 다 Spring에서 프로퍼티를 지정할 때 사용할 수 있어요. 밑에 간단한 예를 통해서 어떻게 작성되는지 비교해보겠습니다.

properties file

spring.port=8080
server.number[0]=5
server.number[1]=3

---
yaml file

spring:
    port: 8080

server:
    number:
        - 5
        - 3

위에 보인느 것처럼 .properties 파일 같은 경우는 지속적으로 prefix을 만들어줘야 되기 때문에 귀찮은 부분이 있습니다. 그 이후에 배열을 표현할 때도 굉장히 불편함이 있다고 생각합니다. 사람마다 편한 방법이 있고 익숙한 방법이 있지만 처음부터 .yaml을 가지고 많이 활용하다보니 저는 .yaml 파일을 가지고 properties 파일을 만들었습니다.

그리고 .yaml 파일에서만 되는 프로퍼티 선언 방식이 있다. 하나의 파일에서 여러 profile을 정의해서 사용하는 방법이다.

spring:
    profiles:
        active: local

---

spring:
    profiles: local

server:
    port:
        8080

---

spring:
    profiles: prod

server:
    port:
        80

위와 같은 방식으로 하나의 파일에서 여러 profiles을 선언하고 선택하는 방식으로 사용할 수가 있다. .properties 에서는 여러 파일을 만들어야되는데 형식은 application-{profileName}.properties 형식으로 만들고 profiles를 profileName으로 하게 되면 그 파일을 읽어서 사용한다.

방법

내가 사용한 방법은 사실 .properties를 여러 profiles 파일을 만들어서 관리하는 것과 동일한 방식이다. .yaml도 여러 파일을 만들어서 사용할 수가 있다. 사진1

위에 있는 사진처럼 profiles에 맞는 파일을 만들어서 사용할 수 있다.

그 뿐만 아니라 active 라는 키워드 사용하지 않고 실행하여도 profile에 맞도록 파일을 찾아서 읽는다. 공통적인 내용은 application.yaml에 넣어두고 사용하며 나머지 부분은 profiles에 넣어서 사용하면 됩니다.

.yaml properties 정보 읽기

@EnableConfigurationProperties({
        ServerProperties.class,
        ...,
})
@Configuration
public class ServerConfig {

}

위와 같은 방식으로 properties 파일에 대한 class를 사용하겠다고 선언을 진행한다. 그리고 밑에 같은 .yaml 파일이 있다고 했을 때 그 값을 밑와 같은 방식으로 선언해서 사용가능하다. (이것은 사람마다 취향이 다르지만 저는 한쪽에서 Enable과 관련된 것을 모두 선언하는 방식으로 하고 있습니다.)

server:
    port: 8080
    name: Hoon
    info:
        hello: true
        world: false
@ConfigurationProperties("server")
public class ServerProperties {

    private Integer port;
    private String name;
    private InfoProperties infoProperties;

    @Data
    public static class InfoProperties {
        private Boolean hello;
        private Boolean world;
    }
}

위와 같은 방법으로 prefix를 선언할 수 있고 그 밑에 존재하는 properties 값들을 가져올 수 있다. 그 뿐만 하위에 있는 것들에 대해서 static class를 만들어서 그 값을 또 가져올 수 있다.

@Component
public class PropertiesComponent {

    private final ServerProperties serverProperties;

    public PropertiesComponent (ServerProperties serverProperties) {
        this.serverProperties = serverProperties;
    }

    public print() {
        System.out.println(serverProperties.getPort());
        System.out.println(serverProperties.getName());
        System.out.println(serverProperties.getInfoProperties.getHello());
        System.out.println(serverProperties.getInfoProperties.getWorld());
    }

}

---

8080
Hoon
true
false

이런 느낌으로 사용할 수가 있습니다. 이렇게 하게 되면 원하는 .yaml 파일을 자유자제로 사용할 수 있습니다.

reference

갓대희님의 블로그

Leave a comment