YAMLκ³Ό JSON

NumberbeenΒ·2023λ…„ 1μ›” 2일
0

DevOps Bootcamp

λͺ©λ‘ 보기
24/30

YAML ??

πŸ”† YAML 은 ꡬ쑰λ₯Ό 가진 데이터 ν‘œν˜„ 양식 의 ν•œ μ’…λ₯˜μ΄λ‹€.

λ°μ΄ν„°λŠ” λ‹€μ–‘ν•œ ν˜•νƒœλ‘œ ν‘œν˜„λ  수 μžˆλŠ”λ° 일반적으둜 μ‚¬μš©ν•˜λŠ” JSON μ΄λ‚˜ XML도 ν‘œν˜„ μ–‘μ‹μ˜ ν•œ μ’…λ₯˜μ΄λ‹€.

데이터λ₯Ό ν˜•μ‹μ— 맞좰 μ‚¬μš©ν•œλŠ” μ΄μœ λŠ” 데이터λ₯Ό μ£Όκ³  받을 λ•Œ μ„œλ‘œ μ΄ν•΄ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œ 이닀.

YAML 은 졜근 λ“€μ–΄ 많이 ν™œμš©λ˜κ³  μžˆλŠ” 데이터 ν˜•μ‹μ΄λ©°, μ‚¬λžŒμ΄ 읽고 μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ ν˜•νƒœλ₯Ό 가지고 μžˆλ‹€. DevOps μ§κ΅°μ—μ„œλŠ” λ‹€μ–‘ν•œ μ„€μ • νŒŒμΌλ“€μ„ YAML ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. μ΄λ•Œ 파일 ν™•μž₯μžλŠ” .yml λ˜λŠ” .yaml 을 μ‚¬μš©ν•œλ‹€.

YAML 문법

1. 데이터 μ •μ˜

YAML 은 기본적으둜 데이터λ₯Ό μ •μ˜ ν•  λ•Œ, key: value ν˜•νƒœλ‘œ 데이터λ₯Ό μ •μ˜ν•œλ‹€. 이 λ•Œ 콜둠 : λ’€μ—λŠ” 킀와 값을 κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ β—οΈλ°˜λ“œμ‹œ 곡백문자(whitespace)❗️가 μžˆμ–΄μ•Ό ν•œλ‹€.

μ‚¬μš© κ°€λŠ₯ν•œ 데이터 νƒ€μž…μœΌλ‘œλŠ” Number, String, Boolean이 있으며, λ¬Έμžμ—΄(String)에 \n , @ λ“±μ˜ 특수 λ¬Έμžκ°€ ν¬ν•¨λœ κ²½μš°μ—λ§Œ λ”°μ˜΄ν‘œ(" ")λ₯Ό μ‚¬μš©ν•˜μ—¬ μž‘μ„±ν•œλ‹€.

#주석
Fruit: Apple
Quantity: 5
Origin: Chungju

κ·Έ 뿐만 μ•„λ‹ˆλΌ YAML νŒŒμΌμ—μ„œ 주석을 μž‘μ„±ν•΄μ•Ό ν•  λ•ŒλŠ” ν•΄λ‹Ή μ€„μ˜ 맨 μ•žμ— # 을 μž…λ ₯ν•œλ‹€.

2. Array / Lists

λ°°μ—΄μ΄λ‚˜ 리슀트 ꡬ쑰의 데이터λ₯Ό ν‘œν˜„ν•˜κ³  싢을 λ•ŒλŠ” - 을 μ‚¬μš©ν•œλ‹€. - λŠ” λ°°μ—΄μ˜ ν•œ μš”μ†Œλ₯Ό 가리킨닀.

이 λ•Œ 각 πŸ‘‰ μš”μ†Œλ“€μ˜ μˆœμ„œκ°€ μ€‘μš”ν•œλ° μ•„λž˜μ˜ λ‚΄μš©μ— 1번과 2λ²ˆμ€ 각기 λ‹€λ₯Έ YAML νŒŒμΌμ΄λ‹€.

