맨위로가기 타임라인 바로가기

YAML

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
타임라인 바로가기

1. 개요

YAML은 2001년 클라크 에반스 등에 의해 제안된 데이터 직렬화 형식이다. 초기에는 "Yet Another Markup Language"의 약자로 불렸으나, 이후 데이터 지향적인 목적을 강조하기 위해 "YAML Ain't Markup Language"로 변경되었다. YAML은 가독성이 좋고, 다양한 프로그래밍 언어에서 사용할 수 있으며, JSON과 유사한 구조를 가지고 있다. YAML은 JSON에 비해 주석, 확장 가능한 데이터 유형, 관계형 앵커 등 다양한 기능을 제공하지만, JSON보다 직렬화 및 역직렬화 속도가 느리다. YAML은 유의미한 공백 사용, 안전하지 않은 기본값 등으로 비판을 받기도 하며, StrictYAML 및 NestedText와 같은 대안이 존재한다.

더 읽어볼만한 페이지

  • 데이터 직렬화 포맷 - XML
    XML은 태그 중첩 방식 구문을 사용하는 범용 언어로서, 인터넷을 통한 구조화된 문서 및 데이터 공유를 용이하게 하고, 웰 폼 및 유효 XML 문서 개념을 통해 구문 정확성을 검사하며, 데이터 교환 등 다양한 분야에서 널리 사용된다.
  • 데이터 직렬화 포맷 - S-표현식
    S-표현식은 Lisp 구문에서 소스 코드와 데이터를 표현하는 기본 구조로, 원자와 `(x . y)` 형태의 표현식으로 정의되며, 이진 트리 표현, 다양한 데이터 형식 지원, 그리고 여러 분야에서 활용된다.
  • 마크업 언어 - HTML
    HTML은 웹 페이지 제작을 위한 표준 마크업 언어로서, 팀 버너스리가 제안하고 구현한 후 인터넷 발전과 함께 널리 사용되며, SGML에 기반하여 하이퍼텍스트 기능으로 다양한 콘텐츠를 표현하고 연결하며, W3C와 WHATWG에서 표준화를 진행하고 최신 버전은 HTML Living Standard이다.
  • 마크업 언어 - XAML
    XAML은 마이크로소프트에서 개발한 XML 기반의 마크업 언어로, 사용자 인터페이스, 데이터 바인딩, 이벤트 처리 등을 정의하며 WPF, Silverlight, WF, WinRT API 앱, Xamarin.Forms 등에서 UI 개발에 널리 사용된다.
YAML - [IT 관련 정보]에 관한 문서
개요
YAML 로고
YAML 로고
종류데이터 교환
개발(정보 없음)
발표일2001년 5월 11일
최신 버전1.2 (리비전 1.2.2)
최신 버전 발표일2021년 10월 1일
웹사이트YAML 공식 웹사이트
파일 확장자.yaml, .yml
기술 정보
유형 코드(정보 없음)
균일 유형 식별자public.yaml
따름(정보 없음)
매직 넘버(정보 없음)
컨테이너 형식(정보 없음)
확장 형식(정보 없음)
확장 대상 형식(정보 없음)
표준(정보 없음)
개방형
기타
마임 유형application/yaml

2. 역사 및 명칭

YAML(YAML영어, "camel"과 유사하게 발음)[4]은 2001년 클라크 에반스가 처음 제안했으며,[15] 잉기 돗 넷[16] 및 오렌 벤키키와 함께 설계했다.[16] 원래 YAML은 HTML, XML, SGML 등 프레젠테이션 및 연결을 위한 마크업 언어가 급증하던 시대에 출시되었기 때문에 ''Yet Another Markup Language''(또 다른 마크업 언어)를 의미한다고 언급되었다.[17] 초기 이름은 yet another 구문을 사용하여 마크업 언어로서의 목적을 나타내는 익살스러운 언급[18]이었지만, 이후 문서 마크업이 아닌 데이터 지향적인 목적을 강조하기 위해 ''YAML Ain't Markup Language''(YAML은 마크업 언어가 아니다)라는 재귀 약어로 용도가 변경되었다.

YAML은 텍스트 파일이기 때문에 가독성이 좋다. 그 개념은 XML, C, Python, Perl과 같은 프로그래밍 언어에서 유래되었다. YAML의 원안은 클라크 에반스[47], 브라이언 잉거슨[48], 오렌 벤키크[49]가 공동으로 제시했다.

YAML은 재귀 약어이며, 그 어원은 "YAML Ain't a Markup Language."이다. 초기에는 "Yet Another Markup Language"라고 불렸지만, 마크업보다 데이터 중심을 목적으로 했기 때문에 나중에 붙여진 이름이다. 그러나 XML(진정한 마크업 언어)이 직렬화 목적으로 빈번하게 사용되기 때문에 YAML을 경량 마크업 언어로 간주할 수도 있다. 유사한 규격으로는 JSON이 있다.

3. 버전

버전출시일
YAML 1.02004년 1월 29일
YAML 1.12005년 1월 18일
YAML 1.2.02009년 7월 21일
YAML 1.2.12009년 10월 1일
YAML 1.2.22021년 10월 1일


4. 디자인

YAML은 텍스트 파일이기 때문에 가독성이 좋다. 그 개념은 XML, C, Python, Perl과 같은 프로그래밍 언어에서 유래되었다. YAML의 원안은 클라크 에반스[47], 브라이언 잉거슨[48], 오렌 벤키크[49]가 공동으로 제시했다.

