컴퓨터 과학(CS)/기타

직렬화, XML, JSON, YAML

Bentist 2022. 1. 26. 12:06

직렬화(Serialization)

직렬화컴퓨터의 데이터 객체저장 매체에 저장할 수 있는 형식, 또는 네트워크를 통해 전송할 수 있는 것으로 변환하는 것을 뜻한다. 저장장치에 저장되는 데이터 또는 네트워크를 타고 다니는 데이터는 결국은 0과 1로 이루어진 디지털 데이터의 연속이다. 따라서 프로그래밍 언어에서 사용하는 변수, 구조체, 객체와 같은 데이터들을 저장장치에 저장하거나 네트워크로 전송할 때에는 여기에 적합한 형식으로 만들어 줘야 한다.

직렬화의 방식은 크게 두 가지가 있다.
1) 컴퓨터가 쉽게 이해할 수 있는 0과 1의 디지털 형식으로 된 이진(binary) 방식
2) 사람이 쉽게 읽을 수 읽는 형태로 직렬화하는 텍스트 방식

XML, JSON, YAML 같은 형식은 텍스트 형식 직렬화이고, 한글의 HWP 파일, 워드의 DOC 혹은 DOCX 파일, 이미지를 위한 JPG, PNG, GIF 같은 형식들, 오디오를 위한 WAV, MP3, OGG, AAC 같은 형식들, 영상을 위한 AVI, MOV, MP4와 같은 형식들은 이진 방식 직렬화다.


1. XML

XML(Extensible Markup Language)은 W3C에서 개발된 특수 목적의 마크업 언어로, HTML과 매우 비슷한 문자 기반을 갖는다. XML은 사람과 기계가 동시에 읽기 편한 구조로 되어 있다. XML은 주로 인터넷에 연결된 시스템끼리 데이터를 쉽게 주고 받을 수 있게 하여 HTML의 한계를 극복할 목적으로 만들어졌다. XML은 HTML처럼 문서의 형태를 보여주는게 아닌, 데이터를 저장하고 전달할 목적으로 데이터의 구조를 기술하기 위한 언어다.

* HTML과 XML 비교

  • HTML, XML 둘 다 마크업 언어
  • 마크업 언어는 태그를 사용하여 문서 내의 요소를 정의하는 컴퓨터 언어
  • HTML웹 페이지에 문서 형태로 데이터를 보여주기 위한 목적으로 사용되는 하이퍼 텍스트 마크업 언어
  • XML은 플랫폼간 데이터를 교환하는데 사용되는 확장 가능한 마크업 언어

2. JSON

JSON(JavaScript Object Notation)은 속성-값 쌍 또는 키-값 쌍으로 이루어진 데이터를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이다. JSON은 데이터 교환 형식일 뿐이며, 어떠한 통신 방법도 프로그래밍 문법도 아니다. JSON은 텍스트 기반이므로 어떠한 프로그래밍 언어에서도 JSON 데이터를 읽고 사용할 수 있다. 비동기 브라우저/서버 통신 (AJAX)을 위해, 넓게는 XML의 대안으로서 좀 더 쉽게 데이터를 교환하고 저장하기 위해 고안되었다.
특히, 클라이언트와 서버 사이에서 데이터를 주고 받을 때의 교환 형식으로 알려져 있다.

 

* 공통점과 차이점 참고: http://www.tcpschool.com/json/json_intro_xml

* XML과 JSON 공통점

1) 둘 다 데이터를 저장하고 전달하는, 데이터 교환 형식이다.
2) 둘 다 기계뿐만 아니라 사람도 쉽게 읽을 수 있다.
3) 둘 다 계층적인 데이터 구조를 가진다.
4) 둘 다 다양한 프로그래밍 언어에 의해 파싱될 수 있다.
5) 둘 다 XMLHttpRequest 객체를 이용하여 서버로부터 데이터를 전송받을 수 있다.


현재 대부분의 주요 웹 브라우저는 서버에 데이터를 요청하기 위한 XMLHttpRequest 객체를 내장하고 있는데,
XMLHttpRequest 객체는 서버로부터 XML 데이터를 전송받아 처리하는 데 사용된다.

* XML과 JSON 차이점

1) JSON은 종료 태그를 사용하지 않는다.
2) JSON의 구문이 XML의 구문보다 더 간결기계가 XML과 비교했을 때 파싱하기 쉽고, 사람이 읽어도 파악이 용이
3) XML은 배열을 사용할 수 없지만, JSON배열을 사용할 수 있다.
4) XML은 XML 파서로 파싱되며, JSON은 자바스크립트 표준 함수인 eval() 함수로 파싱된다.

