YAML은 원래 Yet Another Markup Language
, 또 다른 마크업 언어라는 뜻을 가지고 있었으나, 마크업 언어보다는 데이터 중심이라는 것을 보여주기 위해 'YAML Ain't Markup Language' 로 바꾸었다. JSON과 유사한 부분이 많은 데이터 규격 중 하나이다.
JSON과 달리 주석을 지원한다. 데이터 직렬화할 때는 필요가 없지만, 설정 파일 등 구조화된 데이터에 설명을 덧붙일 때 유용하게 쓰인다. 샵(#
)을 사용하여 주석을 표현할 수 있다.
UTF-8만 지원하는 JSON과 달리 UTF-16도 지원한다. 그래서 YAML은 UTF-16을 사용하는 윈도우, 자바에서 만든 소프트웨어의 설정 파일로도 사용할 수 있다.
YAML이 관리하기 쉬운 또 다른 이유로 앵커와 별칭이 있다. 앵커와 별칭을 사용하여 공통으로 사용하는 값들을 한 곳에서 관리할 수 있다.
YAML 구조는 JSON과 매우 유사하다.
num: 12345
pi: 3.14
str: 문자열
null_key: ~
object:
str2: 문자열2
object2:
number2: 12345
num_array:
- 1
- 2
- 3
- 4
- 5
str_array:
- one
- two
- three
- four
- five
JSON과 차이점은 키와 값을 표현할 때 큰따옴표를 사용하지 않고, 중괄호 대신 들여쓰기를 사용한다. 배열 요소도 대괄호 대신 하이픈(-
)을 사용한다. 그리고 null 값은 물결표(~
)를 사용한다. 이렇게 사용할 수도 있지만, 주석, 앵커와 별칭을 제외하면 JSON과 완벽히 호환되기 때문에 JSON 문법처럼 표현해도 사용할 수 있다.
number: &num 12345 # 이제 이 변수는 *num으로 접근 가능.
-
object:
str2: 문자열2
object2:
number2: *num # number2 값은 number 값(12345)을 참조함.
앵커는 &
로 시작하는 식별자를 뜻하고, 별칭은 *
로 시작하는 식별자를 뜻한다. 별칭을 사용하여 어디서든 앵커로 지정된 값을 참조할 수 있다.
definitions:
default: &default
min_log_level: info
app_name: realapp
log_dir: logs
secure_mode: false
configurations:
dev: *default
qa: *default
production: *default
default 설정을 &default 앵커로 지정한 후, dev, qa, production 에서 이를 참조하고 있다. 실무에서는 보통 각 환경마다 설정이 같지 않기 때문에 별칭을 덮어쓰기 형태로 사용하여 다른 값을 사용할 수 있다.
definitions:
default: &default
min_log_level: info
app_name: realapp
log_dir: logs
secure_mode: false
configurations:
dev:
<<: *default
min_log_level: verbose
sever_url: http://dev.realapp.com
qa:
<<: *default
server_url: http://qa.realapp.com
production:
<<: *default
min_log_level: warning
secure_mode: true
server_url: http://www.realapp.com
<<:
키워드를 사용하여 앵커로 참조한 값에 더 많은 값을 추가하거나 덮어쓰기가 가능하다.