데이터 직렬화 형식 (JSON, YAML, XML, TOML), 왜 필요하고 언제 사용하나?

Lee Yechan·2023년 7월 11일
0

프로그래밍 지식들

목록 보기
1/10
post-thumbnail

오늘의 글을 쓰는 이유

오늘은 슬랙 봇 API를 이용해봤는데, 결국 원하는대로 구현이 되기는 했지만 생각보다 구현 속도가 너무 오래 걸렸다.

결론적으로 말하자면, slack bot API에 대한 이해가 부족했던 탓과, JSON에 대한 이해가 부족했던 탓이다.

따라서 오늘은 오늘의 삽질을 다른 날에 반복하지 않도록, 그동안 아는 것이라고 생각했지만 제대로 알지 못했던 데이터 직렬화 형식들에 대해 정리해보려고 한다.

API를 호출하고 만들 때 필수적으로 사용하는 친구이니만큼, 이번에 확실히 개념과 사용 예를 정리해야겠다.

데이터 직렬화 형식

json, yaml, xml, … 많이들 들어봤지만 무엇인지 확실하게 설명하기는 어려울 수 있을 것이다. 이것들은 데이터를 직렬화할 때 사용하는 데이터 형식 중 하나이다. 데이터를 직렬화할 때 사용하는 데이터 형식들들에는 다음과 같은 것들이 있다.

  • JSON
  • XML
  • YAML
  • TOML

이것들 외에도 다른 형식들이 있겠으나, 많이 사용되는 것들로만 추렸다.

데이터 직렬화는 무엇이고 왜 필요한가?

데이터 직렬화(serialization)이란 메모리의 데이터를 디스크에 저장하거나, 네트워크 통신에 사용하기 위한 형식으로 변환하는 것을 말한다.

역직렬화(deserialization)이란 그 반대 개념으로, 디스크나 네트워크에서 받은 데이터를 메모리에 쓸 수 있도록 변환하는 것이다.

데이터 직렬화는 데이터의 전송/저장 혹은 설정 파일 등에 사용된다.

참조 형식의 값으로의 변환

생각해보면 우리가 쓰는 코드들에 담긴 데이터들은 모두 값이 담긴 것이 아니다.

  • 실제 값이 담긴 데이터
  • 참조 값이 담긴 데이터

두 가지의 종류가 존재한다.

그렇다면 만약

class A:
    a = 1  # 값 형식
    b = [3, 4, 5]  # 참조 형식

이와 같은 python 코드가 있다고 가정한다면, 이 값을 다른 프로그램에게 넘길 경우나 스토리지에 저장할 경우는 어떻게 해야 할까?

만약 정말 naive하게 값만을 저장한다고 하면, a0x01의 값으로 정확히 전송/저장된다고 하더라도 참조 형식으로 저장된 b는 누구도 모르는 어떠한 값, 운영체제에 따라 그 때의 상황에 따라 저장된 임의의 값으로 저장되게 될 것이다.

이 값은 그 당시 운영체제에게만 의미가 있는 값이고, 네트워크를 타고 통신하거나 스토리지에 저장되어 나중에 꺼내볼 때에는 거의 의미 없는 값이다.

따라서 직렬화를 하는 것은 참조 값을 실제 값으로 바꿔 데이터가 전송/저장되는 것이 의미 있도록 만든다는 의미가 있다.

전송하기 쉬운 형태로의 변환

데이터 직렬화는 객체를 바이트 스트림으로 바꾸는 프로세스로, 이를 통해 전송이 용이하도록 한다.

데이터를 직렬화하면 일반적으로 일직선의 연속된 값들의 집합 형태를 띄게 되고, 원래의 데이터보다 더 적은 용량을 차지하게 될 수도 있기 때문에, 컴퓨터가 처리하기에 편리한 형태가 되게 된다.

