Spring

[ SpringBoot ] Yaml 파일 포맷 과 값 읽기

구티맨 2020. 8. 24. 17:52

Spring Boot 에서 외부 설정 파일을 Yaml 파일 포맷으로 사용할 수 있습니다.

 

properties 파일 포맷도 있지만, SpringBoot에서는 가독성이 더 좋은 Yaml 파일을 권장하고 있습니다.

 

먼저 properties와 Yaml 파일 포맷에 대해 알아보겠습니다.

 

Properties 파일 포맷

properties 파일 포맷은 property 이름과 값으로 구성이 되고, 일반적으로 한줄로 명시를 합니다.

 

property 이름과 값은 = 또는 : 으로 구분을 합니다.( 통상 = 을 많이 쓰고 있습니다 )

 

그리고, 이름과 값 사이에 공백( white space )가 있으면, 이는 무시되므로 공백이 있어도 되고 없어도 무관합니다.

 

property 이름의 계층( hierarchy )은 dot( . )으로 구분합니다.

 

Yaml 파일 포맷

Yaml 파일 포맷은 사람이 읽기 쉬운 데이터 직렬화를 위한 파일 포맷입니다.

 

property에서는 dot 으로 구분된 property 값들이 많아 지면, 상대적으로 계층 관계를 한눈에 파악하기 어렵습니다.

 

대신, Yaml 에서는 공백을 이용한 들여쓰기( indentation )으로 더 가독성이 좋게 표현을 합니다.

tab 은 시스템에 따라서 다르게 취급되므로, 들여쓰기에 사용하지 않도록 합니다.

계층 표현은 공백으로 표현을 하게 되고, 이름과 값을 구분하기 위해 콜론( : ) + 공백을 사용합니다.

 

이름의 값을 정의할 떄는 반듯이 공백이 들어가야 합니다

 

아래 각 파일 포맷에 대해 작성한 파일을 보자. Yaml 파일 포맷이 들여쓰리고 가독성이 더 좋은 것을 볼 수 있습니다.

# Properties
server.name=aws
server.name.alias=was
server.port=8080

# Yaml
server:
  name: aws
  	alias: was
  port: 8080

 

Yaml 데이터 타입

아래 key, value 와 array를 표현하는 예제를 작성하였습니다.( yaml 로 정의한 파일과 이를 JSON으로 변환한 내용 입니다. )

server:
  port: 8080
  
arr: 
  [1, 2, 3]

arr2:
  - 1
  - 2
  - 3
  
nested:
  - 1
  - 2
  -
    - 5
    - 6

arr3:
  - a: 123
    b: 456
    c:
      - 789
  - d: 111
    e: 222
    f:
      - 333
      - 444
{
    "server": {
        "port": 8080
    },
    "arr": [
        1,
        2,
        3
    ],
    "arr2": [
        1,
        2,
        3
    ],
    "nested": [
        1,
        2,
        [
            5,
            6
        ]
    ],
    "arr3": [
        {
            "a": 123,
            "b": 456,
            "c": [
                789
            ]
        },
        {
            "d": 111,
            "e": 222,
            "f": [
                333,
                444
            ]
        }
    ]
}

 

Yaml  파일 읽기

val:
  text: "propValue"

val2:
  arr:
    [1, 2, 3]
  arr2:
    - 1
    - 2
    - 3
  arr3:
    - a: 123
      b: 456
      c:
        - 789
    - a: 111
      b: 222
      c:
        - 333
        - 444

 

@Value, @ConfigurationProperties 어노테이션을 사용하여 Yaml 파일을 읽는 방법을 소개드리겠습니다.

 

@Value 어노테이션

아래와 같이 yaml 파일의 값을 인자로 주어 직접 하나의 변수를 읽을 수 있습니다.

@Value("${val.text}")
private String val;

 

@ConfigurationProperties 어노테이션

prefix로 val2를 지정하여, val2의 값을 선언된 클래스에 값을 바인딩하는 방법입니다.

 

val2의 arr, arr2, arr3를 Prop의 변수에 바인딩을 하고,

 

nested array인 arr3는 nested array와 같은 구조의 클래스를 정의하였습니다.

 

바인딩이 정상적으로 되기 위해서는, 멤버 변수명이 바인딩할 key명과 같아야 합니다.

@Getter
@Setter
public class Nested{
    private Integer a;
    private Integer b;
    private ArrayList<Integer> c = new ArrayList<>();
}

@Component
@ConfigurationProperties(prefix = "val2")
@Getter
public class Prop {
    private ArrayList<Integer> arr = new ArrayList<>();
    private ArrayList<Integer> arr2 = new ArrayList<>();
    private ArrayList<Nested> arr3 = new ArrayList<>();
}


@Autowired
private Prop prop;

 

소스코드

github.com/ggamzang/spring-property

 

참조

https://docs.oracle.com/cd/E23095_01/Platform.93/ATGProgGuide/html/s0204propertiesfileformat01.html

https://yaml.org/