YAML (YAML Ain't Markup Language)
- 확장자: *.yml or *.yaml
- 사람이 쉽게 읽을 수 있는 컨셉을 가진 데이터 직렬화 양식
- 유니코드 문자셋(UTF-8, UTF-16 등) 사용
- XML이나 JSON보다 읽기 쉽게 표현
YAML Sample:
apiVersion: v1
kind: Pod
metadata:
name: hello-pod
labels:
app: hello
spec:
containers:
- name: hello-container
image: tmkube/hello
ports:
- containerPort: 8000
XML vs. JSON vs. YAML
XML | JSON | YAML |
<Servers> <Servers> <name>Server1</name> <owner>John</owner> <created>123456</created> <status>active</status> </Server> </Server> |
{ Servers: [ { name: Server1, owner: John, created: 123456, status: active } } } |
Servers: - name: Server1 owner: John created: 123456 status: active |
JSON vs. YAML
구분 | JSON | YAML |
확장자 | .json | .yml, yaml |
장점 | * YAML보다 더 널리 사용됨 거의 대부분 프로그래밍 언어에서 기본 지원함 * 개행, 공백 무시됨 |
* 주석(comment) 사용 가능 * 문자열을 쌍따옴표로 감싸지 않아도 됨 * 한글 그대로 사용 가능 |
단점 | * 주석(comment) 사용 불가 * 문자열을 항상 쌍따옴표로 감싸야 함 * 한글 등 멀티바이트 문자는 인코딩되어 읽기 어려움 |
* 개행, 공백으로 블록 인식 구조적으로 공백을 잘 맞춰야 함 한글 작성 불가 |
기본 문법
문서의 시작과 끝 (Optional)
'---' : 문서의 시작, '...' : 문서의 끝
들여쓰기 (indent)
- 2칸(권장) 혹은 4칸을 지원하며 탭(TAB) 키를 사용하면 안됩니다.
- 같은 부모를 가질 경우 자식끼리는 들여쓰기가 같아야 합니다.
- 블록 내 줄바꿈을 하려며 '|'를 사용하고, '>'은 블록 내의 줄바꿈을 무시하며 '|-'와 '>-'를 붙이면 마지막 줄바꿈을 제외하고 인식합니다.
데이터 정의 (map)
- 데이터는 key: value 형식을 통해 정의합니다.
- 반드시 ':' 뒤에는 공백을 한 칸 띄워야 합니다.
- {} 로도 정의가 가능합니다.
- 데이터 자료형은 int, string, boolean을 지원합니다.
- 문자열을 따옴표 없이 사용할 수 있습니다. 단, 문자열에 ':' 문자가 들어갈 경우에는 따옴표로 감싸야 합니다.
- 숫자는 자동으로 인식하며 따옴표로 감쌀 경우에는 문자로 인식합니다.
- 쌍따옴표는 Escape 문자를 처리할 수 있고, 홑따옴표는 그대로 문자를 인식합니다.
- 쌍따옴표 내 Escape 문자('\t', '\n', ...)는 C 언어 스타일을 따릅니다.
- 참은 true 혹은 no, 거짓은 false 혹은 no
배열(array) 정의
'-'로 표시
# 방법 1
car: [
Sonata, Avante, K5, BMW
]
# 방법 2
car:
- Sonata
- Avante
- K5
- BMW
company:
category: it
name: duli
divisions:
- marketing
- hr
- r&d
주석 (comment)
'#'으로 표시
노드 반복
앵커(anchor)와 앨리어스(alias)로 반복되는 노드들에 접근할 수 있습니다. 선언할 때는 '&'를 붙여서 표시하고, 참조는 '*'를 붙입니다.
students:
first-anchor: &first
name: Choi
number: 5
second-anchor: &second
name: Jung
number: 1
first-student: *fisrt
second-student: *second
숫자 표현
# number
version: 1.2
# string
version: "1.2"
줄 바꿈
1) 마지막 줄바꿈을 포함하는 '|' 지시어
2) 마지막 줄바꿈을 제외하는 '|-' 지시어
3) 중간에 들어간 빈줄을 제외하는 '>' 지시어
주의사항
key와 value의 구분
key와 value 사이에는 반드시 빈칸이 필요하다.
# error (not key-value, string)
key:value
# o.k
key: value
문자열 따옴표
대부분의 문자열을 따옴표 없이 사용해도 무방하나, key 값에 ':'가 들어간 경우에는 반드시 따옴표가 필요하다.
'*', '-' 등이 앞에 올 때도 따옴표를 사용해야 합니다.
yaml-cpp 설치하기
https://github.com/jbeder/yaml-cpp 에서 다운로드 후 빌드하여 설치합니다.
$ git clone https://github.com/jbeder/yaml-cpp.git
$ mkdir build
$ cd build
$ cmake -DYAML_BUILD_SHARED_LIBS=on ..
$ make
$ make install
$ sudo ldconfig # /etc/ld.so.conf 파일의 내용을 다시 읽어 들임
위 명령어를 실행하면 관련 헤더파일과 라이브러니는 /usr/local에 복사됩니다.
$ ls /usr/local/lib
libyaml-cpp.so.0.7.0 libyaml-cpp.a libyaml-cpp.so libyaml-cpp.so.0.7
$ ls /usr/local/include/yaml-cpp
anchor.h depthguard.h emitterdef.h emitterstyle.h mark.h null.h stlemitter.h
binary.h dll.h emitter.h eventhandler.h node ostream_wrapper.h traits.h
contrib emitfromevents.h emittermanip.h exceptions.h noexcept.h parser.h yaml.h
그런데, 아래처럼 샘플코드를 작성한 후 컴파일을 할 때는 에러가 발생하지 않지만 실행 시 라이브러리를 찾을 수 없다는 에러가 발생합니다.
# yaml sample (server_conf.yml)
ip: "127.0.0.1"
port: 8002
users:
- name: kim
part: sw
- name: park
part: test
- name: lee
part: marketing
include <iostream>
#include "yaml-cpp/yaml.h"
using namespace std;
int main()
{
YAML::Node config = YAML::LoadFile("./server_conf.yaml");
const std::string username = config["ip"].as<std::string>();
const int port = config["port"].as<int>();
std::cout << username << ", " << port << std::endl;
return 0;
}
$ g++ yamltest.cc -o yamltest -lyaml-cpp
참고사이트
- [YAML] yaml & yaml-cpp
- jbeder/yaml-cpp github
- YAML 문법 - 쿠버네티스 안내서
- YAML Lint
- YAML 문법 정리 - winterbloom
- YAML Tutorials - w3schools.io
'Programming' 카테고리의 다른 글
Julia 프로그래밍 언어 소개 (0) | 2023.06.16 |
---|---|
프로그래밍 언어 순위 (0) | 2023.06.02 |
Lua 기본 문법 익히기 (1) (0) | 2022.11.29 |
protobuf 사용하기 (0) | 2022.05.09 |
LLVM (0) | 2022.04.11 |