YAML vs. JSON vs. XML

데이터 교환과 구성 파일 형식으로 YAML, JSON, XML은 현대 소프트웨어 개발에서 가장 널리 사용되는 세 가지 형식이다.

개요 및 역사

YAML (YAML Ain’t Markup Language)

YAML은 2001년에 클라크 에반스(Clark Evans), 이니 넷(Ingy döt Net), 오렌 벤-코바(Oren Ben-Koki)에 의해 개발되었다. 원래는 “Yet Another Markup Language"의 약자였으나, 후에 “YAML Ain’t Markup Language"라는 재귀적 약자로 변경되었다. YAML은 인간 친화적인 구문과 읽기 쉬운 형식에 중점을 둔 데이터 직렬화 형식이다.

JSON (JavaScript Object Notation)

JSON은 2001년 더글라스 크록포드(Douglas Crockford)에 의해 개발되었으며, 2006년에 공식적으로 표준화되었다. JavaScript 객체 문법에 기반을 두고 있으며, 경량화된 데이터 교환 형식으로 웹 애플리케이션에서 널리 사용된다.

XML (eXtensible Markup Language)

XML은 1996년 W3C(World Wide Web Consortium)에 의해 개발되었다. HTML과 유사한 마크업 언어 구문을 사용하며, 구조화된 데이터를 표현하기 위한 목적으로 설계되었다. XML은 세 형식 중 가장 오래되었으며, 엔터프라이즈 애플리케이션에서 널리 사용되었다.

구문 및 가독성

YAML 구문

YAML은 들여쓰기를 사용하여 데이터 구조를 표현하며, 최소한의 구분 기호를 사용하여 가독성을 높인다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# YAML 예제
person:
  name: John Doe
  age: 30
  address:
    street: 123 Main St
    city: Anytown
  hobbies:
    - reading
    - hiking
    - photography
  active: true

JSON 구문

JSON은 중괄호와 대괄호를 사용하여 객체와 배열을 표현하며, 간결한 문법을 가지고 있다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
  "person": {
    "name": "John Doe",
    "age": 30,
    "address": {
      "street": "123 Main St",
      "city": "Anytown"
    },
    "hobbies": [
      "reading",
      "hiking",
      "photography"
    ],
    "active": true
  }
}

XML 구문

XML은 태그 기반 구문을 사용하여 데이터를 표현하며, 여는 태그와 닫는 태그를 모두 필요로 한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<person>
  <name>John Doe</name>
  <age>30</age>
  <address>
    <street>123 Main St</street>
    <city>Anytown</city>
  </address>
  <hobbies>
    <hobby>reading</hobby>
    <hobby>hiking</hobby>
    <hobby>photography</hobby>
  </hobbies>
  <active>true</active>
</person>

데이터 타입 지원

YAML

YAML은 가장 풍부한 데이터 타입을 지원한다:

  • 스칼라(문자열, 숫자, 불리언, null)
  • 컬렉션(리스트, 맵)
  • 복합 타입(객체)
  • 앵커와 참조(재사용 가능한 노드)
  • 다중 문서
  • 복잡한 키
  • 명시적 타입 태그
  • 날짜/시간 타입 내장
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# YAML의 다양한 데이터 타입
string: "Hello, World"
number: 42
float: 3.14159
boolean: true
date: 2023-05-01
null_value: null
list:
  - item1
  - item2
complex:
  key1: value1
  key2: value2
# 앵커와 참조
defaults: &defaults
  timeout: 30
  retries: 3
custom:
  <<: *defaults  # defaults의 모든 속성을 상속
  timeout: 60    # timeout 값만 오버라이드

JSON

JSON은 제한된 데이터 타입을 지원한다:

  • 문자열
  • 숫자
  • 객체(키-값 쌍)
  • 배열
  • 불리언(true/false)
  • null
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
  "string": "Hello, World",
  "number": 42,
  "float": 3.14159,
  "boolean": true,
  "null_value": null,
  "list": ["item1", "item2"],
  "complex": {
    "key1": "value1",
    "key2": "value2"
  }
}

XML

XML은 자체적으로는 데이터 타입이 없지만, XML Schema(XSD)를 통해 다양한 데이터 타입을 정의할 수 있다:

  • 문자열
  • 정수
  • 부동 소수점
  • 날짜/시간
  • 불리언
  • 사용자 정의 타입
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<data>
  <string>Hello, World</string>
  <number>42</number>
  <float>3.14159</float>
  <boolean>true</boolean>
  <null_value xsi:nil="true"/>
  <list>
    <item>item1</item>
    <item>item2</item>
  </list>
  <complex>
    <key1>value1</key1>
    <key2>value2</key2>
  </complex>