λ˜ν•œ - λ₯Ό μ΄μš©ν•˜μš” Array/List λ₯Ό ν‘œν˜„ν•  수 도 μžˆμ§€λ§Œ, 같은 의미둜 [ ] 도 μ‚¬μš©λœλ‹€. [ ] κ°€ μ‚¬μš©λœ 경우, λŒ€κ΄„ν˜Έ μ•ˆμ˜ μš”μ†Œκ°€ λ¬Έμžμ—΄(String) 라면 " " λ₯Ό μ‚¬μš©ν•œλ‹€.

3. Dictionary / Map

계측 ꡬ쑰λ₯Ό ν‘œν˜„ν•˜κ³  싢은 경우, 기본적으둜 2μΉΈ ν˜Ήμ€ 4칸의 λ“€μ—¬μ“°κΈ°λ₯Ό μ‚¬μš©ν•œλ‹€. λ“€μ—¬μ“°κΈ°λ₯Ό μ‚¬μš©ν•  λ•Œ, 각 μ•„μ΄ν…œμ— λŒ€ν•΄μ„œ κΌ­ 같은 수의 곡백문자λ₯Ό μ‚¬μš©ν•˜μ—¬ λ“€μ—¬μ“°κΈ°λ₯Ό ν•΄μ•Όν•œλ‹€. μœ„μ˜ Array/List ν˜•μ‹κ³ΌλŠ” λ‹€λ₯΄κ²Œ μš”μ†Œλ“€μ˜ μˆœμ„œκ°€ μ€‘μš”ν•˜μ§€ μ•Šλ‹€.

Fruits:
    Name: Apple
    Quantity: 5
    Origin: Chungju

Vegetables: 
    Name: Lettuces
    Quantity: 10
    Origin: Daekwan

μœ„μ˜ μ˜ˆμ‹œμ—μ„œ Name, Quantity, Origin 은 같은 수만큼의 λ“€μ—¬μ“°κΈ°λ₯Ό ν–ˆκΈ° λ•Œλ¬Έμ— 같은 κ³„μΈ΅μœΌλ‘œ 각각 Fruits 와 Vegetables 에 μ†ν•œλ‹€.

이와 같이 λ“€μ—¬μ“°κΈ°λ₯Ό 톡해 μ–΄λ–€ 계측에 μ†ν•˜λŠ”μ§€ 달라지기 λ•Œλ¬Έμ— λ“€μ—¬μ“°κΈ°λ₯Ό μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

4. Advanced

μœ„μ˜ 데이터 ꡬ쑰λ₯Ό μ„žμ–΄μ„œ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€. μ•„λž˜μ˜ μ˜ˆμ‹œλŠ” Dictionary ꡬ쑰λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” λ°°μ—΄μ˜ ν˜•νƒœλ₯Ό ν‘œν˜„ν•˜κ³  μžˆλ‹€. λ”λΆˆμ–΄ YAML둜 μž‘μ„±λœ 것을 JSON 으둜 μž‘μ„±ν•œ 것과 비ꡐ해보면 가독성 λ©΄μ—μ„œ 데이터λ₯Ό μ‰½κ²Œ ν‘œν˜„ν•  수 μžˆλŠ” 방법이 무엇인지 μ•Œ 수 μžˆλ‹€.

πŸ“ YAML

Fruits: 
	- Banana:
    	Calories: 105
        Fat: 0.4g
        carbs: 27g
    
    - Grape:
    	Calories: 62
        Fat: 0.3g
        Carbs: 15g

πŸ“ JSON


  "Fruits": [
    {
      "Banana": {
        "Calories": 105,
        "Fat": "0.4g",
        "Carbs": "27g"
      }
    },
    {
      "Grape": {
        "Caloreis": 62,
        "Fat": "0.3g",
        "Carbs": "15g"
      }
    }
  ]
}

5. Multi-lines

κ°’μœΌλ‘œ μ—¬λŸ¬ ν–‰μ˜ λ¬Έμž₯을 μž‘μ„±ν•  λ•Œ 기본적으둜 \n 을 μ‚¬μš©ν•œλ‹€.

