JSON 응답에서 한글을 grep했더니 0건이면 \uXXXX 이스케이프를 의심한다
파이썬 json.dumps 기본값(ensure_ascii=True)은 한글을 \uXXXX로 바꿔 내보냅니다. 응답을 파싱한 뒤 비교하거나, 찾을 말을 같은 방식으로 이스케이프해 검색합니다.
배포 뒤 확인으로 API 응답에 새 한글 문구가 들어 있는지 curl … | grep '운영 설정'을 돌렸는데 0건이 나옵니다. 브라우저 화면에는 문구가 잘 보입니다. 배포가 덜 된 것인지 한참 의심하게 됩니다.
원인은 응답 본문이 한글을 유니코드 이스케이프로 담고 있다는 데 있습니다. 파이썬 json.dumps의 기본값 ensure_ascii=True는 ASCII 밖의 글자를 \uXXXX 꼴로 바꿔 씁니다. 「운」이라면 \u 뒤에 16진수 c6b4가 붙은 여섯 글자가 됩니다. JSON으로는 똑같은 값이라 브라우저나 클라이언트가 파싱하면 한글로 보이지만, 원시 바이트를 문자열 검색하면 한글이 한 글자도 없습니다. Django의 JsonResponse도 기본으로 이 설정을 씁니다.
해법은 셋 중 하나입니다. 가장 확실한 것은 응답을 JSON으로 파싱한 뒤 값을 비교하는 것입니다. 원시 본문을 꼭 검색해야 한다면 찾을 말을 같은 방식으로 이스케이프해서 찾습니다. 응답 자체를 사람이 읽기 좋게 하고 싶다면 ensure_ascii=False로 바꿀 수 있지만, 이건 확인 방법이 아니라 API 동작을 바꾸는 일이니 따로 정합니다.
# 1) 파싱 뒤 비교 (node가 있으면)
curl -s https://example.com/api/settings \
| node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{
console.log(JSON.stringify(JSON.parse(s)).includes("운영 설정"))})'
# 2) 찾을 말을 이스케이프해서 원시 본문에서 찾기
needle=$(node -e 'console.log(JSON.stringify("운영 설정").slice(1,-1).replace(/[^\x00-\x7f]/g,c=>"\\u"+c.charCodeAt(0).toString(16).padStart(4,"0")))')
curl -s https://example.com/api/settings | grep -F "$needle"
「검색 0건」을 「없음」으로 읽기 전에, 본문 앞부분을 head -c 300으로 한 번 눈으로 보는 습관이 가장 싸게 이 함정을 피하는 길입니다.