XML vs JSON: API와 설정 파일을 위한 데이터 형식 이해하기
XML과 JSON을 비교하고, 각각을 언제 사용해야 하는지 알아보며, 구조화된 데이터를 변환, 검증, 쿼리하는 도구를 마스터하세요.
외부와 통신하는 모든 애플리케이션은 어떤 형식의 구조화된 데이터를 주고받습니다. XML은 2000년대를 주름잡았고, JSON은 2010년대에 그 자리를 이어받았습니다. 하지만 XML은 사라지지 않았습니다 — SOAP API, RSS 피드, SVG 그래픽, Android 레이아웃, 그리고 수많은 엔터프라이즈 시스템에서 여전히 활발히 사용되고 있습니다. 두 형식을 모두 이해하면 더 다재다능한 개발자가 될 수 있습니다.
JSON 한눈에 보기
JSON(JavaScript Object Notation)은 현대 웹 API의 공용어입니다. 대부분의 프로그래밍 언어에서 사용하는 데이터 타입과 직접적으로 대응됩니다:
{
"user": {
"id": 42,
"name": "Alice Chen",
"roles": ["admin", "editor"],
"active": true,
"score": 98.6,
"avatar": null
}
}
타입: string, number, boolean, null, array, object.
JSON은 간결하고 사람이 읽기 쉬우며, 모든 언어에서 손쉽게 파싱할 수 있습니다. REST API, 설정 파일, 브라우저 스토리지의 기본 형식으로 사용됩니다.
XML 한눈에 보기
XML(eXtensible Markup Language)은 데이터를 태그가 달린 요소들의 트리 구조로 표현합니다:
<?xml version="1.0" encoding="UTF-8"?>
<user id="42">
<name>Alice Chen</name>
<roles>
<role>admin</role>
<role>editor</role>
</roles>
<active>true</active>
<score>98.6</score>
</user>
XML은 장황하지만 표현력이 풍부합니다. 속성(위의 id="42" 같은), 네임스페이스(어휘 혼합을 위한), 주석, 처리 명령어, 그리고 엄격한 검증을 위한 스키마를 지원합니다.
나란히 비교하기
| 기능 | JSON | XML |
|---|---|---|
| 장황함 | 간결 | 장황 |
| 데이터 타입 | 6가지 기본 타입 | 모든 것이 텍스트 |
| 주석 | ❌ 미지원 | ✅ <!-- --> |
| 속성 | ❌ 없음 | ✅ 있음 |
| 네임스페이스 | ❌ 없음 | ✅ 있음 |
| 스키마 | JSON Schema | XSD, DTD, RelaxNG |
| 쿼리 언어 | JSONPath, jq | XPath, XQuery |
| XSLT 변환 | ❌ | ✅ |
| 사람이 읽기 쉬움 | 높음 | 보통 |
| 파싱 복잡도 | 낮음 | 높음 |
JSON을 사용해야 할 때
- REST API (사실상 표준)
- 브라우저
localStorage/sessionStorage - 설정 파일 (
package.json,tsconfig.json) - NoSQL 문서 저장소 (MongoDB, Firestore)
- 마이크로서비스 간 통신
- 빠르고 가벼운 데이터 교환이 필요한 모든 곳
XML을 사용해야 할 때
- SOAP 웹 서비스 (금융, 의료, 정부)
- RSS 및 Atom 피드
- SVG 그래픽
- Android 리소스 파일 (레이아웃, 문자열, 매니페스트)
- Office 문서 형식 (
.docx,.xlsx는 XML을 포함한 ZIP 파일) - 혼합 콘텐츠가 필요할 때 (인라인 마크업이 있는 텍스트)
- JSON으로 마이그레이션하지 않은 엔터프라이즈 시스템
형식 간 변환
XML을 JSON으로 변환하는 것은 1:1 매핑이 거의 불가능합니다 — XML에는 속성, 텍스트 노드, 네임스페이스처럼 JSON에 존재하지 않는 개념이 있기 때문입니다. 일반적인 전략은 다음과 같습니다:
속성을 프로퍼티로 변환
<user id="42" active="true">Alice</user>
다음과 같이 변환될 수 있습니다:
{ "@id": "42", "@active": "true", "#text": "Alice" }
또는 평탄화하면:
{ "id": 42, "active": true, "name": "Alice" }
올바른 방식은 사용 목적에 따라 다릅니다. 속성 처리 옵션을 포함한 변환 작업에는 XML to JSON Converter를 이용하세요.
JSON Schema로 JSON 검증하기
JSON Schema를 사용하면 JSON 문서의 예상 구조를 정의할 수 있습니다:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["id", "name", "email"],
"properties": {
"id": { "type": "integer", "minimum": 1 },
"name": { "type": "string", "minLength": 1 },
"email": { "type": "string", "format": "email" },
"roles": {
"type": "array",
"items": { "type": "string" }
}
}
}
JSON Schema Validator로 JSON 문서를 스키마에 맞게 검증하고, 구조적 오류가 프로덕션에 반영되기 전에 잡아내세요.
JSONPath: 중첩 데이터 쿼리하기
JSONPath는 JSON에서 XPath가 XML에서 하는 역할과 같습니다. 쿼리 문법:
$.store.book[*].author — 모든 저자
$.store.book[0].title — 첫 번째 책 제목
$.store.book[?(@.price < 10)] — 10달러 미만의 책
$..price — 모든 곳의 price 값
XML의 XPath 동등 표현:
/store/book/author — 모든 저자
/store/book[1]/title — 첫 번째 책 제목
/store/book[@price < 10] — 10달러 미만의 책
//price — 모든 곳의 price 값
포맷팅과 보기 좋게 출력하기
두 형식 모두 최소화하면 읽기 어려워집니다. 디버깅과 사람이 검토할 때는 항상 보기 좋게 출력하세요.
최소화된 JSON:
{"user":{"id":42,"name":"Alice Chen","roles":["admin","editor"]}}
보기 좋게 출력된 JSON (2칸 들여쓰기):
{
"user": {
"id": 42,
"name": "Alice Chen",
"roles": [
"admin",
"editor"
]
}
}
JSON Formatter를 사용하면 JSON을 즉시 보기 좋게 출력하거나, 최소화하거나, 검증할 수 있습니다. 두 JSON을 비교할 때는 JSON Diff로 변경된 내용을 정확히 확인하세요.
흔한 실수들
JSON
- 후행 쉼표 — JSON에서는 유효하지 않습니다 (JavaScript에서는 유효함)
- 작은따옴표 — JSON은 문자열에 큰따옴표를 사용해야 합니다
- 숫자를 문자열로 처리 —
"42"≠42; 일관성을 유지하세요 - 깊은 중첩 — 읽기 어렵고 쿼리하기 힘듭니다; 가능한 한 평탄화하세요
XML
- 이스케이프되지 않은 문자 —
<,>,&,",'는 엔티티로 이스케이프해야 합니다 - 시작 부분의 BOM — 일부 파서는 UTF-8 BOM을 처리하지 못합니다
- 네임스페이스 혼동 — 어휘가 혼합된 문서에서 실수하기 쉽습니다
두 형식 모두 잘 이해되어 있고, 도구도 잘 갖춰져 있으며, 앞으로도 계속 사용될 것입니다. 각각을 언제 사용해야 하는지 알고, 데이터를 검증하면 통합 작업이 훨씬 더 안정적으로 이루어질 것입니다.