본문 바로가기
개발/Spring

스프링 부트, YAML 적용

by Kingbbode 2016. 6. 25.

 Spring Boot에서 YAML 환경변수를 지원한지가 꽤 되었는데 아직 properties를 사용하는 프로젝트가 많이 있습니다. 이것을 YAML로 꼭 변경해야 하나 하는 물음이 생겨서 관련 내용을 정리해보았습니다.


YAML이란?

 


 XML, C, 파이썬, 펄, RFC2822에서 정의된 e-mail 양식에서 개념을 얻어 만들어진 '사람이 쉽게 읽을 수 있는' 데이터 직렬화 양식이라고 합니다. (WIKI 참고)

 이 양식은 JSON에 포함되며 계층적인 설정 데이터를 정의하는데 매우 편리한 문법을 가지고 있습니다. 



Spring Boot의 지원

 'spring-boot-starter'에서는 자동으로 SnakeYAML 'starter POM`'를 제공하며, SpringApplication 클래스는 클래스패스 상에 SnakeYAML라이브러리를 가지고 있다면 YAML을 지원할 수 있도록 프로퍼티스에서 자동전환합니다. 

 SnakeYAML을 통해 Spring Boot는 YAML 문서를 읽어와서 사용하는데 편의를 제공하는 두개의 클래스를 제공합니다. YamlPropertiesFactoryBean은 YAML을 Properties 처럼 읽어오고 YamlMapFactoryBean은 YAML을 Map처럼 읽어옵니다.

(Spring Docs 참고)



 properties로 사용하는 모든 설정은 yam으로 대체가 가능합니다. 

 이제부터 YAML로 대체했을 때 얻을 수 있는 이득을 알아보겠습니다.


1. 계층구조 표현에 더 적합

 계층 성격을 가지는 변수를 properties로 사용했을 때보다 더 가독도 쉬우며 작성하기도 간편합니다.


ex.yml

1
2
3
4
5
6
7
8
9
service:
    user:
        name: kingbbode
        token: abcdefg
    list:
        - movie
        - drama
        - hub
        - webtoon
cs


ex.properties

1
2
3
4
5
6
service.user.name=kingbbode
service.user.token=abcdefg
service.list[0]=movie
service.list[1]=drama
service.list[2]=hub
service.list[3]=webtoon
cs

 같은 구조를 YAML과 properties로 표현하였을 때 계층 구조를 이해하는데 YAML이 효과적인 것을 알 수 있습니다.



2. key, value Map Mapping

 properties보다 Map 구조를 더 명시적이며 간단하게 Binding 가능한 것도 큰 장점입니다. 


 a.yml

1
2
3
4
5
6
7
service:
    users:
        111:lee
        145:kwon
        843:kim
        432:jung
        234:kim        
cs


이 코드는 Spring Boot 1.4 이상에서는 동작하지 않습니다. @ConfigurationProperties에서 locations가 @Deprecated 되었습니다.ㅜㅜ

1
2
3
4
5
6
7
8
9
@Component
@ConfigurationProperties(locations = {"a.yml"}, prefix = "service")
public class Service{
    private Map<Integer, String> users = new HashMap<>();
    
    public Map<Integer, String> getUsers(){
        return this.users;
    }
}
cs


 정말 간단하게 Map 형태를 사용할 수 있습니다.!



3. 문서 중심의 구조화

 YAML은 문서를 나누는 기능('---')을 가지고 있습니다.


1
2
3
4
5
6
7
8
9
spring:
    profiles: dev
server:
    address: xxx.xxx.xxx.xxx
---
spring:
    profiles: local
server:
    address: 127.0.0.1
cs


 위와 같은 구조는 ---을 중심으로 한 yml 파일 안에서 문서가 나뉘게 됩니다. 위 설정은 profile이 dev일 때와 local일 때를 구분하여 서버 주소를 지정합니다. 이러한 특징으로 properties 구성에서 많이 볼 수 있는 profile 중심의 구성을 YAML을 사용하면 문서 중심의 구성으로 바뀔 수 있습니다.


 예를 들면 database와 server의 정보를 구성할 때 properties의 경우


application-dev.properties

1
2
server.addr=xxx.xxx.xxx.xxx
database.addr=xxx.xxx.xxx.xxx
cs


application-local.properties

1
2
server.addr=xxx.xxx.xxx.xxx
database.addr=xxx.xxx.xxx.xxx
cs


 이런 식으로 profile 위주의 구성이 편리하게 됩니다. YAML에서는 문서를 나누는 기능으로 


application.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
    profiles: dev
server:
    addr: xxx.xxx.xxx.xxx
database:
    addr: xxx.xxx.xxx.xxx
---
spring:
    profiles: local
server:
    addr: 127.0.0.1
database:
    addr: 127.0.0.1
cs


와 같이 한 파일에 적용하는 형태도 가능하지만 


server.yaml

1
2
3
4
5
6
7
8
9
spring:
    profiles: dev
server:
    addr: xxx.xxx.xxx.xxx
---
spring:
    profiles: local
server:
    addr: 127.0.0.1
cs


database.yaml

1
2
3
4
5
6
7
8
9
spring:
    profiles: dev
database:
    addr: xxx.xxx.xxx.xxx
---
spring:
    profiles: local
database:
    addr: 127.0.0.1
cs


 와 같은 문서 위주의 구성이 가능해집니다. 이렇게 좀 더 구조화되고 중복된 내용도 없어진 환경변수 구성을 할 수 있습니다. 



 이런 장점만으로 이미 잘 돌아가는 프로젝트를 수정하느냐, 다음부터 잘 적용하여 쓰느냐는 개인의 판단일 것 같습니다. 일단 알아야쓰니까 아는 것이 중요하겠죠! 저는 다음 프로젝트부터는 YAML을 좀 더 적극적으로 활용해보아야 할 것 같습니다. 조금 더 가독성있고 구조적인환경변수를 작성할 수 있을 것 같은 생각이 듭니다!

댓글