공부/기타

[기타] YML, YAML

youngble 2022. 11. 12. 19:54

YML/YAML 이란?

  • Yet Another Markup Language의 약자로, 사람이 읽을 수 있는 데이터 직렬화 언어이다. 최근에는 YAML Ain't Markup Language라고 불리는 재귀적 말장난도 있다.
  • YAMLJSON이나 XML과 마찬가지로 설정 파일 등의 목적을 가진 데이터를 기술하기 위해 만든 포맷으로 JSON과 비교하자면 좀 더 구조가 복잡하지만 사람이 보기에 가독성 측면에서 좀 더 자연스러운 포맷이다.

어디서 사용하는가?

여러곳에서 활용하고 있겠지만 현재 내 입장에서는 github actions을 이용할때 CI/CD 를 배포할때 사용하는 포맷이다.
처음에는 그저 CI/CD를 구현하기위한 주목적으로 큰틀만 알고 사용했지만 여러 추가적인 action이 필요하게 되고(cloud invalidate, cache 등), 이해없이 활용하기 쉽지 않고 만약 안됐을때 이해가 힘들기 때문에 CTO님도 이거에 대한 지적이 있어서 제대로 이해하는 시간이 필요한 시점이라고 판단하였다.


문법, Syntax

# 은 주석을 달때 사용
--- 문서의 시작을 나타내며 선택 사항
... 문서의 을 나타내며 선택 사항

기본 표현
key: value 로 표현하며, : 다음에는 무조건 공백 문자가 와야한다.
: 은 통상 key 가 된다고 볼 수 있음

key: value 의 형식

key:
 key_1:
    key_2:
    	key_3:
            ..

자료형
int, string, boolean 을 지원한다.

int_type: 1
string_type: "1"
boolean_type: true

object 표현

key:
 key: value
 key: value
# 또는
key: {
 key: value,
 key: value
}

두가지 방법 모두 같은 의미로 사용할 수 있다.

List표현

key:
 - item
 - item
# 또는
key: [
 item, item
]

위의 - 를 사용하여 값 item을 넣었는데 두번째 배열안에 값을 넣은 형식과 같음을 이해하면 된다.

text표현
| 는 줄바꿈을 포함하고
> 는 줄바꿈을 무시한다.
이부분은 글로만보면 무슨소리인지 알지 못하지만 아래 예제를 통해 좀더 쉽게 이해 가능하다.

 - name: Setting .env
   run: |
        echo "REACT_APP_BASE_URL=${{ secrets.REACT_APP_BASE_URL}}" >> .env
        echo "REACT_APP_KAKAOMAP_API_KEY=${{ secrets.REACT_APP_KAKAOMAP_API_KEY}}" >> .env
        cat .en

이 코드는 예전에 실제 github actions에서 사용했던 코드인데 이부분에서 | 가 붙은걸 보면 여러가지를 실행할 리스트들을 줄바꿈을 통해 실행하길 원했다. 만약 | 을 사용하지 않거나 >을 사용했더라면 각각의 줄바꿈이 적용이 되지않기때문에 한줄로 읽을 것이다. 하지만 줄바꿈처리를 하고 각각 다른 실행이라는 것을 표현하기위해 | 를 사용한 것이다.

다른 예시

좀더 다른 예시를 통해서 yml로 작성한 것과 기존에 우리가 아는 json형태에서는 어떤식으로 표현된건지 또는 yml에서도 어떤식의 객체나 배열로 표현한 것인지 이해하자.


예제1
YML 방식

--- # 문서의 시작
# my test yaml syntax

name: youngble
job: developer

basic_list:
 - apple
 - banana
 - orange
 
another_list: [
 apple,
 banana,
 orange
]

object_list:
 - color: red
   direction: left
 - color: blue
   direction: right

basic_oject:
 time: '12:34:11'
 date: '2019-04-30'
 
another_object: {
 time: '12:34:11'
 date: '2019-04-30'
}

comment_line_break: |
 hello my name is youngble
 Im developer
 
comment_single_line: >
 hello world
 mu first yml syntax
 
 ...# 문서의 끝

To Json 형식

{
 "name": "youngble",
 "job": "developer",
 "basic_list": [
   "apple",
   "banana",
   "orange"
  ],
  "another_list":[
   "apple",
   "banana",
   "orange"
  ],
  "object_list": [
   {
     "color": "red",
     "direction": "left"
   },
   {
     "color": "blue",
     "direction": "right"
   }
   ],
   "basic_object": {
      "time": "12:34:11",
      "date": "2019-04-30"
   },
   "another_object": {
      "time": "12:34:11",
      "date": "2019-04-30"
   },
   "comment_line_break": "hello my name is youngble.\nIm developer.\n",
   "comment_single_line": "hello world my first yml synctax."
  
}


예제2

// yml 방식
json:
 - rigid
 - better for data interchange

// json방식
{
 "json" : ["rigid", "better for data interchange"]
}

//yml 방식
object:
 - key: value
   array:
    - null_value: null
    - boolean: true
    - integer: 1
    
// json 방식
{
 "object": 
  [
   {
    key: value, 
    array: 
     [
      {"null_value": null}, 
      {"boolean": true}, 
      {"integer": 1}
     ]
    }
   ]
}

//yml 방식
paragraph: >
  Blank lines denote
  paragraph breaks
content: |
  Or we
  can auto
  convert line breaks
  
 //json 방식
 {
  "paragraph" : "Blank lines denoteparagraph breaks",
  "content" : "Or we\ncan auto\nconvert line breaks"
  // \n부분은 줄바꿈으로 인식하면된다
 }