2013년 11월 25일 월요일

YAML 이란?

YAML 이란?

  • YAML Ain't Markup Language
  • YAML 은 여러 프로그래밍 언어에서 사용 가능한 가볍고 이해하기 쉬운 형태를 표방하는 '데이터 직렬화 양식' 입니다.
    (Human friendly data serialization standard)
  • 2001년 클라크 에반스가 고안 
  •  YAML은 모든 데이터를 리스트, 해쉬, 스칼라 데이터의 조합으로 적절히 표현할 수 있다는 믿음을 가지고 만들어졌다.
  •  문법은 상대적으로 이해하기 쉽고, 가독성이 좋도록 디자인되었다.

기본적인 특징

  • YAML 문자열은 UTF-8 또는 UTF-16과 같이 출력 가능한 유니코드 문자집합을 이용한다.
  • 공백 문자를 이용한 들여쓰기로 구조체를 구분한다. 그러나 탭문자를 들여쓰기에 사용하지 않는다.
    (1.2 스펙에서도 탭은 허용되지 않습니다. 시스템마다 탭을 처리하는 방법에 차이가 있기 때문이라고 합니다.)
    (-원문- tab characters must not be used in indentation, since different systems treat tabs differently. ) 
  • 주석은 #으로 표시하며, 한 줄이 끝날 때까지 유효하다.
  • 리스트 요소는 여러 줄에 쓸 때에는 하이픈(-)으로 시작하는 한 줄에 하나의 요소를 표현하며, 한 줄에 모아 쓸 때에는 대괄호([])를 이용하며 쉼표로 각 요소를 구분한다. (예제1)
  • 해쉬는 콜론 기호를 이용해서 키:값의 형태로 한 줄에 하나를 표현하거나, 한 줄에 모아 쓸 때에는 중괄호({})를 이용하며 쉼표로 각 요소를 구분한다. (예제2)
  • 간단한 값(스칼라 값)은 보통 아무 표시를 하지 않으나 따옴표("")나 작은 따옴표()를 이용해 둘러쌀 수 있다.따옴표 안에서 특수 문자는 C언어 스타일(역슬래쉬키와 함께쓰이는 제어문자 예. \n)로 표시한다.
    작은 따옴표는 값을 문자열로 처리하게 한다. 작은 따옴표를 하지 않는 경우 2013-08-15 등의 값은 datetime으로 파싱된다. (예제3)
  • 블록 값은 보존(|) 또는 접기(>)의 선택 지시자로 나눈다.
    접기(>) 와 함께 쓸 경우 블록의 뉴라인은 스페이스와 같이 처리 된다.(word wrapped) 단 공백라인과 들여쓰기가 있는 경우에는 예외로 한다. (예제4)
  • 하나의 스트림에 있는 여러 개의 문서는 하이픈 3개(---)로 나누며, 마침표 세개(...)로 스트림의 끝을 나타낸다. (예제1,2 참고)
  • 반복되는 노드는 기본적으로 &를 통해 나타내며, * 문자 이후의 내용을 참조한다. (예제5)
  • 매핑에서 키가 복수의 값으로 구성되는 경우 키 리스트의 시작을 물음표(?)로 표시한다. (예제6)
  • 노드들의 명시적인 타입의 표현은 느낌표'!' 로 시작해서 표현 할 수 있으며 어플리케이션에 특정된 값의 표현은 URI 주소로 태그를 붙일 수 있다.
    태그를 위한 URI 문자의 반복은 캐릿문자(^)를 이용해 축약 한다. (예제7)

  • YAML 문서는 % 문자로 시작되는 몇 개의 지시자를 통해 특정 작업을 수행한다. YAML 1.1에서는 두 개의 지시자가 정의되어 있다.
    •  %YAML 지시자는 주어진 문서의 YAML 버전을 나타내는 데 사용한다.
    •  %TAG 지시자는 URI 주소를 나타내는 데 주로 사용하며, 이들 주소는 노드 타입 태그에 사용한다.
  • YAML은 공백과 스칼라 값을 가지고 있는 리스트 구분자를 위해 쉼표와 콜론이 필요하다. 미래의 표준화를 위해 YAML에서는 @, 엑센트 기호 ‘ 2개의 기호 문자를 예약해두고 있다.

예제


예제1. 리스트

--- # Favorite movies, block format
- Casablanca
- Spellbound
- Notorious
--- # Shopping list, inline format
[milk, bread, eggs]