ν•˜μ§€λ§Œ \n 을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  |, > λ₯Ό μ‚¬μš©ν•˜μ—¬ μ€„λ°”κΏˆμ„ ν•  μˆ˜λ„ μžˆλ‹€.

> : 이 λ¬ΈμžλŠ” ν•œ 쀄을 λͺ¨λ‘ 비웠을 λ•Œλ§Œ μ€„λ°”κΏˆμœΌλ‘œ 인식을 
ν•˜κ³ , κ·Έλƒ₯ μ€„λ°”κΏˆμ„ ν•  λ•Œμ—λŠ” 곡백문자둜 μΈμ‹ν•œλ‹€.

| : 이 λ¬ΈμžλŠ” λͺ¨λ“  μ€„λ°”κΏˆμ„ μΈμ‹ν•˜λ©°, λ§ˆμ§€λ§‰ λ¬Έμž₯의 끝도 
λ§ˆμ°¬κ°€μ§€λ‘œ μ€„λ°”κΏˆμœΌλ‘œ μΈμ‹ν•œλ‹€.

JSON ??

JSON의 탄생

JSON은 JavaScript Object Notation 의 μ€„μž„λ§λ‘œ, 데이터 κ΅ν™˜μ„ μœ„ν•΄ λ§Œλ“€μ–΄μ§„ 객체 ν˜•νƒœμ˜ 포맷 이닀. λ„€νŠΈμ›Œν¬λ₯Ό 톡해, μ–΄λ–€ 객체 λ‚΄μš©μ„ λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—κ²Œ μ „μ†‘ν•œλ‹€κ³  κ°€μ •ν•  λ•Œ 이 객체 λ‚΄μš©μ„ μΌμ’…μ˜ λ©”μ‹ μ € ν˜Ήμ€ μ±„νŒ… ν”„λ‘œκ·Έλž¨μ—μ„œ μ“°λŠ” ν•˜λ‚˜μ˜ λ©”μ‹œμ§€λΌκ³  ν•œλ‹€λ©΄, λ‹€μŒ 객체λ₯Ό μ–΄λ–»κ²Œ μ „μ†‘ν• κΉŒ?

const message = {
  sender: "κΉ€μ½”λ”©",
  receiver: "박해컀",
  message: "해컀야 였늘 저녁 같이 λ¨Ήμ„λž˜?",
  createdAt: "2021-01-12 10:10:10"
}

λ©”μ‹œμ§€ 객체가 전솑 κ°€λŠ₯ν•˜λ €λ©΄, λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄λŠ” λ°œμ‹ μžμ™€ λ©”μ‹œμ§€λ₯Ό λ°›λŠ” μˆ˜μ‹ μžκ°€ 같은 ν”„λ‘œκ·Έλž¨μ„ μ‚¬μš©ν•˜κ±°λ‚˜, λ¬Έμžμ—΄μ²˜λŸΌ λ²”μš©μ μœΌλ‘œ 읽을 수 μžˆλŠ” ν˜•νƒœμ—¬μ•Ό ν•œλ‹€.

전솑 κ°€λŠ₯ν•œ 쑰건(transferable condition)

  • μˆ˜μ‹ μž(reciever)와 λ°œμ‹ μž(sender)κ°€ 같은 ν”„λ‘œκ·Έλž¨μ„ μ‚¬μš©.
  • λ˜λŠ”, λ¬Έμžμ—΄ 처럼 λ²”μš©μ μœΌλ‘œ 읽을 수 μžˆμ–΄μ•Ό ν•œλ‹€.

κ°μ²΄λŠ” νƒ€μž… λ³€ν™˜μ„ 이용 String 으둜 λ³€ν™˜ν•  경우 객체 λ‚΄μš©μ„ ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€. JavaScript μ—μ„œ 객체의 λ©”μ†Œλ“œ(message.toString()) λ‚˜ ν˜•λ³€ν™˜(String(message)) 을 μ‹œλ„ν•˜λ©΄, [object object] λΌλŠ” κ²°κ³Όλ₯Ό λ¦¬ν„΄ν•œλ‹€.