YAML은 재귀 약어이며, 그 어원은 "YAML Ain't a Markup Language."이다. 초기에는 "Yet Another Markup Language"라고 불렸지만, 마크업보다 데이터 중시를 목적으로 했기 때문에 나중에 붙여진 이름이다. 그러나 XML(진정한 마크업 언어)이 직렬화 목적으로 빈번하게 사용되기 때문에 YAML을 경량 마크업 언어로 간주할 수도 있다. 유사한 규격으로는 JSON이 있다.

YAML은 들여쓰기를 사용하여 계층 구조를 표현한다. 단, 들여쓰기에는 탭을 사용할 수 없고 스페이스만 사용할 수 있다. YAML 트리는 ''sequence''(시퀀스), ''mapping''(맵핑), ''scalar''(스칼라)의 세 가지 기본 노드로 구성된다.[50]

4. 1. 문법

YAML은 리스트, 해시, 스칼라 데이터의 조합으로 데이터를 표현하며, 가독성이 좋고 이해하기 쉬운 문법을 가지고 있다. 고급 컴퓨터 언어에 적합하며, 들여쓰기 및 XML의 특수 기호를 사용한다.

  • YAML 문자열은 출력 가능한 유니코드 문자 집합(UTF-8, UTF-16)을 사용한다.
  • 공백 문자를 이용한 들여쓰기로 구조체를 구분하며, 탭 문자는 사용하지 않는다.
  • 리스트는 하이픈('-')으로 시작하거나 대괄호('[]')와 쉼표로 요소를 구분한다.
  • 해시는 '키: 값' 형태로 표현하거나 중괄호('{}')와 쉼표로 요소를 구분한다.
  • 스칼라 값은 따옴표("")나 작은따옴표('')로 둘러쌀 수 있다.
  • 따옴표 안에서 특수 문자는 C언어 스타일(\n)로 표시한다.
  • 블록 값은 보존(|) 또는 접기(>) 지시자로 나눈다.
  • 스트림 내 문서는 하이픈 3개(---)로 나누며, 마침표 3개(...)로 스트림 끝을 나타낸다.
  • 반복 노드는 &로 표시하고 * 문자 이후 내용을 참조한다.
  • 주석은 #으로 표시하며, 한 줄 끝까지 유효하다.
  • 노드는 타입과 느낌표로 시작하는 URI 주소 지시 태그를 통해 라벨을 붙일 수 있다.
  • YAML 문서는 % 문자로 시작하는 지시자로 특정 작업을 수행한다.
  • * %YAML 지시자는 YAML 버전을 나타낸다.
  • * %TAG 지시자는 URI 주소를 나타내며, 노드 타입 태그에 사용한다.
  • YAML은 공백과 스칼라 값을 가진 리스트 구분자로 쉼표와 콜론을 사용하며, 미래 표준화를 위해 @, 엑센트 기호 ‘ 2개의 기호 문자를 예약해두고 있다.