데이터 직렬화를 적용한 데이터에 데이터 역직렬화를 진행하면 원래의 데이터로 다시 복원되므로, 처리 속도, 네트워크 대역폭, 저장 용량 등을 고려한다면 데이터 직렬화의 필요성이 드러나는 것이다.

데이터의 공유

직렬화된 데이터는 서로 다른 프로그래밍 언어 또는 컴퓨터가 공통적으로 이해하는 포맷이라는 점에서 의미가 있다.

예를 들어 서버와 클라이언트가 서로 통신하는 것처럼 서로 다른 두 프로세스가 통신에 JSON을 사용하거나, XML로 이뤄진 설정 파일을 서로 다른 언어로 만들어진 여러 개의 프로그램이 공유해 읽는 등의 사례가 있을 수 있다.

무언가 하나로 약속된 데이터 형식으로써 두 개의 다른 인터페이스를 가진 것들이 서로 통신, 이해할 수 있다는 점에서 데이터 직렬화 형식은 의미를 가진다.

데이터의 구조화와 이해의 용이성 증진

위에서 언급한 JSON, YAML, XML, TOML은 모두 사람이 읽을 수 있는 텍스트 기반의 직렬화 형식이다. 이를 통해 사람도 이 데이터가 어떤 데이터인지 구조화하여 쉽게 파악할 수 있다.

하지만 예를 들어 python에서 객체를 직렬화할 때 사용하는 pickle 모듈의 경우 바이너리로 데이터를 직렬화하므로, 이와 같은 경우에는 사람이 읽기 쉽지 않을 것이다.


JSON이란?

(json의 예제)

// 출처: https://medium.com/codingthesmartway-com-blog/create-a-rest-api-with-json-server-36da8680136d
// medium - Create A REST API With JSON Server

{
  "employees": [
    {
      "id": 1,
      "first_name": "Sebastian",
      "last_name": "Eschweiler",
      "email": "sebastian@codingthesmartway.com"
    },
    {
      "id": 2,
      "first_name": "Steve",
      "last_name": "Palmer",
      "email": "steve@codingthesmartway.com"
    },
    {
      "id": 3,
      "first_name": "Ann",
      "last_name": "Smith",
      "email": "ann@codingthesmartway.com"
    }
  ]
}

JSON is a text syntax that facilitates structured data interchange between all programming languages.
ECMA International, ECMA-404

JSON은 JavaScript Object Notation의 줄임말으로, 말 그대로 Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷이다.

JSON은 객체를 직렬화하는 일반적인 방법으로 자주 사용되고 있으며, 일반적으로 웹 양식 등의 임시 데이터를 저장할 때, 데이터 모델을 간소화할 때, 그리고 특히 웹 어플리케이션에서 데이터를 전송할 때 사용된다.


JSON 이름에 Javascript라는 언어 이름이 들어간다고 하더라도, 대부분의 프로그래밍 언어에서 JSON 형식을 읽고 이해하며, 쓸 수 있도록 (parse, stringify) 라이브러리로써 지원하고 있다.

javascript JSON

python json 모듈 - JSON 인코더와 디코더

go JSON


JSON은 키:값의 형태로 이뤄져 있으며, 가장 상위 레벨은 {}으로 감싼다.

JSON의 자료형은 string, number, bool, null, object, array로 이뤄져 있으며 이는 JSON이 javascript에서 유래한 만큼 javascript와 흡사한 특징을 보인다.

object는 중괄호({})로 감싸 표현하고, array는 대괄호([])로 감싸며 이들 안의 쌍과 값들은 반점(,)으로 구분한다.

object는 key/value 상들의 비순서화된 set이며, array는 순서화된 collection이다.


JSON은 다음과 같은 장단점을 가진다.

장점

  • 저장 용량을 적게 차지한다
  • 파싱이 간편
  • 처리 속도가 빠르다
  • 사용하기 쉽다
  • 가독성이 좋다

단점

  • 문법 오류에 취약
  • 주석을 다는 것이 불가