❓이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법은 객체λ₯Ό JSON ν˜•νƒœλ‘œ λ³€ν™˜ν•˜κ±°λ‚˜ JSON 객체의 ν˜•νƒœλ‘œ λ³€ν™˜ν•˜λŠ” 방법이닀.

  • JSON.stringify : Object type을 JSON으둜 λ³€ν™˜
  • JSON.parse : JSON을 Object type으둜 λ³€ν™˜
let transferableMessage = JSON.stringify(message)
console.log(transferableMessage)  // `{"sender":"κΉ€μ½”λ”©","receiver":"박해컀","message":"해컀야 였늘 저녁 같이 λ¨Ήμ„λž˜?","createdAt":"2021-01-12 10:10:10"}`
console.log(typeof(transferableMessage)) // `string`
            
[μ½”λ“œ] message 객체λ₯Ό JSON으둜 λ³€ν™˜ν•˜λŠ” λ©”μ†Œλ“œ 
            JSON.stringify

stringifyν•˜λŠ” 이 과정을 직렬화(serialize)ν•œλ‹€κ³  ν•œλ‹€.

JSON 으둜 λ³€ν™˜λœ 객체의 νƒ€μž…μ€ λ¬Έμžμ—΄μ΄λ‹€. λ°œμ‹ μžλŠ” 객체λ₯Ό μ§λ ¬ν™”ν•œ λ¬Έμžμ—΄μ„ λˆ„κ΅°κ°€μ—κ²Œ 객체의 λ‚΄μš©μ„ 보낼 수 μžˆλ‹€. κ·Έλ ‡λ‹€λ©΄ μˆ˜μ‹ μžλŠ” 이 λ¬Έμžμ—΄ λ©”μ‹œμ§€λ₯Ό μ–΄λ–»κ²Œ λ‹€μ‹œ 객체의 ν˜•νƒœλ‘œ λ§Œλ“€ 수 μžˆμ„κΉŒ?

let packet = `{"sender":"κΉ€μ½”λ”©","receiver":"박해컀","message":"해컀야 였늘 저녁 같이 λ¨Ήμ„λž˜?","createdAt":"2021-01-12 10:10:10"}`

let obj = JSON.parse(packet)
console.log(obj)
/*
 * {
 * sender: "κΉ€μ½”λ”©",
 * receiver: "박해컀",
 * message: "해컀야 였늘 저녁 같이 λ¨Ήμ„λž˜?",
 * createdAt: "2021-01-12 10:10:10"
 * }
 */
 console.log(typeof(obj))
 // `object`

[μ½”λ“œ] μ§λ ¬ν™”λœ JSON에 λ©”μ†Œλ“œ JSON.parse λ₯Ό μ μš©ν•˜λ©΄ λ‹€μ‹œ 객체의 ν˜•νƒœλ‘œ λ³€ν™˜ν•  수 μžˆλ‹€.

JSON.parseλ₯Ό μ μš©ν•˜λŠ” 이 과정을 역직렬화(deserialize)ν•œλ‹€κ³  ν•œλ‹€.

이처럼, JSON 은 μ„œλ‘œ λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨ μ‚¬μ΄μ—μ„œ 데이터λ₯Ό κ΅ν™˜ν•˜κΈ° μœ„ν•œ 포맷. 그리고 JSON 포맷은 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό ν¬ν•¨ν•œ λ§Žμ€ μ–Έμ–΄μ—μ„œ λ²”μš©μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 유λͺ…ν•œ 포맷이닀.

JSON의 κΈ°λ³Έ κ·œμΉ™

JSON을 얼핏 보기에 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 객체와 λ³„λ°˜ λ‹€λ₯Ό λ°”κ°€ μ—†μ–΄ λ³΄μ΄μ§€λ§Œ, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κ°μ²΄μ™€λŠ” λ―Έλ¬˜ν•˜κ²Œ λ‹€λ₯Έ κ·œμΉ™μ΄ μžˆλ‹€.

profile
λ‚΄κΈ° μ΄ν•΄ν•œ 것을 λ³΄κ΄€ν•˜λŠ” κ³³

0개의 λŒ“κΈ€