Yaml 야믈? 야물?

shintwl·2024년 4월 18일
1

Yaml을 들어보셨나요?
야믈 혹은 야물 이라고 부르는 친구입니다

YAML의 탄생

XML

초창기에는 key : value를 가진 파일을 xml로 만들었습니다
Info.plist도 이런 식이죠

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>UIApplicationSceneManifest</key>
	<dict>
		<key>UIApplicationSupportsMultipleScenes</key>
		<false/>
		<key>UISceneConfigurations</key>
		<dict>
			<key>UIWindowSceneSessionRoleApplication</key>
			<array>
				<dict>
					<key>UISceneConfigurationName</key>
					<string>Default Configuration</string>
					<key>UISceneDelegateClassName</key>
					<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
				</dict>
			</array>
		</dict>
	</dict>
</dict>
</plist>

xml의 태그 안에는 개발자가 원하는 어떤 단어라도 넣을 수 있는 장점이 있어 널리 쓰였습니다
하지만 점차 여는 태그와 닫는 태그를 작성하는 게 귀찮다는 생각이 들었죠

그래서 JSON이 등장합니다

JSON

json은 여는 태그 닫는 태그를 없애고 중괄호, 대괄호를 도입합니다

{
    "glossary": {
        "title": "example glossary",
		"GlossDiv": {
            "title": "S",
			"GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
					"SortAs": "SGML",
					"GlossTerm": "Standard Generalized Markup Language",
					"Acronym": "SGML",
					"Abbrev": "ISO 8879:1986",
					"GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
						"GlossSeeAlso": ["GML", "XML"]
                    },
					"GlossSee": "markup"
                }
            }
        }
    }
}

이걸 xml로 표현하면 이렇습니다

<!DOCTYPE glossary PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
 <glossary><title>example glossary</title>
  <GlossDiv><title>S</title>
   <GlossList>
    <GlossEntry ID="SGML" SortAs="SGML">
     <GlossTerm>Standard Generalized Markup Language</GlossTerm>
     <Acronym>SGML</Acronym>
     <Abbrev>ISO 8879:1986</Abbrev>
     <GlossDef>
      <para>A meta-markup language, used to create markup
languages such as DocBook.</para>
      <GlossSeeAlso OtherTerm="GML">
      <GlossSeeAlso OtherTerm="XML">
     </GlossDef>
     <GlossSee OtherTerm="markup">
    </GlossEntry>
   </GlossList>
  </GlossDiv>
 </glossary>

JSON으로 개발자들은 귀찮음을 상당히 덜 수 있었고 왠만한 데이터는 JSON으로 주고 받게 됩니다

하지만 개발자들은 게으르기 때문에 좀 더 편한 방법은 없는지 고민하게 되고, YAML이 등장합니다

참고로 YAML로 표현하면 이렇습니다

---
glossary:
  title: example glossary
  GlossDiv:
    title: S
    GlossList:
      GlossEntry:
        ID: SGML
        SortAs: SGML
        GlossTerm: Standard Generalized Markup Language
        Acronym: SGML
        Abbrev: ISO 8879:1986
        GlossDef:
          para: A meta-markup language, used to create markup languages such as DocBook.
          GlossSeeAlso:
          - GML
          - XML
        GlossSee: markup

YAML

YAML은 YAML Ain't Markup Language™의 약자로, 처음에는 Yet Another Markup Language라는 문장의 약자였습니다.
Linux Is Not UniX의 Linux 같은 결의 농담을 차용했다고 합니다.

YAML 혹은 YML은 JSON의 큰 몇가지 단점을 극복했습니다
1. 주석 작성 불가
2. 매번 쉼표 작성으로 git diff가 번거로움
3. 타입을 명시할 수 없음

그래서 Github Action, Docker, Flutter 등에서는 설정 파일을 yaml로 관리합니다

YAML 장점

  • JSON과 호환
  • 타입 명시 가능
  • 작성할 코드량 감소
  • 가독성이 높음
  • 한 파일에 여러 문서 작성 가능 (운영, 개발 환경을 한 파일에 명시한다던지)

YAML 단점

  • JSON 보다 파싱 속도가 느림
  • 데이터 직렬화가 어려움
    인간이 읽기 편하게 만들다보니 생긴 단점으로 볼 수 있습니다

그래서 데이터를 주고 받을 때 보다는 환경 등 설정 파일에 주로 쓰입니다

YAML 기본 문법

# 해시기호로 주석을 사용할 수 있습니다

# 콜론 다음에 띄어쓰기가 있어야 합니다

keyA: hello everyone # 문자열에 따옴표를 사용하지 않아도 됩니다

key B: wow awesome # 프로퍼티에 공백이 있어도 됩니다

keyC: "'Michael Jordan' is genius" # 큰 따옴표 안에 작은 따옴표
keyD: '"Michael Jordan" is genius' # 작은 따옴표 안에 큰 따옴표도 가능합니다

# 긴 문자열 (개행 포함)은 >, |를 사용합니다
longText: >
	동해물과 백두산이 마르고 닳도록
    하느님이 보우하사 우리나라 만세
    
    무궁화 삼천리 화려강산
    대한사람 대한으로 길이 보전하세
    
numberKey: 3 # 숫자로 변환이 가능한 경우에는 숫자로 인식합니다
floatKey: 123.456 # 소수도 가능합니다
exponetialKey: 123.456e+03 # 부동소수점을 지원합니다
not number: "1" # 따옴표로 감싸면 문자열로 인식합니다

boolean1: true # 불리언 사용 가능합니다
boolean2: TRUE # 대문자도 사용 가능합니다

null key1: null # null이 됩니다
null key2: ~ # ~는 null의 단축 표현입니다

date key1: 2024-04-18 # 시간 포맷을 사용할 수 있습니다
date key2: 2024-04-18T12:00:00
date key3: 12:00:00 # 시:분:초

array: # 배열의 아이템은 하이픈(-)을 사용합니다
    - item1
    - item2
    - item3
    
object:
	name: Michael Jordan
	born:
    	at: February 17, 1963
        in: Brooklyn, New York City, U.S.
    teams he played:
        - Chicago Bulls
        - Washington Wizards
        
# anchor로 반복 작성을 피할 수 있습니다
very long string: &longString long long long long string
really long string: *longString # long long long long string으로 인식됩니다. 변수라고 생각하면 됩니다

objectA: &objectA
	key1: value1
    key2: value2

objectB: *objectA

objectC:
	<<: *objectA # objectA를 복사해옵니다
    key3: value3

# 대시 3개 (---)로 문서를 구분합니다
---
key1234: value1234
---
key1234: value1234 # 다른 문서이기 때문에 키가 겹치는 것으로 평가되지 않습니다

참고

https://json.org/example.html
https://yaml.org
https://inpa.tistory.com/entry/YAML-📚-yaml-개념-문법-이해하기-💯-총정리
https://en.wikipedia.org/wiki/Michael_Jordan

2개의 댓글

comment-user-thumbnail
2024년 4월 19일

확실히 XML이나 JSON과 비교했을 때 가독성이 좋고 한 눈에 확 들어오긴 하는군요
YAML이 데이터를 주고받기(JSON이 하는 역할) 보다는 설정 파일에 주로 쓰인다고 말씀해주셨는데요
혹시 구체적인 예시가 있을까요?? YAML이 실제 실무에서 어떤 방식으로 사용될는지 궁금합니다!!
좋은 글 작성해주셔서 감사합니다!! 오늘 하루도 좋은 하루 되세요 ㅎㅎ

1개의 답글