CSV vs JSON vs XML: 적합한 데이터 포맷 선택하기
모든 데이터 교환에는 포맷 선택이 필요합니다. CSV, JSON, XML은 가장 일반적인 세 가지 옵션으로, 각각 뚜렷한 강점을 가지고 있습니다. 잘못된 포맷을 선택하면 파싱 문제, 비대한 페이로드, 개발 시간 낭비로 이어집니다. 이 가이드는 작업에 적합한 도구를 선택하는 데 도움을 줍니다.
포맷 개요
CSV (Comma-Separated Values)
name,age,city
Alice,30,London
Bob,25,Paris
Charlie,35,Tokyo
- 구조: 평탄, 표 형식 (행과 열)
- 타입 시스템: 없음 (모든 것이 텍스트)
- 중첩: 지원하지 않음
- 크기: 표 형식 데이터에서 가장 작음
JSON (JavaScript Object Notation)
[
{"name": "Alice", "age": 30, "city": "London"},
{"name": "Bob", "age": 25, "city": "Paris"},
{"name": "Charlie", "age": 35, "city": "Tokyo"}
]
- 구조: 계층적 (객체, 배열)
- 타입 시스템: 문자열, 숫자, 불리언, null, 객체, 배열
- 중첩: 네이티브 지원
- 크기: 중간
XML (eXtensible Markup Language)
<people>
<person>
<name>Alice</name>
<age>30</age>
<city>London</city>
</person>
<person>
<name>Bob</name>
<age>25</age>
<city>Paris</city>
</person>
</people>
- 구조: 속성과 요소가 있는 계층적
- 타입 시스템: XML Schema (XSD)를 통해
- 중첩: 네이티브 지원
- 크기: 가장 큼 (장황한 태그)
상세 비교
| 기능 | CSV | JSON | XML |
|---|---|---|---|
| 가독성 | 높음 (표 형식) | 높음 | 낮음 (장황) |
| 파일 크기 | 가장 작음 | 중간 | 가장 큼 |
| 파싱 속도 | 가장 빠름 | 빠름 | 가장 느림 |
| 중첩 | 아니오 | 예 | 예 |
| 스키마 | 표준 없음 | JSON Schema | XSD, DTD |
| 주석 | 아니오 | 아니오 | 예 |
| 메타데이터 | 아니오 | 아니오 | 예 (속성) |
| 스트리밍 | 줄 단위 | SAX/스트리밍 | SAX/StAX |
| 바이너리 데이터 | 아니오 | Base64 문자열 | Base64 또는 CDATA |
| 네임스페이스 | 아니오 | 아니오 | 예 |
CSV를 사용할 때
적합한 경우:
- 스프레드시트 데이터 및 데이터베이스 내보내기
- 데이터 분석 (pandas, R, Excel)
- 일관된 열을 가진 단순한 평탄 데이터
- 최대 호환성 (모든 도구가 CSV를 지원)
- 크기가 중요한 대규모 데이터셋
피해야 할 경우:
- 데이터가 중첩되거나 계층적 구조를 가짐
- 여러 데이터 타입을 보존해야 함
- 열 값에 쉼표, 줄 바꿈, 따옴표가 포함됨 (엣지 케이스)
CSV 편집기로 CSV 데이터를 다루거나 CSV to JSON 변환기로 JSON으로 변환하세요.
JSON을 사용할 때
적합한 경우:
- 웹 API 통신 (REST, GraphQL 응답)
- 설정 파일 (package.json, tsconfig.json)
- 문서 지향 데이터베이스 (MongoDB, CouchDB)
- 브라우저 환경 (네이티브 JavaScript 파싱)
- 구조가 다양한 데이터 (일부 레코드에만 있는 필드)
피해야 할 경우:
- 데이터가 순수하게 표 형식 (CSV가 더 간단하고 작음)
- XML 기능이 필요 (네임스페이스, 스키마, XSLT)
- 데이터 파일에 주석이 필요 (대신 YAML 사용)
JSON 포맷터로 JSON을 포맷하고 유효성을 검사하세요.
XML을 사용할 때
적합한 경우:
- 엔터프라이즈 시스템 (SOAP, XHTML, RSS, SVG)
- 문서 마크업 (임베디드 구조가 있는 혼합 콘텐츠)
- 요소와 함께 속성이 필요할 때
- 강력한 스키마 유효성 검사 요구사항 (XSD)
- XSLT 변환
- 산업별 표준 (의료 HL7, 금융 XBRL)
피해야 할 경우:
- 최신 웹 API 구축 (JSON이 표준)
- 데이터가 표 형식 (CSV가 더 간단)
- 파일 크기와 파싱 속도가 중요 (JSON이 더 가벼움)
크기 비교
동일한 1000개 레코드 데이터셋:
| 포맷 | 파일 크기 | 파싱 시간 (상대적) |
|---|---|---|
| CSV | 45 KB | 1x (기준) |
| JSON | 85 KB | 1.5x |
| XML | 140 KB | 3x |
XML의 장황함 — 여는 태그, 닫는 태그, 모든 값에 반복되는 요소 이름 — 은 CSV에 비해 크기를 대략 3배로 만듭니다.
마이그레이션 패턴
CSV에서 JSON으로
import csv, json
with open('data.csv') as f:
reader = csv.DictReader(f)
data = list(reader)
with open('data.json', 'w') as f:
json.dump(data, f, indent=2)
JSON에서 CSV로
import csv, json
with open('data.json') as f:
data = json.load(f)
with open('data.csv', 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=data[0].keys())
writer.writeheader()
writer.writerows(data)
XML에서 JSON으로
import xmltodict, json
with open('data.xml') as f:
data = xmltodict.parse(f.read())
with open('data.json', 'w') as f:
json.dump(data, f, indent=2)
현대의 동향
지난 10년간의 추세는 분명합니다: JSON이 웹 API와 설정에서 XML을 크게 대체했습니다. 하지만 CSV는 분석 및 비즈니스 맥락에서 데이터 교환의 주류로 남아있으며, XML은 엔터프라이즈 및 정부 시스템에서 지속됩니다.
최신 대안:
- YAML: 사람 친화적인 설정 (설정에서 JSON과 XML 모두 대체)
- Protocol Buffers / MessagePack: 고성능 시스템을 위한 바이너리 포맷
- Parquet / Arrow: 빅데이터 분석을 위한 컬럼형 포맷
JSON과 YAML의 구체적인 비교는 YAML vs JSON 가이드를 참조하세요.
자주 묻는 질문
데이터 손실 없이 이러한 포맷 간 변환할 수 있나요?
CSV에서 JSON으로의 변환은 평탄 데이터에 대해 무손실입니다 (타입은 손실됨 — CSV에서 숫자는 문자열이 됨). JSON에서 CSV로는 계층 구조가 손실됩니다 (중첩 객체를 평탄화해야 함). XML에서 JSON으로는 대부분 무손실이지만 속성과 혼합 콘텐츠는 까다로울 수 있습니다. 항상 특정 데이터로 왕복 변환을 테스트하세요.
새 API에 어떤 포맷을 사용해야 하나요?
JSON입니다. 네이티브 브라우저 지원, 우수한 도구, 가독성과 크기의 최적 균형을 갖춘 현대 웹 API의 사실상 표준입니다. 유효성 검사에는 JSON Schema를 사용하세요. 유일한 예외는 XML을 요구하는 레거시 엔터프라이즈 시스템과 통합하는 경우입니다.
관련 리소스
- CSV 편집기 — CSV 데이터 편집 및 정제
- JSON 포맷터 — JSON 포맷 및 유효성 검사
- CSV to JSON 변환 가이드 — 단계별 변환