예제2. 해시

--- # Block
name: John Smith
age: 33
--- # Inline
{name: John Smith, age: 33}

예제3. 따옴표와 작은 따옴표

unicode: "Sosa did fine.\u263A"
control: "\b1998\t1999\t2000\n" hexesc: "\x13\x10 is \r\n" 

single: '"Howdy!" he cried.' 
quoted: ' # not a ''comment''.' 
tie-fighter: '|\-*-/|'

예제4. 블록 문법

뉴라인 보존 방법,
긴 세로바(|) 와 함께 쓸 경우 블록 내의 뉴라인이 보존된다. 

--- |
  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

뉴라인 접기 방법,
접기 표시(>) 와 함께 쓸 수 있으며 이때 뉴라인은 스페이스와 같이 처리 된다.(word wrapped)
단 공백라인과 들여쓰기가 있는 경우에는 예외로 한다. 

--- >
  Wrapped text
  will be folded
  into a single
  paragraph
  
  Blank lines denote
  paragraph breaks

예제5. 반복의 축약

(원문)
---
hr: # 1998 hr ranking  - Mark McGwire 
 - Sammy Sosa 
rbi: 
 # 1998 rbi ranking 
 - Sammy Sosa 
 - Ken Griffey
(축약)
---
hr: 
 - Mark McGwire 
 # Following node labeled SS 
 - &SS Sammy Sosa 
rbi: 
 - *SS # Subsequent occurrence 
 - Ken Griffey

예제6. 시퀀스간의 맵핑

? - Detroit Tigers
 - Chicago cubs 
: 
 - 2001-07-23 

? [ New York Yankees, 
 Atlanta Braves ] 
: [ 2001-07-02, 2001-08-12, 
 2001-08-14 ]

예제7. 명시적인 타입의 표현 (1.1에서 수정됨) 

(명시적인 타입의 표현)
---
not-date: !str 2002-04-28 

picture: !binary | 
 R0lGODlhDAAMAIQAAP//9/X 
 17unp5WZmZgAAAOfn515eXv 
 Pz7Y6OjuDg4J+fn5OTk6enp 
 56enmleECcgggoBADs= 

application specific tag: !!something | 
 The semantics of the tag 
 above may be different for 
 different documents.
(URI를 이용한 명시적인 타입의 표현)
# Establish a tag prefix
--- !clarkevans.com,2002/graph/^shape
  # Use the prefix: shorthand for
  # !clarkevans.com,2002/graph/circle
- !^circle
  center: &ORIGIN {x: 73, y: 129}
  radius: 7
- !^line
  start: *ORIGIN
  finish: { x: 89, y: 102 }
- !^label
  start: *ORIGIN
  color: 0xFFEEBB
  value: Pretty vector drawing.

예제8. 그외 기본 적인 형식의 표현들


리스트 
- Mark McGwire
- Sammy Sosa
- Ken Griffey

해시

hr:  65
avg: 0.278
rbi: 147

리스트의 해시들

american:
  - Boston Red Sox
  - Detroit Tigers
  - New York Yankees
national:
  - New York Mets
  - Chicago Cubs
  - Atlanta Braves
 
해시들의 리스트
-
  name: Mark McGwire
  hr:   65
  avg:  0.278
-
  name: Sammy Sosa
  hr:   63
  avg:  0.288

리스트의 리스트
- [name        , hr, avg  ]
- [Mark McGwire, 65, 0.278]
- [Sammy Sosa  , 63, 0.288]

해시들의 해시
Mark McGwire: {hr: 65, avg: 0.278}
Sammy Sosa: {
    hr: 63,
    avg: 0.288
  }

구현

다음 언어에서 YAML을 이용할 수 있다:

자바구현들

Java:
  • JvYaml # Java port of RbYaml , YAML 1.0, 1.1 (incomplete)
  • SnakeYAML # Java 5 / YAML 1.1 , YAML 1.0, 1.1 지원
  • YamlBeans # To/from JavaBeans , YAML 1.0, 1.1 (incomplete)
  • JYaml # Original Java Implementation , 자바의 초기 구현 버전, 현재는 개발 진행되지 않으며 YAML 1.0의 지원도 완벽하지 않다. (제외)

YAML의 이웃들

다른 단순화된 마크업 언어들이 있다:

참고

댓글 없음:

댓글 쓰기