YAML

2022년 4월 21일 수정

YAML은 데이터를 표현하기 위한 특수한 언어다. JSON과 비슷하게 생각할 수도 있지만 표현 방법이 좀 더 간결한 편이다.

YAML이라는 이름은 뭔가의 약자 같은데 큰의미를 가지는 것 같지 않아서 굳이 적지 않아도 될 것 같다.

언어 자체는 들여쓰기 기반이라 Python을 연상시킬 수 있다. 그리고 JSON의 모습과 비슷한 부분도 있어 보이지만, 리스트를 표현하는 방법에서 색다르기도 하다.

대충 치트시트

자주 쓰는 문법만 하나로 모아보면 이런 형태다.

# comment line
name: value
some name: some value
foo: "some string with double-quotes"
bar: 'some string with single-quotes'
bool1: true
bool2: false
bool3: yes
bool4: no

list1: [1, 2, 3]

list2:
  - 1
  - 2
  - 3

list-strings: ["foo", "bar", "string"]

simple-dict: {item1: "a", item2: "b"}
dict:
  item1: "string"
  item2: 0123      # Octet Value
  item3:
    - subdict1-item1: 1
      subdict1-item2: 2
    - subdict2-item1: 3
      subdict2-item2: 4

multiline-string: |
  line1
  line2
  line3

singleline-string: >
  this is
  not multi-line string,
  just single line

사전형(Dictionary)

기본적으로 모든 항목이 Dictionary 형태로 되어있다. 즉 key: value 와 같은 형식의 데이터가 이어진다. 그리고 하위 아이템들은 들여쓰기로 구분한다.

그 외에 simple-dict 처럼 {...} 로 감싸서 표현하는 익숙한(?) 방법이 있다.

이진 값(Boolean Value)

위에서 bool 로 시작하는 아이템이 있는데 말 그대로 이진 값을 표현하기 위한 아이템이다. 그리고 이렇게 Boolean을 표현하는 방법이 다양하다. 이 외에도 여러 방식이 있다.

bool5: y
bool6: n
bool6: on
bool7: off

심지어 첫 문자만 대문자거나 전체가 대문자인 경우도 Boolean으로 인식한다.

리스트(List)

리스트 형태일 경우 [...] 로 감싸거나 혹은 리스트의 각 아이템이 - 로 시작된다.

list1: [1, 2, 3]
list2:
  - 1
  - 2
  - 3

여기서 list1과 list2가 가지는 아이템은 동일하다.

사전형의 리스트

위의 item3 를 표현하는 과정에서 처럼 리스트 아이템을 표시하는 - 를 해석하는 것 때문에 골치아플 수도 있다.

item3:
  - subdict1-item1: 1
    subdict1-item2: 2
  - subdict2-item1: 3
    subdict2-item2: 4

위의 표현을 JSON으로 표현하자면 아래와 같다.

"item3": [
  {
    "subdict1-item1": 1,
    "subdict1-item2": 2
  },
  {
    "subdict2-item1": 3,
    "subdict2-item2": 4
  }
]

이 문제는 익숙해지는 수밖에 없다. 개인적으로 이것 때문에 YAML을 좀 싫어하는 편이다. JSON이 써야 할 문자는 더 많겠지만 이런 면에선 단순명확한 것 같다.

문자열(String)

일반적으로 모든 값은 문자열이라고 생각하자. 다만 정수로 구성된 경우 숫자로 해석된다. 명확하게 하고자 한다면 '...'"..." 로 표기할 수도 있지만 딱히 없어도 상관은 없다.

긴 문자열의 표현의 위 예에서 |> 로 표현하는 멀티 라인 문자열이나 한 줄 문자열 나눠서 표기하는 방법 등이 종종 사용되기도 한다.

수치 표현 시 주의사항

숫자를 표현할 때 조심해야 할 점이 있는데 - 아 물로 이는 YAML 자체의 버전 변경이나 해석 엔진의 변경으로 바뀔 수도 있겠지만 - 0 으로 시작하는 숫자는 8진수로 해석이 된다. 이거 때문에 얼마나 고생했는지 표현할 수가 없어서 여기다 따로 정리해 놓을 정도로 주의해야 할지도 모른다.

그런데 0 으로 시작하는 10진수 정수는 좀 이상하긴 하다. 전화번호 같은 것을 표현하고자 한다면 "..." 처럼 명확하게 문자열로 구분해주는 편이 좋다.

하여간 이 문제도 YAML을 싫어하게 만든 주범 중 하나다.