</data>

주요 기능 비교

  1. 주석 지원

    • YAML: 완전한 주석 지원 (# 문자 사용)
    • JSON: 공식적으로 주석을 지원하지 않음 (일부 확장 형식에서는 지원)
    • XML: 주석 지원 (<!-- 주석 -->)
  2. 스키마 검증

    • YAML: 공식 스키마 검증은 약함, 서드파티 도구 필요
    • JSON: JSON Schema를 통한 검증 지원
    • XML: XML Schema(XSD), DTD, RelaxNG 등 강력한 스키마 검증 메커니즘 제공
  3. 네임스페이스

    • YAML: 기본 지원 없음
    • JSON: 기본 지원 없음
    • XML: 네임스페이스 완벽 지원 (충돌 방지, 모듈화)
  4. 참조 및 재사용

    • YAML: 앵커(&)와 별칭(*)을 통한 노드 재사용 지원
    • JSON: 기본 지원 없음
    • XML: ID/IDREF, XInclude 등을 통한 참조 지원
  5. 다중 문서

    • YAML: 단일 파일에 여러 문서 지원 (--- 구분자 사용)
    • JSON: 기본 지원 없음
    • XML: 기본 지원 없음 (처리 지시문 사용 가능)

성능 및 효율성

  1. 파일 크기

    • YAML: 중간 (들여쓰기 구문으로 일부 간결함)
    • JSON: 작음 (간결한 구문)
    • XML: 큼 (태그 중복, 열고 닫는 태그 필요)
  2. 파싱 속도

    • YAML: 느림 (복잡한 구문 규칙)
    • JSON: 빠름 (단순한 구문, 네이티브 브라우저 지원)
    • XML: 중간 (광범위한 라이브러리 지원이지만 구문 분석 오버헤드)
  3. 메모리 사용

    • YAML: 중간
    • JSON: 낮음
    • XML: 높음

사용 사례 및 적합한 상황

YAML에 적합한 상황

  • 구성 파일 (Docker, Kubernetes, CI/CD 파이프라인)
  • 사람이 직접 편집하는 데이터 파일
  • 복잡한 계층 구조가 있지만 가독성이 중요한 경우
  • 재사용 가능한 구성 요소가 필요한 경우
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# Kubernetes 배포 설정 예제
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

JSON에 적합한 상황

  • API 응답 형식
  • 웹 애플리케이션 데이터 교환
  • 브라우저와의 상호 작용
  • 간단한 구성 파일
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// REST API 응답 예제
{
  "status": "success",
  "data": {
    "users": [
      {
        "id": 1,
        "name": "John Doe",
        "email": "john@example.com"
      },
      {
        "id": 2,
        "name": "Jane Smith",
        "email": "jane@example.com"
      }
    ],
    "totalCount": 2
  }
}

XML에 적합한 상황

  • 엔터프라이즈 시스템 통합
  • 복잡한 문서 형식(DOCX, XLSX, SVG)
  • 강력한 스키마 검증이 필요한 경우
  • 메타데이터가 많은 문서
  • SOAP 웹 서비스
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<!-- SOAP 웹 서비스 요청 예제 -->
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:web="http://www.example.org/webservice">
  <soapenv:Header/>
  <soapenv:Body>
    <web:GetUserRequest>
      <web:userId>12345</web:userId>
    </web:GetUserRequest>
  </soapenv:Body>
</soapenv:Envelope>

생태계 및 도구 지원

YAML

  • 파서: PyYAML(Python), js-yaml(JavaScript), SnakeYAML(Java)
  • 편집기 지원: 대부분의 코드 편집기에서 구문 강조 지원
  • 검증 도구: yamllint, Kwalify

JSON

  • 파서: 대부분의 프로그래밍 언어에 내장
  • 브라우저 지원: 네이티브 지원 (JSON.parse, JSON.stringify)
  • 검증 도구: JSON Schema, jsonlint
  • 시각화 도구: 다양한 JSON 뷰어 존재

XML

  • 파서: DOM, SAX, StAX, JAXB(Java)
  • 쿼리 언어: XPath, XQuery
  • 변환: XSLT
  • 스키마: XSD, DTD, RelaxNG
  • 편집기: 전용 XML 편집기, IDE 통합

보안 고려사항

YAML

  • YAML 파서의 언어별 구현에 취약점 존재 가능
  • 원격 코드 실행 취약점(특히 Python의 PyYAML에서 ! 지시문 사용 시)
  • 신뢰할 수 없는 소스의 YAML 파일 처리 시 주의 필요

JSON

  • 일반적으로 안전하지만 JSON 파싱 과정에서 취약점 발견 사례 있음
  • JSON 주입 공격 가능성
  • eval() 사용 시 코드 실행 위험

XML

  • XML 외부 엔티티(XXE) 공격
  • XML 폭탄(Billion Laughs) 공격
  • 복잡한 XML 보안 모델로 인한 구성 오류 가능성

각 형식의 장단점 요약

YAML

장점:

  • 뛰어난 가독성과 작성 용이성
  • 참조와 앵커를 통한 반복 최소화
  • 주석 지원
  • 복잡한 구조 표현에 적합
  • 다양한 데이터 타입 지원

단점:

  • 들여쓰기 오류로 인한 문제 발생 가능
  • 복잡한 구문 규칙
  • 상대적으로 느린 파싱 속도
  • 간혹 예기치 않은 타입 변환

JSON

장점:

  • 단순하고 직관적인 구문
  • 빠른 파싱 속도
  • 브라우저 네이티브 지원
  • 프로그래밍 언어 간 높은 호환성
  • 웹 API에 이상적

단점:

  • 주석 미지원
  • 제한된 데이터 타입
  • 반복적인 구조에 비효율적
  • 가독성이 YAML보다 떨어짐

XML

장점:

  • 강력한 스키마 검증
  • 네임스페이스 지원
  • 다양한 처리 도구 및 기술 존재
  • 복잡한 문서 구조에 적합
  • 메타데이터 표현에 우수

단점:

  • 장황한 구문으로 인한 가독성 저하
  • 큰 파일 크기
  • 처리 오버헤드
  • 작성 및 편집이 번거로움

YAML vs. JSON vs. XML

특성YAMLJSONXML
기본 정보
전체 이름YAML Ain’t Markup LanguageJavaScript Object NotationeXtensible Markup Language
개발 연도2001년2001년1996년
파일 확장자.yml,.yaml.json.xml
MIME 타입application/yamlapplication/jsonapplication/xml
구문 및 구조
기본 구문 구조들여쓰기 기반중괄호 및 대괄호 기반태그 기반
가독성높음중간낮음
주석 지원아니오 (표준)
들여쓰기 중요성매우 중요 (의미적)선택적 (가독성만)선택적 (가독성만)
데이터 타입 및 기능
기본 데이터 타입광범위 (문자열, 숫자, 불리언, null, 날짜 등)제한적 (문자열, 숫자, 불리언, null)스키마에 의해 정의됨
배열/리스트 표현하이픈 기호 또는 괄호대괄호반복 요소
객체/맵 표현들여쓰기 또는 중괄호중괄호중첩 태그
데이터 참조/재사용앵커 및 별칭지원 안 함ID/IDREF, XInclude
다중 문서지원 (--- 구분자)지원 안 함지원 안 함
네임스페이스지원 안 함지원 안 함지원
성능 및 효율성
파일 크기중간작음
파싱 속도느림빠름중간
메모리 사용중간낮음높음
작성 편의성높음중간낮음
검증 및 스키마
스키마 검증제한적JSON SchemaXSD, DTD, RelaxNG
타입 안전성중간낮음높음
문서 구조 정의제한적제한적강력함
생태계 및 사용
웹 브라우저 지원제한적 (라이브러리 필요)네이티브완전 지원
프로그래밍 언어 지원광범위거의 모든 언어광범위
API 사용드물게매우 흔함SOAP 및 특정 시스템
구성 파일 사용매우 흔함흔함드물게
주요 사용 사례
주요 적용 분야구성 파일, CI/CD, 컨테이너웹 API, 클라이언트-서버 통신문서 형식, 엔터프라이즈 통합
대표적 사용 기술Kubernetes, Docker, AnsibleREST API, 웹 서비스SOAP, XHTML, SVG, 오피스 문서
보안 측면
주요 보안 위험원격 코드 실행 (특정 구현)JSON 주입XXE, XML 폭탄
보안 복잡성중간낮음높음

용어 정리

용어설명

참고 및 출처