YAML
≡ 목차 (Table of Contents)
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을 싫어하게 만든 주범 중 하나다.