YAML은 제어 문자를 제외한 전체 유니코드 문자 집합을 허용하며, UTF-8, UTF-16, UTF-32로 인코딩될 수 있다.[20]

  • 공백 들여쓰기는 구조를 나타내는 데 사용되지만, 탭 문자는 허용되지 않는다.[21]
  • 주석은 숫자 기호 (#)로 시작하며, 줄의 끝까지 이어진다. 주석은 다른 토큰과 공백 문자로 구분되어야 한다.[22]
  • 목록 멤버는 하이픈 (-)으로 표시하거나, 대괄호 ([...])와 쉼표로 구분하여 지정할 수 있다.
  • 연관 배열 항목은 'key: value' 형식으로 콜론 공백을 사용하여 나타내거나, 중괄호 ({...})를 이용할 수 있다.
  • * 키 앞에 물음표를 사용하여 "?key: value" 형식으로 표현할 수 있다.
  • 문자열은 큰따옴표 (") 또는 작은따옴표 (')로 묶일 수 있다.
  • * 큰따옴표 안에서는 C 스타일 이스케이프 시퀀스를 사용하여 특수 문자를 나타낼 수 있으며, 이는 백슬래시 (\)로 시작한다.
  • * 작은 따옴표 안에서는 작은 따옴표 자체를 나타내는 두 개의 작은따옴표('')가 사용 가능하다.
  • 블록 스칼라는 들여쓰기로 구분되며, 줄 바꿈을 유지(|)하거나 접기(>) 위한 수정자가 있다.
  • 단일 스트림 내의 여러 문서는 세 개의 하이픈 (---)으로 구분된다.
  • * 세 개의 마침표 (...)는 선택적으로 스트림 내의 문서를 종료한다.
  • 반복되는 노드는 처음에 앰퍼샌드 (&)로 표시되고 그 후 별표 (*)로 참조된다.
  • 노드는 두 개의 느낌표 (!!) 다음에 문자열을 사용하여 형식 또는 태그로 레이블을 지정할 수 있으며, 이는 URI로 확장될 수 있다.
  • YAML 1.1에 두 개의 지시문이 정의되어 있다.
  • * %YAML 지시문은 주어진 문서에서 YAML의 버전을 식별하는 데 사용된다.
  • * %TAG 지시문은 URI 접두사의 바로 가기로 사용된다.

들여쓰기를 사용하여 계층 구조를 표현한다. 단, 들여쓰기에는 탭을 사용할 수 없고 스페이스만 사용할 수 있다.

```yaml

  • -- # 좋아하는 영화, 블록 형식
  • 카사블랑카
  • 스펠바운드
  • 노터리어스
  • -- # 쇼핑 목록, 인라인 형식

[우유, 빵, 계란]

```

```yaml

  • -- # 블록

name: John Smith

age: 33

  • -- # 인라인

{name: John Smith, age: 33}

4. 2. 기본 구성 요소

YAML은 리스트, 해시, 스칼라 데이터의 조합으로 모든 데이터를 표현할 수 있다는 철학을 바탕으로 만들어졌다. 문법은 이해하기 쉽고 가독성이 좋도록 설계되었으며, 고급 컴퓨터 언어에 적합하다. 또한, 들여쓰기와 XML 특수 기호를 사용하여 XML과 유사한 면이 있다.

YAML의 기본 구성 요소는 다음과 같다.

  • 문자열: UTF-8 또는 UTF-16과 같은 출력 가능한 유니코드 문자 집합을 사용한다.
  • 들여쓰기: 공백 문자를 사용하여 구조체를 구분한다. 탭 문자는 들여쓰기에 사용할 수 없다.
  • 리스트:
  • 여러 줄에 작성 시: 하이픈(`-`)으로 시작하고 각 줄에 하나의 요소를 표현한다.
  • 한 줄에 작성 시: 대괄호(`[]`)를 사용하고 쉼표로 각 요소를 구분한다.

예시:

```yaml

  • -- # 좋아하는 영화 (여러 줄)
  • 카사블랑카
  • 북북서로 진로를 돌려라
  • 보이지 않는 남자

```

```yaml

  • -- # 쇼핑 목록 (한 줄)

[우유, 호박 파이, 달걀, 주스]

```

  • 해시:
  • 콜론(`:`)을 사용하여 `키: 값` 형태로 표현한다.
  • 한 줄에 하나씩 작성하거나, 중괄호(`{}`)를 사용하고 쉼표로 각 요소를 구분하여 한 줄에 모아 쓸 수 있다.

예시:

```yaml

  • -- # 들여쓰기 블록

이름: 존 스미스

나이: 33

  • -- # 인라인 블록

{이름: 존 스미스, 나이: 33}

```

  • 스칼라 값:
  • 일반적으로 아무 표시를 하지 않지만, 따옴표("")나 작은따옴표('')로 둘러쌀 수 있다.
  • 따옴표 안에서 특수 문자는 C언어 스타일(`\n`과 같은 제어 문자)로 표시한다.
  • 블록 값:
  • 보존(|) 또는 접기(>) 지시자를 사용하여 여러 줄 문자열을 표현한다.
  • 보존(|): 줄 바꿈을 유지한다.
  • 접기(>): 줄 바꿈을 공백으로 변환하고, 빈 줄은 단락 나누기로 인식한다.

예시:

```yaml

데이터: |

옛날 옛적에 이링에서 온 키 큰 남자가 있었는데

다질링으로 가는 버스를 탔네

문에는 이렇게 적혀 있었지

"바닥에 앉지 마세요"

그래서 그는 조심스럽게 천장에 앉았네

```

```yaml

데이터: >

줄 바꿈된 텍스트는

하나의

단락으로 접힐 것입니다

빈 줄은

단락 나누기를 나타냅니다.

```

  • 문서 구분 및 종료:
  • 여러 개의 문서는 하이픈 3개(`---`)로 구분한다.
  • 스트림의 끝은 마침표 3개(...)로 나타낸다.
  • 반복 노드:
  • `&`를 통해 노드를 정의하고, `*` 문자 이후의 내용을 참조하여 재사용한다.
  • 주석:
  • `#`으로 표시하며, 한 줄의 끝까지 유효하다.
  • 노드 태그:
  • 노드 타입은 느낌표(!)로 시작하는 태그를 사용하여 URI 주소로 지정할 수 있다.
  • YAML 지시자:
  • `%` 문자로 시작하는 지시자를 통해 특정 작업을 수행한다.
  • `%YAML`: 문서의 YAML 버전을 나타낸다.
  • `%TAG`: URI 주소를 나타내며, 노드 타입 태그에 사용한다.
  • 예약 문자:
  • `@`, 악센트 기호(‘)는 미래의 표준화를 위해 예약된 문자이다.


YAML은 ''sequence''(시퀀스), ''mapping''(맵핑), ''scalar''(스칼라)의 세 가지 기본 노드로 구성된다.[50]

4. 3. 고급 구성 요소

YAML은 모든 데이터를 리스트, 해시, 스칼라 데이터의 조합으로 표현할 수 있다는 생각으로 만들어졌다. 문법은 이해하기 쉽고 가독성이 좋도록 디자인되었으며, 고급 컴퓨터 언어에 적합하다. 또한 들여쓰기 및 XML의 특수기호를 사용하기 때문에, XML과 거의 비슷하다.

  • YAML 문자열은 UTF-8 또는 UTF-16과 같이 출력 가능한 유니코드 문자집합을 이용한다.
  • 공백 문자를 이용한 들여쓰기로 구조체를 구분한다. 그러나 탭 문자는 들여쓰기에 사용하지 않는다.
  • 리스트 요소는 여러 줄에 쓸 때에는 하이픈('-')으로 시작하는 한 줄에 하나의 요소를 표현하며, 한 줄에 모아 쓸 때에는 대괄호('[]')를 이용하며 쉼표로 각 요소를 구분한다.
  • 해시는 콜론 기호를 이용해서 '키:값'의 형태로 한 줄에 하나를 표현하거나, 한 줄에 모아 쓸 때에는 중괄호('{}')를 이용하며 쉼표로 각 요소를 구분한다.
  • 간단한 값(스칼라 값)은 보통 아무 표시를 하지 않으나 따옴표("")나 작은 따옴표('')를 이용해 둘러쌀 수 있다.
  • 따옴표 안에서 특수 문자는 C언어 스타일(역슬래시 키와 함께 쓰이는 제어 문자 예. \n)로 표시한다.
  • 블록 값은 보존(|) 또는 접기(>)의 선택 지시자로 나눈다.
  • 하나의 스트림에 있는 여러 개의 문서는 하이픈 3개(---)로 나누며, 마침표 세 개(...)로 스트림의 끝을 나타낸다.
  • 반복되는 노드는 기본적으로 &를 통해 나타내며, * 문자 이후의 내용을 참조한다.
  • 주석은 #으로 표시하며, 한 줄이 끝날 때까지 유효하다.
  • 노드들은 타입과 느낌표로 시작해 URI 주소를 지시하는 태그를 통해 라벨이 붙는다.
  • YAML 문서는 % 문자로 시작되는 몇 개의 지시자를 통해 특정 작업을 수행한다. YAML 1.1에서는 두 개의 지시자가 정의되어 있다.
  • %YAML 지시자는 주어진 문서의 YAML 버전을 나타내는 데 사용한다.
  • %TAG 지시자는 URI 주소를 나타내는 데 주로 사용하며, 이들 주소는 노드 타입 태그에 사용한다.


YAML은 공백과 스칼라 값을 가지고 있는 리스트 구분자를 위해 쉼표와 콜론이 필요하다. 미래의 표준화를 위해 YAML에서는 @, 악센트 기호 ‘ 2개의 기호 문자를 예약해 두고 있다. YAML을 다른 데이터 직렬화 언어의 기능과 구별하는 두 가지 특징은 구조[24]와 데이터 형식 지정이다.

YAML 구조를 사용하면 단일 파일 내에 여러 문서를 저장하고, 반복 노드에 대한 참조를 사용하며, 임의의 노드를 키로 사용할 수 있다.[24]

명확성, 간결성 및 데이터 입력 오류 방지를 위해 YAML은 노드 앵커(& 사용) 및 참조(* 사용)를 제공한다. 앵커에 대한 참조는 모든 데이터 형식에 적용된다(아래 예제에서 ship-to 참조 참조).

다음은 두 단계가 완전히 설명되지 않은 상태에서 참조되는 계측기 시퀀서의 큐의 예이다.

```yaml

  • -- # 레이저 시력 교정 수술을 위한 시퀀서 프로토콜
  • step: &id001 # 앵커 레이블 &id001 정의

instrument: Lasik 2000

pulseEnergy: 5.4

pulseDuration: 12

repetition: 1000

spotSize: 1mm

  • step: &id002

instrument: Lasik 2000

pulseEnergy: 5.0

pulseDuration: 10

repetition: 500

spotSize: 2mm

  • Instrument1: *id001 # 첫 번째 단계 참조(앵커 &id001 포함)
  • Instrument2: *id002 # 두 번째 단계 참조

```

YAML이 단순 형식을 자동으로 감지하기 때문에 대부분의 YAML 문서에서는 명시적 데이터 형식 지정을 거의 볼 수 없다. 데이터 형식은 핵심, 정의, 사용자 정의의 세 가지 범주로 나눌 수 있다. 핵심은 모든 파서에 존재할 것으로 예상되는 형식이다(예: 부동 소수점, 정수, 문자열, 목록, 맵 등). 바이너리 데이터와 같은 더 많은 고급 데이터 형식은 YAML 사양에 정의되어 있지만 모든 구현에서 지원되는 것은 아니다. 마지막으로 YAML은 사용자 정의 클래스, 구조 또는 기본형(예: 4배 정밀 부동 소수점)을 수용하기 위해 로컬에서 데이터 형식 정의를 확장하는 방법을 정의한다.

YAML은 엔티티의 데이터 형식을 자동으로 감지하지만, 때로는 데이터 형식을 명시적으로 지정하려는 경우가 있다. 가장 일반적인 상황은 숫자, 부울 또는 태그처럼 보이는 단일 단어 문자열을 따옴표로 묶거나 명시적 데이터 형식 태그를 사용하여 모호성을 제거해야 하는 경우이다.

```yaml

  • --

a: 123 # 정수

b: "123" # 문자열, 따옴표로 구분

c: 123.0 # 부동 소수점

d: !!float 123 # (!!) 접두사가 붙은 명시적 데이터 형식을 통해 부동 소수점

e: !!str 123 # 문자열, 명시적 형식으로 구분

f: !!str Yes # 명시적 형식을 통한 문자열

g: Yes # 부울 True (yaml1.1), 문자열 "Yes" (yaml1.2)

h: Yes we have No bananas # 문자열, 컨텍스트별로 "Yes" 및 "No" 구분

```

YAML의 모든 구현이 모든 사양 정의 데이터 형식을 갖는 것은 아니다. 이러한 내장 형식은 이중 느낌표 시길 접두사(!!)를 사용한다. 여기에 표시되지 않은 특히 흥미로운 것들은 집합, 정렬된 맵, 타임스탬프 및 16진수이다. 다음은 base64로 인코딩된 바이너리 데이터의 예이다.

```yaml

  • --

picture: !!binary |

R0lGODdhDQAIAIAAAAAAANn

Z2SwAAAAADQAIAAACF4SDGQ

ar3xxbJ9p0qa7R0YxwzaFME

1IAADs=

```

YAML의 많은 구현은 객체 직렬화를 위해 사용자 정의 데이터 형식을 지원할 수 있다. 로컬 데이터 형식은 보편적인 데이터 형식이 아니라 YAML 파서 라이브러리를 사용하여 애플리케이션에서 정의된다. 로컬 데이터 형식은 단일 느낌표(!)를 사용한다.

```yaml

  • --

워릭의 젊은 친구가 있었는데

그는 행복감을 느낄 이유가 있었다네

선거를 통해 그는

삼위일체 발기를 할 수 있었으니

이오니아식, 코린트식, 그리고 도리아식으로

```

```yaml

  • -- >

줄 바꿈된 텍스트

는 하나의

단락으로

병합됩니다.

빈 줄은

단락 나누기를 나타냅니다.

5. 예제

yaml


  • --

receipt: Oz-Ware 구매 송장

date: 2012-08-06

customer:

first_name: Dorothy

family_name: Gale

items:

  • part_no: A4786

descrip: 물통 (채워짐)

price: 1.47

quantity: 4

  • part_no: E1628

descrip: 하이힐 "루비" 구두

size: 8

price: 133.7

quantity: 1

bill-to: &id001

street: |

123 토네이도 앨리

Suite 16

city: East Centerville

state: KS

ship-to: *id001

specialDelivery: >

노란 벽돌 길을 따라

에메랄드 시티로 가세요.

커튼 뒤에 있는

사람에게는 신경 쓰지 마세요.

...

```

문자열은 따옴표로 묶을 필요가 없다. 들여쓰기의 정확한 공백 수는 평행 요소가 동일한 왼쪽 정렬을 갖고 계층적으로 중첩된 요소가 더 들여쓰기되어 있는 한 중요하지 않다. 이 샘플 문서는 7개의 최상위 키가 있는 연관 배열을 정의한다. 키 중 하나인 "items"는 2개의 요소 목록을 포함하며, 각 요소는 서로 다른 키를 가진 연관 배열 자체이다. 관계형 데이터 및 중복 제거가 표시된다. "ship-to" 연관 배열 내용은 앵커(`&`) 및 참조(`*`) 레이블로 표시된 대로 "bill-to" 연관 배열 내용에서 복사된다. 가독성을 위해 선택적으로 빈 줄을 추가할 수 있다. 여러 문서는 단일 파일/스트림에 존재할 수 있으며 `---`로 구분된다. 선택적 `...`는 파일 끝에서 사용할 수 있다(파이프를 닫지 않고 스트리밍 통신에서 종료를 신호하는 데 유용).

5. 1. 리스트

YAML에서 리스트(목록)는 여러 항목을 순서대로 나열하는 데 사용된다. 리스트를 작성하는 방법은 두 가지가 있다.

  • 블록 형식: 전통적인 블록 형식에서는 하이픈과 공백(`- `)을 사용하여 목록의 새 항목을 시작한다.



  • -- # 좋아하는 영화
  • 카사블랑카
  • 북북서로 진로를 돌려라
  • 보이지 않는 남자


  • 인라인 형식: 선택적인 인라인 형식은 쉼표와 공백으로 항목을 구분하고 대괄호(`[]`)로 묶는다. 이 형식은 JSON과 유사하다.[23]



  • -- # 쇼핑 목록

[우유, 호박 파이, 달걀, 주스]



블록 형식과 인라인 형식은 함께 사용될 수 있다. 다음은 그 예시이다.


  • -- # 좋아하는 영화, 블록 형식
  • 카사블랑카
  • 스펠바운드
  • 노터리어스
  • -- # 쇼핑 목록, 인라인 형식, 또는 플로우 형식

[우유, 빵, 계란]



객체와 목록은 YAML의 중요한 구성 요소이며, 함께 사용될 수 있다. 예를 들어, 다음은 스미스 가족 구성원 각각을 키-값 객체로 나타낸 목록이다.


  • -- # 스미스 가족
  • {이름: 존 스미스, 나이: 33}
  • 이름: 메리 스미스

나이: 27

  • [이름, 나이]: [레 스미스, 4] # 키로서의 시퀀스가 지원됨



다음 예시는 성별로 사람들을 나열한 것으로, 두 개의 목록(남성, 여성)을 포함하는 키-값 객체이다.


  • -- # 성별별 사람들

남성: [존 스미스, 빌 존스]

여성:

  • 메리 스미스
  • 수잔 윌리엄스


5. 2. 해시

yaml

# 블록

name: John Smith

age: 33

  • -- # 인라인

{name: John Smith, age: 33}

```

주어진 출력물은 YAML 코드 예시를 보여주고 있으며, 위키텍스트 문법과는 관련이 적습니다. 따라서, 원본 소스 코드 자체를 그대로 유지하는 것이 가장 적절합니다. `` 태그는 허용되지 않는 문법이므로 제거했습니다.

5. 3. 블록 리터럴

|는 여러 줄의 문자열을 표현할 때 사용하며, 줄 바꿈을 유지한다.[11] 다음은 그 예시이다.


  • -- |

There was a young fellow of Warwick

Who had reason for feeling euphoric

For he could, by election

Have triune erection

Ionic, Corinthian, and Doric



>는 여러 줄의 문자열을 하나의 단락으로 묶을 때 사용하며, 줄 바꿈은 공백으로 처리된다. 빈 줄은 단락을 구분하는 역할을 한다. 다음은 그 예시이다.


  • -- >

Wrapped text

will be folded

into a single

paragraph

Blank lines denote

paragraph breaks


5. 4. 해시의 리스트, 리스트의 해시

YAML에서 해시(Hash)는 키-값 쌍의 집합을 의미하며, 리스트(List)는 순서가 있는 항목들의 나열입니다. 이 둘은 YAML에서 복잡한 자료 구조를 표현하는 데 사용됩니다.

다음은 해시의 리스트 예시입니다.

```yaml

  • {name: John Smith, age: 33}
  • name: Mary Smith

age: 27

```

이 예시는 두 개의 해시를 포함하는 리스트를 보여줍니다. 첫 번째 해시는 `name` 키에 `John Smith`, `age` 키에 `33` 값을 가집니다. 두 번째 해시는 `name` 키에 `Mary Smith`, `age` 키에 `27` 값을 가집니다.

다음은 리스트의 해시 예시입니다.

```yaml

men: [존 스미스, 빌 존스]

women:

  • 메리 스미스
  • 수잔 윌리엄스

```

이 예시는 `men`과 `women`이라는 두 개의 키를 가진 해시를 보여줍니다. `men` 키의 값은 `John Smith`와 `Bill Jones`를 포함하는 리스트입니다. `women` 키의 값은 `Mary Smith`와 `Susan Williams`를 포함하는 리스트입니다.

YAML은 중첩된 자료 구조를 표현할 수 있습니다. 즉, 해시의 리스트와 리스트의 해시를 조합하여 더 복잡한 자료 구조를 만들 수 있습니다.[23] 예를 들어, 스미스 가족 구성원 정보는 다음과 같이 표현할 수 있습니다.

```yaml

  • {이름: 존 스미스, 나이: 33}
  • 이름: 메리 스미스

나이: 27

```

성별에 따른 사람들의 목록은 다음과 같이 표현합니다.

```yaml

남성: [존 스미스, 빌 존스]

여성:

  • 메리 스미스
  • 수잔 윌리엄스

6. 구현

다음은 YAML을 사용할 수 있는 프로그래밍 언어 목록이다.

프로그래밍 언어
자바스크립트
오브젝티브-C
PHP
파이썬
루비 (YAML을 사실상의 직렬화 형식으로 이용하며, 버전 1.8 이후로부터 표준 라이브러리에 포함됨)
자바
하스켈
XML
러스트
ActionScript
C/C++
C#/.NET
Cocoa
Dart
Go (Golang)
Haskell
Java
JavaScript
Lua
Nim
OCaml
Perl
PHP (PECL 모듈 및 Symfony의 YAML 컴포넌트가 있음)
Python
Ruby (Ruby 1.8부터 표준 라이브러리에 포함)
Rust
Tcl
Vim



고정된 데이터 구조의 경우, YAML 파일은 데이터와 YAML 관련 형식을 모두 출력하는 `print` 명령어를 사용하여 간단하게 생성할 수 있다. 하지만, 가변적이거나 복잡한 계층적 데이터를 덤프하려면, 전용 YAML "이미터(emitter)"가 더 좋다. 마찬가지로, 단순한 YAML 파일(예: 키-값 쌍)은 정규 표현식으로 쉽게 파싱할 수 있다. 더 복잡하거나 가변적인 데이터 구조의 경우, 공식적인 YAML "파서(parser)"를 사용하는 것이 좋다.

YAML 이미터와 파서는 많은 인기 있는 프로그래밍 언어에서 사용할 수 있다. 대부분은 해당 언어 자체로 작성되었다. 일부는 C 라이브러리 `libyaml`의 언어 바인딩이며, 더 빠르게 실행될 수 있다. 과거에는 why the lucky stiff가 작성하고 관리하지 않게 된 `Syck`이라는 다른 C 라이브러리가 있었으나, 현재 유지보수가 이루어지지 않고 있으며, 공식 소스 번들이 없고, 웹 사이트가 해킹되었다. 따라서 권장할 수 있는 유일한 C 라이브러리는 `libyaml`이며, 이 라이브러리는 원래 Kirill Simonov가 개발했다. 2018년에 Ian Cordasco와 Ingy döt Net의 새로운 관리자에 의해 개발이 재개되었다.[39]

C++ 프로그래머는 C 라이브러리 `libyaml`과 C++ 라이브러리 `libyaml-cpp` 중에서 선택할 수 있다. 둘 다 완전히 독립적인 코드 기반과 완전히 다른 API를 가지고 있다. `libyaml-cpp` 라이브러리는 여전히 0의 주 버전 번호를 가지고 있어, API가 언제든지 변경될 수 있음을 나타낸다. 실제로 버전 0.3 이후에 변경이 있었다. 중첩된 요소에 대한 확장을 목표로 C#으로 작성된 문법 중심의 구현이 존재한다.[40]

Perl의 YAML.pm과 같은 일부 YAML 구현은 전체 파일(스트림)을 로드하고 "일괄" 파싱한다. PyYaml과 같은 다른 구현은 느긋하며, 요청 시 다음 문서를 반복한다. 문서를 독립적으로 처리할 계획이 있는 매우 큰 파일의 경우, 처리 전에 전체 파일을 인스턴스화하는 것이 부담스러울 수 있다. 따라서 YAML.pm에서는 가끔 파일을 문서로 분할하고 개별적으로 파싱해야 한다. YAML은 이 작업을 쉽게 만드는데, 줄 시작 부분에 세 개의 점이 있고 그 뒤에 공백(및 주석)이 오는 문서 종료 마커를 기준으로 분할하기만 하면 되기 때문이다. 이 마커는 내용에서는 금지된다.[41]

7. 다른 직렬화 형식과의 비교

YAML은 XML, C 언어, Python, Perl 등 여러 프로그래밍 언어의 개념을 차용했다. YAML의 원안은 클라크 에반스[47], 브라이언 잉거슨[48], 오렌 벤키크[49]가 공동으로 제시했다.

YAML은 "YAML Ain't a Markup Language."(YAML은 마크업 언어가 아니다)의 재귀 약어이다. 초기에는 "Yet Another Markup Language"(또 다른 마크업 언어)라고 불렸지만, 데이터 중심의 목적을 강조하기 위해 나중에 변경되었다. YAML은 텍스트 파일이므로 가독성이 좋다. YAML과 유사한 규격으로 JSON이 있다.

7. 1. JSON과의 비교

JSON 구문은 YAML 1.2 버전의 기반이며, YAML을 "공식적인 하위 집합으로서 JSON과 일치시키려는" 명시적인 목적으로 공표되었다.[4] 이전 버전의 YAML은 엄격하게 호환되지 않았지만,[34] 불일치는 거의 눈에 띄지 않았고, 대부분의 JSON 문서는 Syck과 같은 일부 YAML 파서에 의해 구문 분석될 수 있다.[35] 이는 JSON의 의미 구조가 YAML의 선택적인 "인라인 스타일"의 작성 방식과 동일하기 때문이다. 확장된 계층 구조는 JSON과 같이 인라인 스타일로 작성할 수 있지만, 이는 명확성을 높이는 경우를 제외하고는 권장되는 YAML 스타일이 아니다.

YAML은 JSON에 없는 주석, 확장 가능한 데이터 유형, 관계형 앵커, 따옴표 없는 문자열 및 키 순서를 유지하는 매핑 유형을 포함하여 많은 추가 기능을 가지고 있다.

간결성 때문에 JSON 직렬화 및 역직렬화는 YAML보다 훨씬 빠르다.[36][37]

7. 2. TOML과의 비교

TOML.ini 파일 형식의 발전을 위해 설계되었다. YAML은 지시 문자 사용을 최소화하여, TOML의 엄격한 따옴표 및 대괄호 요구 사항과 비교하여 유리하다는 평가를 받는다.[38] YAML의 들여쓰기 사용은 TOML의 키 및 테이블 이름에 대한 점 표기법과 대조되어 동일한 의미 구조를 전달한다. 어떤 방식이 더 읽기 쉬운 구성 파일을 만드는지에 대한 의견은 다르다.

7. 3. XML과의 비교

YAML은 XML에서 발견되는 태그 속성의 개념이 부족하다. 대신 YAML은 확장 가능한 형식 선언(객체에 대한 클래스 형식을 포함)을 가지고 있다.[47][48][49]

YAML 자체는 문서의 자체 유효성 검사를 허용하는 XML의 언어 정의 문서 스키마 설명자를 가지고 있지 않다. 그러나 YAML에 대해 외부적으로 정의된 스키마 설명자 언어(예: Doctrine, Kwalify, Rx)가 해당 역할을 수행한다. 또한 YAML 문서 자체의 YAML 언어 정의 형식 선언에서 제공하는 의미론은 간단하고 일반적인 상황에서 유효성 검사기의 필요성을 완화하는 경우가 많다. 또한, XML에서 YAML 데이터 구조를 나타내는 YAXML을 사용하면 XSLT와 같은 XML 스키마 가져오기 및 출력 메커니즘을 YAML에 적용할 수 있다.[47][48][49]

8. 비판

YAML은 순수하게 데이터 표현 언어이며 실행 가능한 명령어가 없다. 유효성 검사와 안전한 파싱은 모든 데이터 언어에서 본질적으로 가능하지만, 구현은 매우 악명 높은 함정이기 때문에 YAML에 관련된 명령 언어가 없다는 것은 상대적인 보안상의 이점이 될 수 있다.

그러나 YAML은 언어별 태그를 허용하여 해당 태그를 지원하는 파서가 임의의 로컬 객체를 생성할 수 있도록 한다. 정교한 객체 인스턴스화를 실행할 수 있는 YAML 파서는 주입 공격의 가능성을 열어둔다. 임의의 클래스 객체를 로드할 수 있는 Perl 파서는 소위 "축복받은" 값을 생성한다. 이러한 값을 사용하면 예상치 못한 동작이 발생할 수 있으며, 예를 들어 클래스가 오버로드된 연산자를 사용하는 경우 임의의 Perl 코드를 실행할 수 있다.[27]

상황은 Python 또는 Ruby 파서에서도 비슷하다. PyYAML 문서에 따르면 다음과 같다.[28]

> 신뢰할 수 없는 소스(예: 인터넷)에서 YAML 문서를 수신하는 경우 임의의 Python 객체를 구성하는 기능이 위험할 수 있습니다. 함수 `yaml.safe_load`는 이 기능을 정수 또는 목록과 같은 단순한 Python 객체로 제한합니다. [...]

>

> PyYAML을 사용하면 모든 유형의 Python 객체를 구성할 수 있습니다. `!!python/object` 태그를 사용하여 Python 클래스의 인스턴스도 구성할 수 있습니다.

참조

[1] 간행물 YAML Media Type https://datatracker.[...] Internet Engineering Task Force 2024-02-21
[2] 웹사이트 yaml https://developer.ap[...] Apple Inc 2023-05-22
[3] 웹사이트 Yet Another Markup Language (YAML) 1.0 / Working Draft https://yaml.org/spe[...] 2001-12-10
[4] 웹사이트 YAML Ain't Markup Language (YAML) Version 1.2 https://yaml.org/spe[...] 2019-05-29
[5] 웹사이트 Built-in Types — Python 3.9.6 documentation https://docs.python.[...] 2021-08-19
[6] 웹사이트 Standard built-in objects - JavaScript {{!}} MDN https://developer.mo[...] 2021-08-19
[7] 웹사이트 Built-in types (C++) https://docs.microso[...] 2021-08-17
[8] 웹사이트 The Official YAML Web Site https://yaml.org/ 2019-02-05
[9] 웹사이트 Setting up Vim for YAML editing https://www.arthurko[...] 2021-12-20
[10] 웹사이트 Yaml Mode https://www.emacswik[...] EmacsWiki 2015-06-12
[11] 웹사이트 Pretty YAML - Packages - Package Control https://packagecontr[...] Packagecontrol.io 2016-12-05
[12] 웹사이트 "yaml | Eclipse Plugins, Bundles and Products - Eclipse Marketplace" https://marketplace.[...] Marketplace.eclipse.org 2016-12-05
[13] 웹사이트 NetBeans IDE - Ruby and Ruby on Rails Development https://netbeans.org[...] Netbeans.org 2016-12-05
[14] 웹사이트 YAML Ain't Markup Language https://yaml.org/faq[...] 2006-09-24
[15] 웹사이트 YAML Draft 0.1 https://groups.yahoo[...] Yahoo! Tech groups: sml-dev 2019-03-21
[16] 웹사이트 YAML Ain't Markup Language: About https://yaml.org/abo[...] 2019-05-29
[17] 웹사이트 Yet Another Markup Language (YAML) 1.0 https://yaml.org/spe[...] 2019-05-29
[18] 웹사이트 Yet Another Markup Language (YAML) 1.0 https://stackoverflo[...] 2021-03-24
[19] 웹사이트 YAML{{nbsp}}1.1 Reference Card https://yaml.org/ref[...] 2019-05-29
[20] 웹사이트 YAML Ain't Markup Language (YAML) Version 1.2 https://yaml.org/spe[...] 2019-05-29
[21] 웹사이트 YAML specification v1.2.2 Section 6.1. Indentation Spaces https://yaml.org/spe[...] 2023-03-12
[22] 웹사이트 YAML Ain't Markup Language (YAML) Version 1.2 https://yaml.org/spe[...] 2019-05-29
[23] 웹사이트 Cloud Based Management apps http://www.jigocloud[...] 2016-09-28
[24] 웹사이트 YAML 1.2 specification of Structures https://yaml.org/spe[...] 2019-05-29
[25] 웹사이트 Extensible Markup Language (XML) 1.0 (Second Edition) http://www.w3.org/TR[...] 2015-05-27
[26] 웹사이트 Free Courses {{!}} Introduction to YAML - A hands -on course https://insidelearn.[...] 2022-08-04
[27] 웹사이트 YAML http://m.kuliah-dari[...] 2022-08-04
[28] 웹사이트 PyYAML Documentation, Loading YAML http://pyyaml.org/wi[...] 2016-09-28
[29] 웹사이트 Ain't Markup Language (YAML) Version 1.1 https://yaml.org/spe[...] 2019-05-29
[30] 웹사이트 Language-Independent Types for YAML Version 1.1 https://yaml.org/typ[...] 2019-05-29
[31] 웹사이트 YAML Ain't Markup Language (YAML) Version 1.1 https://yaml.org/spe[...] 2019-05-29
[32] 웹사이트 Ain't Markup Language (YAML) Version 1.1 https://yaml.org/spe[...] 2019-05-29
[33] 웹사이트 YAML Ain't Markup Language (YAML) Version 1.1 https://yaml.org/spe[...] 2019-05-29
[34] Webarchive https://metacpan.org[...] 2013-08-29
[35] Webarchive http://www.jigocloud[...] 2016-09-17
[36] 웹사이트 YAML vs JSON vs XML in Go https://medium.com/g[...] 2024-01-31
[37] 웹사이트 Differences Between YAML and JSON https://www.baeldung[...] 2023-03-07
[38] 웹사이트 My problem with YAML's use of whitespace https://utcc.utoront[...] 2023-10-06
[39] 메일 yaml-core@lists.sourceforge.net, mail of June 27, 2018.
[40] 웹사이트 YAML Grammar for Lexepars https://github.com/D[...] 2020-02-20
[41] 웹사이트 YAML Ain't Markup Language (YAML) Version 1.2 # 9.1.2 Document Markers https://yaml.org/spe[...] 2019-05-29
[42] 웹사이트 YAML: probably not so great after all https://arp242.net/y[...] 2019-05-16
[43] 웹사이트 That's a lot of YAML https://noyaml.com/ 2019-05-16
[44] 웹사이트 YAML sucks https://github.com/c[...] 2019-05-16
[45] 웹사이트 The Norway Problem - why StrictYAML refuses to do implicit typing and so should you https://hitchdev.com[...] 2020-06-03
[46] 웹사이트 YAML Test Matrix https://matrix.yaml.[...] 2020-04-03
[47] 문서 Clark Evans
[48] 문서 Brian Ingerson
[49] 문서 Oren Ben-Kik
[50] 인용구
[51] 인용구

관련 사건 타임라인

( 최근 20개의 뉴스만 표기 됩니다. )



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com