개발 이야기3분 읽기

같은 데이터를 다섯 형식으로 담으면

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].priceitems_0_price 같은 열로 펴면 항목 개수가 가변일 때 열 수가 정해지지 않습니다.

XML → JSON. 속성과 자식 요소의 구분이 없어집니다. <a id="1">x</a>{"id":"1","_text":"x"}처럼 관행적으로 옮기는데, 표준이 없어 도구마다 다릅니다.

JSON → YAML. 타입 추론이 개입합니다. 문자열 "no"가 따옴표를 잃으면 1.1 파서에서 false가 됩니다.

무엇 → CBOR. 사람이 못 읽습니다. 디버깅에 도구가 필요해집니다.

확인 순서

  1. 전송 압축이 켜져 있는지 봅니다. 켜져 있으면 형식 간 크기 차이가 작습니다
  2. 데이터에 중첩이 있는지 봅니다. 있으면 CSV는 선택지가 아닙니다
  3. 사람이 편집하는 파일이면 주석이 되는지 봅니다
  4. 이진 데이터를 담아야 하면 base64 증가분과 CBOR을 비교합니다
  5. 형식을 바꾸는 경로가 있으면 무엇이 사라지는지 먼저 확인합니다

tools.onuel.dev에서 같은 데이터를 형식마다 넣어 볼 수 있습니다. JSON 포매터YAML 포매터가 서로 오가고, JSON을 YAML로JSON을 CSV로가 변환을 맡습니다. XML 포매터는 구조를 펴고, CBOR은 바이트를 보여 주면서 JSON과 크기를 대조하게 해 줍니다.

  • #JSON
  • #XML
  • #CSV
  • #데이터