웹 애플리케이션을 구성하든, 서비스 간 데이터를 교환하든, 스프레드시트 내보내기를 분석하든, API 응답을 읽든, 구조화된 텍스트 형식으로 저장된 데이터를 마주하게 됩니다. 가장 일반적인 네 가지는 JSON, YAML, CSV, XML입니다.
각 형식은 서로 다른 목표를 염두에 두고 설계되었으며, 올바른 것을 선택하는 것은 사용 사례에 따라 달라집니다. 이 글에서는 각 형식의 개요, 모양, 사용 시점, 비교 방법을 설명합니다.
JSON — JavaScript Object Notation
JSON은 웹의 주요 데이터 교환 형식이 되었습니다. 이름과 달리 언어에 독립적이며 어디에서나 사용됩니다.
구문 예시:
{
"name": "Alice Martin",
"age": 34,
"skills": ["Python", "SQL", "Docker"],
"address": {
"city": "Lyon",
"country": "France"
}
}
주요 특징:
- 깔끔하고 읽기 쉬운 구문의 키-값 쌍
- 문자열, 숫자, 불리언, 배열, 객체, null 지원
- 표준 JSON에서는 주석 불가
- 엄격한 구문 — 후행 쉼표와 작은따옴표는 오류
일반적인 사용 사례: REST API, 설정 파일(package.json, tsconfig.json), NoSQL 데이터베이스(MongoDB), 프론트엔드와 백엔드 간 데이터 교환.
알아두면 좋은 점. JSON의 엄격한 구문은 강점이자 약점입니다. 파싱이 신뢰할 수 있고 모호하지 않게 하지만, 쉼표 하나가 빠지거나 추가 후행 쉼표가 있으면 파일 전체가 깨집니다.
YAML — YAML Ain't Markup Language
YAML은 가장 인간이 읽기 쉬운 데이터 직렬화 형식으로 설계되었습니다. 괄호 대신 들여쓰기를 사용하며, 특히 설정 파일에서 인기가 높습니다.
구문 예시:
name: Alice Martin
age: 34
skills:
- Python
- SQL
- Docker
address:
city: Lyon
country: France
주요 특징:
- 들여쓰기 기반 구조(괄호나 중괄호 없음)
#으로 주석 지원- JSON의 모든 데이터 유형 외에 날짜, 여러 줄 문자열 등도 지원
- 공백에 민감 — 잘못된 들여쓰기가 파일을 깨뜨림
일반적인 사용 사례: Docker Compose 파일, Kubernetes 매니페스트, CI/CD 파이프라인(GitHub Actions, GitLab CI), Ansible 플레이북, Hugo/Jekyll 설정.
YAML은 JSON의 상위 집합이므로, 유효한 JSON 문서는 유효한 YAML이기도 합니다. 하지만 YAML의 유연성은 양날의 검입니다. 암묵적 타입 변환(예: yes가 불리언 true로 해석되거나, 3.10이 3.1이 됨)이 많은 미묘한 버그의 원인이 됩니다.
CSV — Comma-Separated Values
CSV는 가장 단순한 구조화된 데이터 형식입니다. 테이블 데이터를 일반 텍스트로 저장하며, 각 줄이 하나의 행이고 값은 쉼표(또는 세미콜론, 탭 등의 구분자)로 구분됩니다.
구문 예시:
name,age,city,country
Alice Martin,34,Lyon,France
Bob Dupont,28,Paris,France
Carol Smith,41,London,UK
주요 특징:
- 매우 단순 — 구분자가 있는 텍스트일 뿐
- 데이터 유형 없음 — 모든 것이 문자열
- 중첩된 데이터를 나타내는 표준 방법 없음
- 공식적인 보편적 표준 없음(RFC 4180이 존재하지만 보편적으로 준수되지 않음)
- 파일 크기가 매우 작음
일반적인 사용 사례: 스프레드시트 내보내기, 데이터베이스 가져오기/내보내기, 데이터 분석(pandas, R), 간단한 데이터 교환, 로그 파일.
CSV의 단순함은 가장 큰 강점이자 가장 큰 제한입니다. 평면적인 테이블 데이터에는 완벽하지만 계층적 구조를 나타낼 수 없습니다. 에지 케이스(값 안의 쉼표, 여러 줄 필드, 인코딩 문제)로 인해 파싱이 처음 보이는 것보다 복잡합니다.
XML — Extensible Markup Language
XML은 JSON이 주류가 되기 전의 주요 데이터 교환 형식이었습니다. HTML과 유사한 태그 기반 구문을 사용하며 스키마, 네임스페이스, 변환과 같은 복잡한 기능을 지원합니다.
구문 예시:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>Alice Martin</name>
<age>34</age>
<skills>
<skill>Python</skill>
<skill>SQL</skill>
<skill>Docker</skill>
</skills>
<address>
<city>Lyon</city>
<country>France</country>
</address>
</person>
주요 특징:
- 여는 태그와 닫는 태그로 이루어진 태그 기반 구조
- 속성, 네임스페이스, 스키마(XSD), 변환(XSLT) 지원
- 주석 지원
- 다른 형식에 비해 매우 장황함
- 엄격한 검증을 갖춘 매우 잘 정의된 표준
일반적인 사용 사례: SOAP 웹 서비스, 엔터프라이즈 통합, 문서 형식(DOCX, SVG, RSS), Java/.NET 생태계의 설정 파일, 정부 및 금융 데이터 교환.
XML은 JSON이나 YAML보다 장황하지만, 스키마 검증 기능 덕분에 데이터 무결성과 시스템 간 공식 계약이 중요한 맥락에서 필수적입니다.
나란히 비교
| 특징 | JSON | YAML | CSV | XML |
|---|---|---|---|---|
| 가독성 | 좋음 | 우수 | 좋음(테이블형) | 보통 |
| 장황함 | 낮음 | 낮음 | 매우 낮음 | 높음 |
| 주석 | 불가 | 가능 | 불가 | 가능 |
| 중첩 데이터 | 지원 | 지원 | 미지원 | 지원 |
| 데이터 유형 | 기본 | 풍부 | 없음(모두 문자열) | 스키마로 |
| 스키마 검증 | JSON Schema | 표준 없음 | 없음 | XSD |
| 파일 크기 | 작은 | 작은 | 가장 작은 | 큰 |
| 파싱 속도 | 빠른 | 보통 | 빠른 | 보통 |
| 주요 영역 | Web API | DevOps 설정 | 데이터/스프레드시트 | 엔터프라이즈 |
언제 무엇을 사용할까
- JSON을 선택하세요 — Web API를 구축하거나, JavaScript/TypeScript 프로젝트의 설정을 저장하거나, 서비스 간 데이터를 교환할 때. 대부분의 현대 애플리케이션에서 기본 선택입니다.
- YAML을 선택하세요 — 사람이 자주 읽고 편집하는 설정 파일을 작성할 때. 가독성과 주석 지원으로 DevOps와 Infrastructure as Code에 이상적입니다.
- CSV를 선택하세요 — 테이블 데이터를 다루거나, 스프레드시트나 데이터베이스와 입출력하거나, 파일 크기를 최소화해야 할 때. 계층적인 것에는 피하세요.
- XML을 선택하세요 — 엔터프라이즈 시스템, SOAP API, 공식적인 스키마 검증이 필요한 맥락에서. 문서 지향 마크업(SVG나 RSS 같은)이 필요할 때도 적합합니다.
형식 간 변환
이러한 형식 간 변환은 일반적인 작업입니다. 몇 가지 유의사항이 있습니다:
- JSON에서 YAML(및 그 반대)은 YAML이 JSON의 상위 집합이므로 일반적으로 손실이 없습니다.
- CSV에서 JSON/YAML은 평면 데이터에는 잘 작동하지만, 중첩된 출력을 위한 구조에 대한 결정이 필요합니다.
- XML에서 JSON은 정보가 손실될 수 있습니다(속성, 네임스페이스, 순서). JSON에는 해당 개념이 없기 때문입니다.
- 어떤 형식에서 CSV로는 데이터가 평면이거나 의미 있게 평면화할 수 있는 경우에만 작동합니다.
팁. 형식 간 변환 시에는 항상 출력을 확인하세요. 자동 변환은 특히 XML 속성, YAML 타입 변환, CSV 인코딩 에지 케이스에서 데이터가 자동으로 손실될 수 있습니다.
더 알아보기
ToolK.io에서는 JSON, YAML, CSV, XML 간의 변환, 데이터의 포맷팅과 검증, 프로젝트에서 구조화된 데이터를 다루기 위한 관련 튜토리얼 등 무료 도구를 제공합니다.
