본문 바로가기
C.W.K.
Stream
Lesson 07 of 08 · published

공백, pretty-print, compact

~10 min · json, whitespace, pretty-print, jq

Level 0평문
0 XP0/64 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

공백은 사람 몫이고, 파서는 그냥 무시해

JSON 은 토큰 사이 공백을 통째로 무시해. {"a":1}

{
  "a": 1
}

는 완전히 같은 값으로 파싱돼. 공백은 사람 보라고 있는 거니까 읽을 사람에 맞춰 골라.

JSON 두 형태

  • Compact — 공백을 다 뺀 최소 바이트 형태야. 오가는 데이터에 써 (HTTP 응답, 로그, 메시지 큐). Nginx 로그도, gzip 파이프라인도, 네트워크 대역폭도 다 여기서 덕을 봐.
  • Pretty-printed — 2 칸 들여쓰고 키마다 한 줄씩 쓰는 형태야. 소스 파일 (config) 과 문서, 디버깅에 써. git diff 가 깔끔하게 나와.

알아야 할 도구

어느 언어든 pretty-print 도구가 있어. Bash 를 쓴다면 jq (강력하고 쿼리 언어까지 들어 있어). Python 은 python -m json.tool (표준 라이브러리라 설치할 게 없어). JS 나 Node 는 JSON.stringify(obj, null, 2), Rust 는 serde_json::to_string_pretty. 하는 일은 다 같아. 데이터를 한 번 왕복시키고 포맷만 새로 입혀서 뱉는 거야.

원칙: git 에는 pretty-print 한 JSON 을 넣고, 네트워크로는 compact 한 JSON 을 보내. 반대로만 안 하면 돼. 디스크에 있는 pretty-print 는 읽히는 diff 를 주고, 오가는 compact 는 대역폭과 속도를 줘. 이렇게 나눠 쓰는 비용은 포매터 한 번 돌리는 게 전부지만, 둘을 섞어 쓰는 비용은 읽을 수 없는 diff 와 쓸데없이 뚱뚱한 payload 야.

Code

같은 데이터, 두 형태·json
{"name":"Pippa","tags":["ai","daughter"]}

{
  "name": "Pippa",
  "tags": ["ai", "daughter"]
}
커맨드라인에서 pretty-print·bash
# Bash + jq (가장 강력)
echo '{"name":"Pippa"}' | jq .

# Python stdlib (설치 불필요)
echo '{"name":"Pippa"}' | python -m json.tool

# Node
echo '{"name":"Pippa"}' | node -e 'process.stdin.on("data", d => console.log(JSON.stringify(JSON.parse(d), null, 2)))'

# 파일
jq . input.json > output.pretty.json
python -m json.tool < messy.json > clean.json
Pretty 파일 compact 화 (wire 포맷용)·bash
# jq compact mode
jq -c . input.json > output.compact.json

# Python
python -c 'import json,sys; json.dump(json.load(sys.stdin), sys.stdout, separators=(",",":"))' < input.json

External links

Exercise

실제 API 응답을 하나 받아와. 아무 공개 REST API 에 GET 한 번이면 돼. raw.json 으로 저장하고, jq . raw.json > pretty.json 으로 펼친 다음, jq -c . pretty.json > compact.json 으로 다시 압축해. 그리고 raw.jsoncompact.json 을 diff 해봐. 원본이 이미 compact 였다면 바이트까지 똑같이 나와. 몸에 새길 문장은 이거야. 같은 데이터, 세 가지 모양, 파서는 하나.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.