Doctor Pepper

YAML(YAML Ain't Markup Language) 본문

프로그래밍/데이터 포멧

YAML(YAML Ain't Markup Language)

Doctor Pepper 2024. 10. 17. 23:31
728x90

 

1. YAML

YAML(YAML Ain't Markup Language)은 사람이 쉽게 읽을 수 있는 데이터 직렬화 형식 중 하나로, 구조화된 데이터를 표현하는 데 사용된다. 처음에는 "Yet Another Markup Language"로 불렸으나, 더 이상 마크업 언어가 아니라는 점을 강조하기 위해 "YAML Ain't Markup Language"로 변경되었다.

 

 YAML은 JSOM이나 XML과 같은 데이터 표현 형식과 유사하지만, 보다 간결하고 가독성이 좋도록 설계되었다. 주로 애플리케이션의 설정 파일, 데이터 교환 형식, API 응답 등에서 사용되며, 다양한 프로그래밍 언어와 쉽게 호환된다.

 

2. YAML 배경

YAML은 2001년, Clark Evans에 의해 처음 발표되었으며, 간결함, 사람 중심의 가독성, 구조적 표현의 단순화를 목표로 한다. 특히 XML이나 JSOM과 같은 포맷에서 발생하는 복잡함을 줄이고, 인간이 쉽게 읽고 쓸 수 있는 형태로 데이터를 표현하고자 했다.

 

YAML은 주로 애플리케이션 설정 파일에서 많이 사용되는 데, 그 이유는:

  • 직관적인 문법으로 누구나 쉽게 읽고 쓸 수 있음
  • 중첩된 데이터를 쉽게 표현할 수 있음
  • 다양한 프로그래밍 언어와의 호환성이 뛰어남

 

3. 문법

YAML의 문법은 매우 간결하고 직관적이다. 공백이나 들여쓰기, 줄바꿈 등을 사용해 데이터를 표현하는 방식이 특징이다.

 

- 기본 규칙

  • 들여쓰기 : YAML에서 들여쓰기가 매우 중요하다. 들여쓰기를 통해 데이터의 계층 구조를 나타낸다. 들여쓰기는 탭 대신 공백으로 해야 하며, 일반적으로 2칸 또는 4간의 공백을 사용한다.
  • 키-값 쌍 : YAML은 주로 키-값 쌍으로 데이터를 표현한다. 콜론(:)을 사용하여 키와 값을 구분한다.
name: John Doe
age: 30

 

 

- 데이터 타입

  • 문자열 : 문자열은 기본적으로 따옴표 없이 사용할 수 있다. 하지만 공백이 포함되거나 특수 문자가 있는 경우 따옴표를 사용해야 한다.
message: "Hello, World"

 

  • 숫자 : 숫자는 별도의 포맷 없이 바로 사용 가능하다.
age: 30

 

  • 불리언 : true/false 값은 소문자로 표기한다.
is_admin: true

 

  • null 값 : null 값은 null, Null, ~ 등으로 표현할 수 있다.
description: null

 

 

- 리스트(배열)

리스트는 대시(-)를 사용하여 할목을 나열한다.

items:
    - Apple
    - Orange
    - Banana

 

 

- 딕셔너리(맵)

딕셔너리는 중첩된 구조를 통해 데이터를 표현할 수 있다.

person:
     name: Jane Doe
     age: 28
     job: Developer

 

 

- 주석

주석은 #으로 시작하며, YAML 파일 내에서 설명을 추가할 때 사용된다.

default: &default_settings
     timeout: 30
     retries: 3

custom:
    <<: *default_settings
    retries: 5    # custom에서는 retries만 덮어씀

 

- 인라인 리스트

여러 데이터를 한 줄에 표현할 때는 대괄호([ ])를 사용하여 리스트를 정의할 수 있다.

fruits: [Apple, Orange, Banana]

 

 

- 인라인 딕셔너리

딕셔너리를 한 줄에 표현할 때는 중괄호({ })를 사용할 수 있다.

person: {name: John, age: 30, job: Developer}

 

 

- 멀티라인 문자열 : 리터럴 블록(|)

개행 문자를 포함한 문자열을 그대로 유지한다.

description: |
    This is a description.
    It contains multiple lines.

 

결과:

This is a description.
It contains multiple lines.

 

 

- 멀티라인 문자열 : 접기(>)

줄바꿈을 하나의 공백으로 처리한다. 개행 문자를 유지하지 않고 이어서 표현한다.

description: >
     This is a folded string.
     It will be rendered

 

결과:

This is a folded string. It will be rendered as a single line.

 

- 앵커(&)와 병합 키(<<)

복잡한 데이터 구조에서 코드 재사용을 가능하게 해주는 앵커와 병합 키 기능을 제공한다. 병합 키는 다른 딕셔너리의 내용을 병합할 수 있다.

default: &default
     retries: 3
     timeout: 30

custom:
     << : *default
     retries: 5    # timeout은 유지되고 retries만 덮어씌움

 

결과:

custom:
     retries: 5
     timeout: 30

 

 

- 다중 문서

 YAML 파일 내에서 여러 개의 문서를 포함할 수 있다. 문서의 경계는 ---으로 구분되며, 선택적으로 문서 끝을 ...으로 표시할 수 있다.

---
name: John
age: 30
---
name: Jane
age: 25
...

 

 

- 형식 지정 날짜와 시간

YAML은 날짜와 시간을 기본적으로 지원한다. 날짜는 YYYY-MM-DD, 시간은 HH:MM:SS 형식으로 표현된다.

date: 2024-10-17
time: 14:45:00

 

또한, 날짜와 시간을 결합하여 사용할 수도 있다.

datetime: 2024-10-17T14:45:00

 

 

- 특수 문자열

YAML에서 특수한 문자열, 즉 특정 형식을 갖는 문자열은 따옴표를 이용해 표시할 수 있다.

  • 큰따옴표(" "): 큰따옴표 안에서는 이스케이프 문자를 사용할 수 있다.
message: "Hello\nWorld"  # 줄바꿈 문자 포함
  • 작은따옴표(' '): 작은따옴표 안에서는 이스케이프 문자를 사용할 수 없다.
message: 'This is a single-quoted string'

 

 

- 기본값 설정(Default Values)

YAML에서는 기본값을 설정할 수 있는 기능이 제공된다. 주로 키가 없는 경우 기본값을 사용할 수 있도록 하기 위해 사용된다.

person:
     name: &default_name "Unknown"
     age: &default_age 0

user:
     name: *default_name     # 기본값 "Unknown" 사용
     age: *default_age           # 기본값 0 사용

 

 

- 고정형 리스트

고정형 리스트는 !!set을 사용하여 표현할 수 있으며, 중복되지 않는 유일한 값들의 집합을 나타낼 때 사용된다.

unique_fruits: !!set
     ?  Apple
     ?  Orange
     ?  Banana

 

이 방식은 순서 없이 고유한 값들만 모아둘 때 사용되며, 주로 파싱 라이브러리에서 고유한 집합으로 처리된다.

 

 

- Null, Boolean, 정수 및 실수 표현

  • Null : null, ~ 또는 아무 값도 적지 않음으로 표현할 수 있다.
empty_value: null
another_empty_value: ~

 

  • Boolean : true/false, yes/no, on/off 등 여러 표현이 가능하다.
flag : true
available : yes

 

  • 정수 및 실수 : 정수는 그대로, 실수는 소수점이나 지수 형태로 표현할 수 있다.
integer: 42
float : 3.14
scientific: 1e6

 

728x90

'프로그래밍 > 데이터 포멧' 카테고리의 다른 글

XML(Extensible Markup Language)  (3) 2024.10.21
데이터 포맷 개념 및 종류  (19) 2024.10.17