와이어를 통한 JSON 전송은 직업적 과실이다
Source: Dev.to
이 글이 일부 사람들을 화나게 할 거라는 건 이미 눈에 보이네요. 전 괜찮아요.
The problem with JSON
전송 중인 인간이 읽을 수 있는 데이터는 수십 년 동안 우리가 습관적으로 방어해 온 실수입니다. 옳아서가 아니라, 효율적이라서가 아니라, 익숙해서입니다. JSON이 가장 익숙한데, 바로 그게 문제입니다: 우리는 익숙함을 보증처럼 여기죠.
JSON은 타입 안전성을 제공하지 않습니다. 스키마도, 강제된 계약도, 정규 표현도 없습니다. 양쪽이 정중히 같은 방식으로 해석하기로 동의한 바이트 문자열일 뿐… 어느 한 쪽이 그렇지 않을 때까지 말이죠.
age가 정수라는 것을 문서화할 수 있습니다. 그러면 클라이언트가 "age": "27" 자바스크립트 때문에 보내고, 우리는 조용히 강제 변환을 해버리니 아무도 눈치채지 못합니다. 문제가 생길 때까지요. 혹은 서버가 클라이언트가 숫자를 기대하는 곳에 null을 보내거나, 서버가 리팩터링 과정에서 snake_case를 camelCase로 “친절히” 바꾸거나, 누군가가 “어차피 쓰이지 않으니” 같은 이름이지만 의미가 다른 필드를 추가하거나, 백엔드가 실패 상황에서도 "status": "ok"을 반환하고 API 게이트웨이가 이를 숨기기도 합니다. 이 모든 것이 합법적인 JSON입니다. 바로 그게 포인트죠. JSON은 여러분의 실수를 기쁘게 직렬화합니다. JSON은 신경 쓰지 않아요. “단순함을 위해 만든 것”이라고요.
스키마 없이 “유연성”에 의존한다는 것은 계약이 언제나 암묵적이고, 사회적이며, 좋은 분위기에 의해 강제된다는 뜻입니다. 교차된 손가락, 손을 잡고, 선택의 신에게 찬양을 부르며 심각한 시스템을 구축할 수 있다고 기대할 수 없습니다.
“이거만 검증하면 돼”는 JSON에 대한 논거가 아닙니다. 그것은 두 번째 시스템이 필요하다는 인정입니다. 그리고 여러분은 그 검증을 모든 클라이언트, 모든 서비스, 모든 언어에 반복해서 영원히 구현하게 될 것입니다.
저는 검증 라이브러리 개발자를 비난하는 것이 아니라, 프로토콜과 무관하게 강력한 검증 로직이 필요하다는 점을 강조합니다. 문제는 JSON 자체를 계약으로 사용하는 데 있습니다.
Why schema‑driven formats help
스키마 기반 포맷을 사용하면 여전히 실수를 할 수 있지만, 부족한 기억에 의존하지 않는 가드레일이 존재합니다:
- 스키마가 계약을 정의합니다.
- 정규 인코딩이 모호성을 없앱니다.
- 호환성 규칙이 해석이 아니라 기계적으로 적용됩니다.
숫자가 들어가야 할 곳에 문자열을 “우연히” 실어 보내면, 어딘가에서 누군가가 일찍이 외치게 됩니다.
물론, 타입이 존재하지 않는 JavaScript 같은 언어를 쓰는 경우는 예외입니다.
바이트도 중요합니다. 텍스트는 지루하게도 비용이 많이 듭니다: 필드 이름이 반복되고, 따옴표가 반복되고, 이스케이프가 반복되고, 파서가 불필요한 작업을 수행하고, 로드가 늘어날수록 할당이 급증합니다. 왜일까요? 누군가가 디버깅이라는 위안에 기대기 위해서죠. JSON의 최고의 방어가 “눈으로 직접 읽는 게 좋다”라면, 여러분은 잘못된 것을 최적화하고 있는 겁니다. 디버깅은 계약을 이해하는 도구로 해야지, 블롭을 눈으로 훑어보며 쉼표를 놓쳤는지 기도하는 것이 아니라. 우리는 “cURL 복사, jq 파이프, 눈 크게 뜨기”보다 계약 기반 프로토콜을 위한 더 나은 도구를 가지고 있습니다.
Recommendation
스키마 포맷—예를 들어 Protocol Buffers, Avro, 혹은 다른 스키마 기반 시스템—을 기계 간 정규 표현으로 사용하세요. JSON은 정말로 적절한 경우에만 사용하십시오.
아직도 이 말에 화가 난다면: 좋습니다. 그래야 합니다. 저에게가 아니라! 우리가 “바이브가 있는 무형 문자열 묶음”을 심각한 시스템의 허용 가능한 기반으로 집단적으로 결정했다는 사실에 화를 내세요. 원한다면 JSON을 덕트 테이프로 계속 쓰세요, 하지만 그것을 아키텍처라고 부르지 마세요. 그리고 절대 “타입 안전”이라고 직설적으로 말하지 마세요. 귀여운 GraphQL 스키마가 충분하다고 착각하지 마세요.
모든 것을 버리고 Protocol Buffers와 gRPC에 익숙해지라고 말하진 않겠지만, 그렇다고 하지 말라고도 하진 않겠습니다.