IT STUDY LOG

[YAML] 01. YAML과 JSON 본문

devops bootcamp 4/클라우드 서비스 운영

[YAML] 01. YAML과 JSON

roheerumi 2023. 4. 11. 10:54

# 학습 목표

  • 구조화된 데이터를 표현하는 방식을 학습한다.
    • XML, JSON, YAML의 차이점을 이해한다.
  • 데이터를 YAML 형식으로 표현할 수 있다.
    • 간단한 YAML 문법을 학습한다.
      • 데이터를 표현하는 키-값 형태를 이해한다.
      • Array, Dictionary 등의 구조를 이애한다.
      • 작성된 데이터가 여러 줄일 때, 표현하는 방식을 학습한다.
  • 스프린트를 통해 데이터를 보고 YAML 형식으로 작성하여 실습한다.

# 학습 내용

목차
1. YAML Ain't Markup Language
2. 대표적인 데이터 교환 포맷 JSON

1.  YAML Ain't Markup Language

YAML: YAML Ain't Markup Language

- 구조를 가진 데이터 표현 양식의 한 종류

- JSON, XML도 동일한 데이터 표현 양식의 한 종류

- 데이터 주고 받을 때 서로 쉽게 이해하기 위함

- 확장자 : .yml .yaml

 

YAML 문법

1. 데이터 정의

- 형태 : key: value 형태

 > 콜론(:) 뒤에는 키와 값을 구분하기 위해 반드시 공백 문자가 있어야 함

- 사용 가능한 데이터 타입 : Number, String, Boolean

 > 문자열에 \n, @ 등 특수 문자가 포함된 경우에만 따옴표를 (" ") 사용해 작성

- 주석 : #

 

2. Array / Lists

- 배열 리스트 구조 표현 시 -,  [ ] 사용

 > - : 배열의 한 요소를 나타냄

 > [ ] : 대괄호 안의 요소가 문자열일 경우 " " 사용

- 요소의 순서 중요

# 아래 두 YAML 은 다른 파일
# 1번
Fruits:
	- Orange
	- Apple
	- Banana

Vegetables:
	- Carrot
	- Lettuce
    
# 2번
Fruits:
	- Apple
	- Orange
	- Banana

Vegetables:
	- Lettuce
	- Carrot

 

3. Dictionary / Map

-  계층 구조를 표현하고 싶을 경우 2칸, 4칸의 들여쓰기를 사용하며 각 아이템에 대해 꼭 같은 수의 공백 문자를 사용해야 함

- 요소의 순서가 중요하지 않음

Fruits:
    Name: Apple
    Quantity: 5
    Origin: Seoul
    
Vegetables:
    Name: Peppermint
    Quantity: 10
    Origin: Paju

 

4. Advanced

-  데이터 구조를 섞어 사용 가능

- 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": {
        "Calories": 62,
        "Fat": "0.3g",
        "Carbs": "25g"
      }
    }
  ]
}

 

5. Multi-lines

-  값으로 여러 행의 문장을 작성할 경우 기본적으로 \n을 사용

example: "this is multiline string \n and this is nextline \n and nextline \n"

- |, > 을 사용해 줄바꿈도 가능

 > > : 한 줄을 모두 비웠을 때만 줄바꿈으로 인식하고, 그냥 줄바꿈을 할 때에는 공백 문자로 인식

#YAML

example1: >
  this is multiline string 
  and this is nextline 
  and nextline

example2: >
  this is multiline string 

  and this is nextline 
  and nextline
#JSON 

{
  "example1": "this is multiline string  and this is nextline  and nextline\n"
}


{
  "example2": "this is multiline string \nand this is nextline  and nextline\n"
}

> | : 모든 줄바꿈을 인식하며 마지막 문장의 끝도 마찬가지로 줄바꿈으로 인식

#YAML

example1: |
  this is multiline string 
  and this is nextline 
  and nextline
#JSON 

{
  "example1": "this is multiline string \nand this is nextline \nand nextline\n"
}

 

2. 대표적인 데이터 교환 포맷 JSON

JSON의 탄생 배경

- JavaScript Object Notation

- 데이터 교환을 위해 만들어진 객체 형태의 포맷

 

JSON이 필요한 예시

const message = {
  sender: "김코딩",
  receiver: "박해커",
  message: "해커야 오늘 저녁 같이 먹을래?",
  createdAt: "2021-01-12 10:10:10"
}

- 객체 전송을 위한 조건

 > 수신자(reciever)와 발신자(sender)가 같은 프로그램을 사용 or  문자열처럼 범용적으로 읽을 수 있어야 함

- 객체는 타입 변환을 이용해 String으로 변환할 경우 객체 내용을 포함하지 않음

 > (ex) message.toString, String(message) 시 [object Object] 리턴

∴ 객체를 JSON 형태로 변환하거나 JSON을 객체 형태로 변환하여 해결

 

JSON과 관련한 메소드