# XML 예제 <dog> <name>식빵</name> <family>웰시코기</family> <age>1</age> <weight>2.14</weight> </dog> # JSON 예제 { "name": "식빵", "family": "웰시코기", "age": 1, "weight": 2.14 }

[JSON 기본 자료형]

  • (Number)
  • 문자열(String): 0개 이상의 유니코드 문자들의 연속. 문자열은 큰 따옴표(")로 구분
  • 참/거짓(Boolean): true 또는 false 값
  • 배열(Array): 0 이상의 임의의 종류의 값으로 이루어진 순서가 있는 리스트로 대괄호로 표현, 요소는 쉼표로 구분
  • 객체(Object): 순서가 없는 {이름:값} 쌍의 집합으로, 이름(키)이 문자열이다.
  • null: 빈 값으로, null을 사용한다.

배열(Array) [ ]

배열은 대괄호[ ]로 나타낸다. 배열의 각 요소는 기본 자료형이거나 배열, 객체이다. 각 요소들은 쉼표(,)로 구별된다. 각 요소가 나타나는 순서에 의미가 있다.

# 기본자료형, 배열, 객체
[10, [30, "마흔"], {"v": 20}]

객체(Object) { }

객체는 이름(키) : 값 쌍의 집합으로, 중괄호{ }를 사용한다. 이름은 항상 문자열이기 때문에 반드시 따옴표를 하며, 값은 기본 자료형이다. 각 쌍들은 쉼표(,)로 구별된다. 각 쌍이 나오는 순서는 의미가 없다.

 {"name2": 50, "name3": "값3", "name1": true}
  • Key(키)은 "쌍따옴표"로 묶어서 문자열로 표기한다. 숫자도 문자열로 표현된다.
  • Value(값)모든 자료형이 가능하며 자료형에 따라 표기 방법이 달라진다.
  • ex. { "가족 관계" : {"아버지" : "홍길동"}. {"어머니": "김장순"} } => 객체 안에 객체의 계층 구조도 가능
JSON 메시지 단위는 배열이나 객체이다.

예제.

다음은 한 사람에 관한 정보를 갖는 JSON 객체이다.

 {
    "이름": "홍길동",
    "나이": 25,
    "성별": "여",
    "주소": "서울특별시 양천구 목동",
    "특기": ["농구", "도술"],
    "가족관계": {"아버지": "홍판서", "어머니": "춘섬"},
    "회사": "경기 수원시 팔달구 우만동"
 }

3. YAML

YAML은 JSON과 마찬가지로 사람이 읽기 쉬운 형태데이터 직렬화 양식이다. YAML이라는 이름은 "YAML은 마크업 언어가 아니다(YAML Ain't Markup Language)"라는 재귀적인 이름에서 유래되었다. 원래 YAML의 뜻은 "또 다른 마크업 언어(Yet Another Markup Language)"였으나, YAML의 핵심은 문서 마크업이 아닌 데이터 중심에 있다는 것을 보여주기 위해 이름을 바꾸었다.

* JSON과 YAML 차이점

JSON의 최우선 설계 목표는 간편성과 보편성이다. 따라서 JSON은 가독성을 조금 떨어트리는 대신에 생성 및 파싱이 용이하다. 반면에 YAML의 최우선 설계 목표는 가독성이다.

[YAML 기본 자료형]

  • 스칼라(Scalar) : 문자열 혹은 숫자
  • 시퀀스(Sequence): 배열
  • 매핑(Mapping): 해시 혹은 딕셔너리, key-value 쌍

[YAML 사용법]

YAML은 기본적으로 들여쓰기(indent)를 원칙으로 하며, 데이터는 Map(key-value)형식으로 작성되어야 한다.

1. 데이터 정의
YAML은 기본적으로 key: value 형태로 데이터를 정의

name: Server
administrator: Ben
created: 2021033921

2. 들여쓰기(indent)
YAML은 들여쓰기로 계층 구조를 표현하며, 기본적으로 2칸 또는 4칸을 지원하며 보통 2칸 들여쓰기를 사용한다.

# 2칸 들여쓰기
person:
  name: Benn	
  school: HY uni
  skills:
    - python
    - ruby
    
# 4칸 들여쓰기    
person:
    name: Benn	
    school: HY uni
    skills:
      - python
      - ruby

 

3. 배열(순서가 있는 리스트) 정의
배열로 여러 데이터를 표현하고 싶을 경우 - 기호를 사용해서 표현

person:
  name: Benn	
  school: HY uni
  skills:
    - python
    - ruby

4. 기타(주석, 띄어쓰기)
주석은 # 기호를 사용하고, YAML을 key-value 형태로 작성할 때 반드시 Key: 다음에 띄어쓰기가 들어가야 한다.

# 서버 정보

Server:
  name: Server