YAML
데이터를 인간이 읽기도 쉽고, 컴퓨터가 처리하기도 쉽게 만든 형식. 더 고급지게 표현하면 '인간이 읽을 수 있는 데이터 직렬화 언어'. YAML은 재귀형 약어로, YAML ain't Markup Language이다. 즉 'YAML은 마크업 언어가 아니다'라는 뜻. 요즘 재귀형 약어가 너무 남발되고 있다. XML 같은 덩치 크고 복잡한 마크업 언어가 아니란 뜻.
2001년에 클라크 에반스가 제안한 형식이다. 인간이 읽을 수 있는 데이터 직렬화 언어로는 XML이라는 표준이 있지만 덩치도 크고 쓸데 없이 길어서 가독성이 떨어지다 보니 JSON 같이 좀 더 간결한 대안들이 많이 쓰이고 있는데, YAML 역시 간결함 덕택에 여러 방면에 쓰이고 있다. 파일 확장자 역시 .yaml이다.
목표
- YAML은 사람이 쉽게 읽을 수 있다.
- YAML은 프로그래밍 언어들 사이에서 호환된다.
- YAML은 애자일 언어들의 고유 데이터 구조와 잘 맞는다.
- YAML은 제너릭 도구를 지원하기 위한 일관된 모델을 가지고 있다.
- YAML은 한 단계 만에 처리될 수 있도록 지원한다.
- YAML은 표현력과 확장성이 있다.
- YAML은 구현하고 사용하기 쉽다.
문법
- 유니코드 인코딩을 사용한다. UTF-8, UTF-16을 사용한다.
- 들여쓰기로 단계를 구분하지만 탭은 인정하지 않는다.[1]
- # 기호가 앞에 오면 주석을 뜻한다.
- 리스트의 원소는 앞에 가로줄(-)을 붙인다.
- 가로줄 세 개를 잇달아 쓰면 (---) 콘텐츠의 내용 분리를 뜻한다.
- 리스트를 시작하려면 먼저 리스트의 이름에 콜론(:)을 불이고 빈칸[2]을 하나 준다. URL 안에 들어가는 콜론과 구분하기 위해서 (https://newiki.net) 반드시 콜론 다음에 빈칸이 하나 있어어 한다.
JSON에 비하면 널리 쓰이고 있지는 않지만 JSON보다 더 간결한 형식이라서 주로 설정 파일 형식으로 많이 쓰인다. 들여쓰기를 강제한다든가 하는 특징으로 사람이 읽기도 조금 낫다.
다른 형식과 비교
데이터의 구조와 의미를 표현하기 위한 마크업 언어로 널리 쓰이는 것으로는 XML, JSON이 있다. 이중 XML은 가장 광범위한 표현이 가능하며, DTD를 통한 유효성 검증도 할 수 있다. 대신 너무 광범위한 표현력을 추구하다 보니 용량이 커지고 사람이 알아보기가 어립다. JSON은 XML보다는 훨씬 간결하여 네트워크에서 데이터를 주고받을 때 XML에 비해 용량이 줄어들며, 사람이 알아보기도 좀 더 쉽다. REST를 비롯한 많은 웹 API들은 JSON 형식을 사용하고 있으며, AJAX 역시 JSON을 사용한다.
YAML 역시 XML에 비해서 간결하기 때문에 용량이 적으며, 사람이 보고 구조나 의미를 파악하기에도 좋다. XML은 태그, JSON은 괄호와 따옴표를 사용해서 데이터 블록을 표현하지만 YAML은 일반 문서에서 사용하는 방식인, 들여쓰기와 블릿 기호를 사용하기 때문이다. 대신 줄이 바뀌면 블록이 바뀌기 때문에 한 줄로 데이터를 표현할 수 없다. 기계끼리 데이터를 주고받을 때에는 JSON을[3], 사람이 만져야 하는 설정 파일에는 YAML을 많이 쓰는 추세다. XML은 점점 쩌리 신세로 전락 중이다.
같은 데이터를 각각 XML, JSON, YAML로 표현해 보면 다음과 같다. 단, XML은 아래 예시 말고도 표현할 수 있는 방법이 아주 다양하다.
<?xml version="1.0" encoding="UTF-8" ?>
<person>
<name>John Doe</name>
<age>42</age>
<height>180</height>
<job>officeworker</job>
<hobby>hiking</hobby>
<hobby>swimming</hobby>
<family>
<father>Richard Doe</father>
<mother>Jane Doe</mother>
<wife>Clare Doe</wife>
<children>Mat Doe</children>
<children>Linda Doe</children>
</family>
</person>
{
"name": "John Doe",
"age": 42,
"height": 180,
"job": "officeworker",
"hobby": [
"hiking",
"swimming"
],
"family": {
"father": "Richard Doe",
"mother": "Jane Doe",
"wife": "Clare Doe",
"children": [
"Mat Doe",
"Linda Doe",
]
}
}
name: John Doe
age: 42
height: 180
job: officeworker
hobby:
- hiking
- swimming
family:
father: Richard Doe
mother: Jane Doe
wife: Clare Doe
children:
- Mat Doe
- Linda Doe
바깥 고리
- YAML 공식 웹사이트. 들어가 보면 알겠지만 이 페이지조차도 YAML 형식으로 만들어 놓았다.