let transferableMessage = JSON.stringify(message)
console.log(transferableMessage)  // `{"sender":"김코딩","receiver":"박해커","message":"해커야 오늘 저녁 같이 먹을래?","createdAt":"2021-01-12 10:10:10"}`
console.log(typeof(transferableMessage)) // `string`

JSON.stringify - 직렬화를 통해 객체를 문자열로 변환

- Object type을 JSON으로 변환


JSON.parse - 역직렬화를 통해 문자열을 객체로 변환

- JSON을 Object type으로 변환

출처 : 코드스테이츠 데브옵스 부트캠프 과정

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
키는 따옴표 없이 쓸 수 있음 반드시 큰 따옴표를 부텽야 함
문자열 값 문자열 값은 어더한 형태의 따옴표도 사용 가능 반드시 큰 따옴표로 감싸야 함
비고 - 키와 값 사이, 키-값 쌍 사이에 공백이 있으면 안 됨

 

Action Items

JSON과 XML

구조

- XML:  태그(tag)를 사용하여 데이터를 계층적으로 표현. 태그는 시작 태그와 종료 태그로 이루어져 있고, 계층적으로 중첩되어 데이터의 구조를 표현

- JSON: 중괄호({})와 대괄호([])를 사용하여 데이터를 표현하는데, 중괄호는 객체(object)를, 대괄호는 배열(array)을 나타냄

 

가독성

- XML : 태그들이 중첩되어 복잡하게 구조화되기 때문에 가독성이 떨어지고, 데이터의 크기가 크기 때문에 전송에 비효율적일 수 있음

- JSON : 사람이 읽고 쓰기에 용이하며, 데이터의 크기가 작아서 효율적인 전송이 가능

 

데이터 타입

- XML : 데이터 타입이나 스키마를 명시적으로 정의할 수 있어, 데이터의 유효성을 검증하기 용이

- JSON : 데이터 타입이나 스키마를 명시적으로 정의하기 어렵기 때문에, 데이터의 유효성 검증이 상대적으로 어려움

 

확장성

- XML :  태그를 사용하여 확장성이 높은 데이터 구조를 표현 가능

- JSON : 태그 대신 키-값 쌍을 사용하기 때문에, 확장성이 XML에 비해 상대적으로 낮음

 

데이터 처리

- XML : 파싱이 복잡하고 처리가 비교적 번거로워서 데이터 처리에 높은 비용이 발생 가능

- JSON : 파싱이 간단하고 처리가 용이하여 데이터 처리에 효율적

 

언어 지원

- XML :  태그를 사용하기 때문에, 다양한 언어에서 사용 가능

- JSON : 자바스크립트 객체 표기법이므로 자바스크립트를 비롯한 몇몇 프로그래밍 언어에서 지원

 

텍스트 형식의 데이터 교환 포맷과 이진 형식의 데이터 교환 포맷의 차이점과 장단점

텍스트 형식의 데이터 교환 포맷

- 데이터를 텍스트로 표현하는 방식

- 대표적인 예 :  XML (eXtensible Markup Language), JSON (JavaScript Object Notation), CSV (Comma-Separated Values) 등

- 텍스트 형식의 데이터 교환 포맷은 사람이 읽고 이해하기 쉽고, 다양한 프로그래밍 언어나 플랫폼에서 지원되는 보편적인 형식

- 텍스트 형식의 데이터는 텍스트 편집기를 통해 직접 편집이 가능하고, 디버깅이 용이하며, 버전 관리 시스템 등의 형상 관리 도구와 함께 사용하기 편리

- 텍스트 형식은 데이터의 크기가 크거나 복잡한 구조를 가질 경우에는 용량이 크고, 데이터를 직렬화하고 역직렬화하는 과정에서 오버헤드가 발생 가능

- 텍스트로 표현되기 때문에 데이터의 전송 속도가 상대적으로 느릴 수 있음

 

이진 형식의 데이터 교환 포맷

- 데이터를 이진 형태로 표현하는 방식

- 대표적인 예 : Protocol Buffers, MessagePack, BSON (Binary JSON) 등

- 텍스트 형식보다 용량이 작고, 직렬화와 역직렬화 과정에서 오버헤드가 적어 전송 속도가 빠름

- 이진 형식은 특정 언어나 플랫폼에 종속되는 경우가 많아, 다양한 환경에서 지원이 제한될 수 있음 

- 이진 형식은 사람이 읽고 이해하기 어렵고, 직접 편집이 불가능하며, 디버깅이 복잡할 수 있습니다. 또한, 버전 관리 시스템 등의 형상 관리 도구와 함께 사용하기 어려울 수 있음

 

# References

챗GPT

YAML

 

The Official YAML Web Site

 

yaml.org

Scalars

 

YAML Ain’t Markup Language (YAML™) revision 1.2.2

 

yaml.org

YAML 자습서 | 18 분 안에 YAML 배우기

JSON

 

JSON

JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of the JavaScript Programming Language Standard ECMA-262 3rd Edition

www.json.org

 

Comments