# XML, YAML, JSON

#### **1. XML, YAML, JSON이란?**

XML, YAML, JSON은 **데이터를 표현하거나 교환하기 위한 포맷**으로, 각기 다른 방식으로 데이터를 구조화하고 표현합니다. 이들은 다양한 시스템과 애플리케이션 간의 데이터 교환, 구성 파일 작성, 데이터 저장 등에 사용됩니다.

* **XML (eXtensible Markup Language)**: 태그 기반의 마크업 언어로, 데이터를 계층적으로 표현하며 데이터 구조화 및 검증에 적합합니다.
* **YAML (YAML Ain't Markup Language)**: 들여쓰기를 통해 데이터를 간결하고 사람이 읽기 쉽게 표현하는 언어입니다.
* **JSON (JavaScript Object Notation)**: 키-값 쌍을 기반으로 한 데이터 표현 방식으로, REST API 등에서 경량 데이터 교환을 위해 널리 사용됩니다.

***

#### **2. 각각의 상세 설명**

***

**2.1 XML (eXtensible Markup Language)**

**XML이란?**

* XML은 데이터를 저장하고 전송하기 위해 설계된 마크업 언어입니다.
* 트리 구조로 데이터를 표현하며 태그를 사용해 데이터의 의미를 정의합니다.

**XML의 주요 특징**:

1. **태그 기반**: 시작 태그와 종료 태그로 데이터를 감싸며 데이터 구조를 정의.

   ```xml
   <person>
       <name>John</name>
       <age>30</age>
       <city>New York</city>
   </person>
   ```
2. **확장 가능**: 사용자가 태그를 정의하여 데이터를 유연하게 표현.
3. **검증 가능**: DTD 또는 XSD를 통해 XML 문서의 구조를 검증할 수 있음.

**장점**:

* 복잡한 데이터 구조 표현 가능.
* 데이터 검증 도구 지원.
* 다양한 기술 및 도구와의 통합 가능.

**단점**:

* 태그가 많아 데이터 크기가 커짐.
* 복잡한 구조로 인해 가독성 낮음.

**사용 사례**:

* 웹 서비스(SOAP), 구성 파일(`web.xml`), 전자 문서 관리(SVG, RSS).

***

**2.2 YAML (YAML Ain't Markup Language)**

**YAML이란?**

* YAML은 사람이 읽기 쉽고 쓰기 쉬운 데이터 직렬화 형식입니다.
* 들여쓰기를 통해 계층 구조를 표현하며, 간결성과 가독성을 중시합니다.

**YAML의 주요 특징**:

1. **들여쓰기 기반**: 데이터를 들여쓰기와 콜론(`:`)으로 계층 구조를 표현.

   ```yaml
   person:
     name: John
     age: 30
     city: New York
   ```
2. **다양한 데이터 표현**:
   * 리스트:

     ```yaml
     shopping_list:
       - apples
       - bananas
       - oranges
     ```
   * 맵:

     ```yaml
     database:
       host: localhost
       port: 5432
     ```
3. **주석 지원**: `#`을 사용해 주석 작성 가능.

**장점**:

* 간결하고 사람이 읽기 쉬움.
* JSON보다 가독성이 뛰어남.
* 구성 파일 작성에 적합.

**단점**:

* 들여쓰기에 민감하여 실수하기 쉬움.
* 복잡한 데이터 표현에는 제한적.

**사용 사례**:

* 구성 파일(Docker Compose, Kubernetes 설정).
* 애플리케이션 설정(CI/CD 도구, Python 설정 파일).

***

**2.3 JSON (JavaScript Object Notation)**

**JSON이란?**

* JSON은 데이터를 객체와 배열의 형태로 표현하며, 경량 데이터 전송에 최적화된 형식입니다.
* REST API 및 웹 애플리케이션에서 데이터 교환 표준으로 널리 사용됩니다.

**JSON의 주요 특징**:

1. **키-값 쌍 기반**:

   * 데이터를 `{}`로 감싸고, 키와 값을 `:`로 구분.

   ```json
   {
       "name": "John",
       "age": 30,
       "city": "New York"
   }
   ```
2. **배열 표현**:

   * 대괄호(`[]`)를 사용해 배열 표현.

   ```json
   {
       "shopping_list": ["apples", "bananas", "oranges"]
   }
   ```
3. **데이터 타입 제한**:
   * 문자열, 숫자, 불리언, 배열, 객체, null 만 지원.

**장점**:

* 간단하고 경량화된 구조.
* 대부분의 프로그래밍 언어에서 쉽게 파싱 및 생성 가능.
* REST API에서 표준 데이터 교환 형식.

**단점**:

* 주석 미지원.
* 복잡한 데이터 구조 표현에 제한적.

**사용 사례**:

* RESTful API.
* 웹 애플리케이션과 서버 간 데이터 교환.
* NoSQL 데이터베이스(MongoDB, Firebase).

***

#### **3. XML, YAML, JSON 비교**

| **특징**        | **XML**            | **YAML**                     | **JSON**         |
| ------------- | ------------------ | ---------------------------- | ---------------- |
| **데이터 표현 방식** | 태그 기반              | 들여쓰기 기반                      | 키-값 쌍 기반         |
| **가독성**       | 태그 중첩으로 복잡할 수 있음   | 가장 가독성 높음                    | 중첩이 많으면 가독성 떨어짐  |
| **데이터 크기**    | 가장 큼               | 중간                           | 가장 작음            |
| **유연성**       | 사용자 정의 태그 사용 가능    | 다양한 데이터 표현 가능                | 제한된 데이터 타입       |
| **검증 도구**     | DTD, XSD           | 제한적                          | JSON Schema      |
| **주석 지원**     | 지원                 | 지원                           | 미지원              |
| **사용 사례**     | SOAP, 구성 파일, 문서 관리 | 구성 파일(Docker, Kubernetes 설정) | REST API, 데이터 교환 |
| **속도**        | 느림                 | 빠름                           | 매우 빠름            |

***

#### **4. 언제 어떤 형식을 선택할까?**

1. **복잡한 데이터 구조**:
   * XML: 태그와 계층 구조로 복잡한 데이터 표현.
   * 예: SOAP, 문서 관리.
2. **구성 파일 작성**:
   * YAML: 간결성과 가독성을 중시.
   * 예: Docker Compose, CI/CD 도구 설정.
3. **웹 애플리케이션 데이터 교환**:
   * JSON: 간결하고 경량 데이터 전송에 최적화.
   * 예: RESTful API, 웹-서버 간 데이터 교환.

***

#### **5. 요약**

* **XML**: 복잡한 데이터와 문서 관리에 적합.
* **YAML**: 간단한 구성 파일과 설정 파일에 적합.
* **JSON**: 경량 데이터 교환과 REST API에 최적화.
