같은 데이터를 다섯 형식으로 담으면
XML은 CSV의 3.1배인데 gzip 후에는 1.3배입니다. 형식 선택이 실제로 무엇을 바꾸는지 재 봤습니다.
주문 30건을 다섯 형식으로 적어 크기를 재 봤습니다.
압축 전과 후
형식 크기 gzip gzip 비율
CSV 1,530 371 24%
CBOR 2,501 435 17%
JSON (최소화) 3,439 465 14%
YAML 4,004 472 12%
XML 4,778 485 10%
압축 전에는 XML이 CSV의 3.1배입니다. gzip을 거치면 1.3배로 줄어듭니다.
XML이 큰 이유는 태그 이름이 열고 닫으며 두 번 나오기 때문인데, 그 반복이 정확히 압축기가 가장 잘 지우는 패턴입니다. 그래서 XML의 gzip 비율이 10%로 가장 좋습니다.
전송 크기만 놓고 보면 형식 선택의 차이는 압축 뒤에 크게 줄어듭니다. 형식은 다른 이유로 고르는 편이 맞습니다.
각 형식이 담을 수 있는 것
형식 중첩 타입 주석 스키마
JSON 예 수·문자·불·null 아니오 별도(JSON Schema)
YAML 예 JSON + 날짜 등 예 별도
XML 예 없음(전부 문자열) 예 내장(XSD·DTD)
CSV 아니오 없음(전부 문자열) 아니오 없음
CBOR 예 JSON + 이진·날짜 아니오 별도(CDDL)
CSV가 가장 작은 데는 이유가 있습니다 — 중첩을 담지 못합니다. 위 데이터가 평탄한 배열이라 가능했습니다. 주문 안에 상품 목록이 들어가는 순간 CSV로는 표현이 안 됩니다.
XML은 값에 타입이 없습니다. <qty>2</qty>의 2는 문자열이고, 숫자로 읽으려면 스키마가 필요합니다. 대신 스키마가 형식에 내장돼 있어서 문서 자체로 검증할 수 있습니다.
이진 형식이 얻는 것
CBOR은 JSON보다 27% 작습니다. gzip 후에는 6% 차이로 줄어듭니다.
크기보다 큰 이득이 둘 있습니다.
이진 데이터를 그대로 담습니다. JSON에 바이트를 넣으려면 base64로 감싸야 하고 33%가 늘어납니다. CBOR은 바이트 문자열 타입이 있어 그대로 들어갑니다.
파싱이 빠릅니다. 길이가 앞에 적혀 있어 버퍼를 미리 잡을 수 있고, 숫자를 문자열에서 파싱하지 않습니다.
a1 66 6f 72 64 65 72 73 98 1e …
^^ 맵 1개 항목
^^ 6자 문자열
^^^^^^^^^^^^^^^ "orders"
^^^^^ 배열 30개
첫 바이트가 타입과 길이를 함께 담습니다. 값을 읽기 전에 구조를 압니다.
무엇을 기준으로 고르나
| 상황 | 선택 | 이유 |
|---|---|---|
| 웹 API | JSON | 어디서나 파싱된다 |
| 사람이 편집하는 설정 | YAML | 주석이 들어간다 |
| 표 형태 데이터 교환 | CSV | 엑셀이 연다 |
| 기존 시스템·문서 표준 | XML | 스키마 검증이 형식에 있다 |
| 임베디드·IoT | CBOR | 작고 파싱이 가볍다 |
| 로그 | JSON Lines | 한 줄이 한 레코드라 이어 붙고 잘린다 |
YAML을 API 응답으로 쓰지 않는 이유는 파싱이 복잡하고 타입 추론이 예측하기 어렵기 때문입니다. 사람이 읽고 쓰는 파일에서만 그 유연함이 이득입니다.
형식을 바꿀 때 잃는 것
JSON → CSV. 중첩이 평탄해지면서 구조가 사라집니다. items[0].price를 items_0_price 같은 열로 펴면 항목 개수가 가변일 때 열 수가 정해지지 않습니다.
XML → JSON. 속성과 자식 요소의 구분이 없어집니다. <a id="1">x</a>를 {"id":"1","_text":"x"}처럼 관행적으로 옮기는데, 표준이 없어 도구마다 다릅니다.
JSON → YAML. 타입 추론이 개입합니다. 문자열 "no"가 따옴표를 잃으면 1.1 파서에서 false가 됩니다.
무엇 → CBOR. 사람이 못 읽습니다. 디버깅에 도구가 필요해집니다.
확인 순서
- 전송 압축이 켜져 있는지 봅니다. 켜져 있으면 형식 간 크기 차이가 작습니다
- 데이터에 중첩이 있는지 봅니다. 있으면 CSV는 선택지가 아닙니다
- 사람이 편집하는 파일이면 주석이 되는지 봅니다
- 이진 데이터를 담아야 하면 base64 증가분과 CBOR을 비교합니다
- 형식을 바꾸는 경로가 있으면 무엇이 사라지는지 먼저 확인합니다
tools.onuel.dev에서 같은 데이터를 형식마다 넣어 볼 수 있습니다. JSON 포매터와 YAML 포매터가 서로 오가고, JSON을 YAML로와 JSON을 CSV로가 변환을 맡습니다. XML 포매터는 구조를 펴고, CBOR은 바이트를 보여 주면서 JSON과 크기를 대조하게 해 줍니다.
- #JSON
- #XML
- #CSV
- #데이터