XML이란?

(xml의 예제)

<!-- 출처: https://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/xsd-configuration.html -->
<!-- Sping - XML Schema-based configuration -->

<!-- target bean to be referenced by name -->
<bean id="testBean" class="org.springframework.beans.TestBean" scope="prototype">
    <property name="age" value="10"/>
    <property name="spouse">
        <bean class="org.springframework.beans.TestBean">
            <property name="age" value="11"/>
        </bean>
    </property>
</bean>

<!-- will result in 10, which is the value of property 'age' of bean 'testBean' -->
<bean id="testBean.age" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>

XML이란 eXtensible Markup Language의 약자로, 웹 사이트, 데이터베이스, 어플리케이션 등과 같은 컴퓨터 시스템 간 정보 교환에 사용되거나, 문서를 구조화하여 정리하는 용도 등으로 사용된다.

HTML의 한계를 극복할 목적으로 만들어졌다고 한다. (extensible markup language, 확장 마크업 언어)

현재는 JSON에 밀려 많이 사용하지 않는 추세이나, 레거시 시스템 등에서는 아직도 사용 중이다.


XML에서는 태그라고 하는 마크업 기호(예시: <title>This is Title.</title>을 사용하여 데이터를 정의한다.

또한 XML element는 <person age="22"></person>와 같이 속성을 가질 수 있다.


여기까지 보면 XML이 HTML과 꽤 닮았다는 생각이 들 수 있는데,

  • HTML의 용도는 데이터를 표시하는 것인 반면 XML은 데이터를 저장하고 전송하는 데에 목적이 있다는 점
  • HTML에는 미리 정의된 태그가 있지만 XML에서는 사용자가 고유한 태그를 만들고 정의할 수 있다는 점
  • HTML에서는 대소문자를 구분하지 않지만 XML에서는 대소문자를 구분한다는 점
  • HTML과 달리 XML에서는 닫는 태그가 필수인 점
  • HTML은 정적 콘텐츠를 표시하는 것으로 제한되지만 XML은 동적 콘텐츠를 표시하는 데 사용할 수 있다는 점
  • HTML에 비해 XML에서 오류에 더 민감하다는 점

등등에서 XML은 HTML과 다르다.


다음은 XML의 장단점이다.


장점

  • XML 파일에서 문서를 자동으로 생성하는 데 사용할 수 있는 도구가 많이 존재
  • 주석을 사용 가능
  • 태그를 새로 만들어 추가할 수 있으므로 확장성이 좋음

단점

  • 태그 때문에 실 데이터 이상의 문서의 양이 많이 필요함
  • 배열 구조, 반복 구조의 경우 불필요한 데이터가 반복됨
  • 데이터의 파싱이 비교적 느림

YAML이란?

(yaml의 예시)

# 출처: https://docs.docker.com/compose/gettingstarted/
# docker docs - getting started

services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_DEBUG: "true"
  redis:
    image: "redis:alpine"

YAML은 JSON의 불편함을 해소하기 위해 만들어진 마크업 언어로, 구성(configuration) 파일 작성에 자주 사용된다.

YAML은 YAML Ain’t Markup Language 또는 Yet Another Markup Language의 줄임말이라고 한다.

YAML 파일은 .yml 또는 .yaml 확장자를 사용한다.


YAML 파일은 Flutter의 dart 패키지 관리, Spring Boot의 설정 파일 등에 사용되며,

IaC(Infrastructure as Code) 개념을 구현하도록 k8s, docker, 각종 CI 서버들을 configuration하는 데에도 사용된다.


YAML 파일을 처음 보면 파이썬과 그 모습이 흡사하다고 생각이 들 수 있을 것 같다.

YAML 파일의 구조는 맵(key:value) 또는 리스트([])이며, 들여쓰기로 상/하위 항목을 구분한다는 점, # 문자로 커멘트를 남긴다는 점 등에서 파이썬과 유사하다.

YAML 파일의 문서는 세 개의 대쉬(---)로 파일을 시작해 문서의 끝에는 세 개의 점()이 사용된다.

아래 YAML의 specification 링크를 남기니 자세한 문법은 아래를 참고해보자.

YAML version1.2 Specification


JSON은 기존의 XML을 대체하고 널리 쓰이는 표현으로 받아들여졌지만,

  • 주석을 지원하지 않는 점,
  • 를 일일이 이스케이핑해야 했다는 점,
  • 중괄호를 모두 닫아야 한다는 점,
  • 타입을 명시할 수 없다는 점

등이 단점으로 지적되었고, 이로써 YAML이 탄생할 수 있는 배경이 되었다고 한다.


장점

  • 가독성이 좋다.
  • 간결하다.
  • JSON의 사용법을 알고 있다면 쉽게 배울 수 있다.
  • 문서를 구분하는 기능이 존재하여 한 파일에 여러 문서를 작성할 수 있다.

단점

  • 데이터 직렬화가 불편하다.
  • 데이터 전송, api 등에서는 거의 쓰이지 않는다.

TOML이란?

(toml의 예시)

# 출처: https://bwaycer.github.io/hugo_tutorial.hugo/overview/configuration/
# configuring hugo

contentDir = "content"
layoutDir = "layouts"
publishDir = "public"
buildDrafts = false
baseURL = "http://yoursite.example.com/"
canonifyURLs = true

[taxonomies]
  category = "categories"
  tag = "tags"

[params]
  description = "Tesla's Awesome Hugo Site"
  author = "Nikola Tesla"

TOML은 Tom이라는 사람이 만들었다고 해서 붙여진 이름이다. TOML은 Tom’s Obvious, Minimal Language의 줄임말이라고 한다.

참 개발자들 이런 것 참 좋아하는 것 같다. 앞에서 살펴본 YAML(YAML Ain’t Markup Language, Yet Another Markup Language)부터 시작해서, LINUX(Linux Is Not UniX), WYSIWYG(What You See Is What You Get), GNU(GNU’s Not Unix), B.A.T.M.A.N(Better Approach To Mobile Ad-hoc Networking), …


TOML은 구성(configuration) 데이터 저장을 목적으로 만들어졌으며, 쉽게 읽고 쓰며 딕셔너리에 모호함 없이 매핑되도록 설계되었다고 한다.

TOML은 JSON을 비롯한 다른 형식에는 없는 여러 기능을 지원한다.

TOML은 앞서 소개한 세 친구들보다 대중적이지는 않아 호환되는 시스템이 그렇게 많지는 않지만, TOML을 사용하면 깊이 중첩된 데이터 구조를 빠르고 간결하게 정의할 수 있다.


TOML 형식 파일은 키/값 쌍으로 구성되며, 키는 문자열이고 값은 여러 형식 중 하나이다.

키에는 “”을 사용하지 않지만 항상 문자열로 해석되며, 값은 정수, 실수, 부울, 다양한 날짜,시간 값, 그리고 배열과 인라인 테이블 값이 될 수 있다.


장점

  • 간단하다.

단점

  • 대중적이지 않아 라이브러리를 찾기 비교적 어렵다.
  • 특정 경우에서 문법이 복잡할 수 있다.

references

[데이터 직렬화 형식](https://namu.wiki/w/데이터 직렬화 형식)

직렬화(Serialization), 역직렬화(Deserialization)란?

ECMA International Standard ECMA-404 The JSON Data Interchange Syntax

API 데이터 폼의 종류

JSON

JSON으로 작업하기

JSON(JavaScript Object Notation) 정의, 구조, 장단점

JSON이란 무엇일까?

XML이란 무엇인가요?

XML과 JSON의 특징, 공통점, 차이점

YAML

파이썬 앱 구성을 더 쉽게⋯TOML의 이해와 기본 활용

TOML

profile
이예찬

0개의 댓글