본문 바로가기
Programming

YAML & yaml-cpp 라이브러리 설치

by 드로니뚜벅이 2022. 9. 5.

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

 

참고사이트

 

'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