JSON Schema: 기초부터 운영까지
키워드는 많지만 매일 쓰는 것은 열두 개 정도입니다. type/properties/required/$ref만 제대로 쓰고 오류 메시지를 잘 처리하면 실무 사례의 80퍼센트를 덮습니다.
JSON Schema로 데이터 모양을 설명하고, 말로 된 합의를 실행 가능한 검증으로 바꾸며, 이를 다시 TypeScript 타입과 폼 생성으로 이어 갑니다.
7개 문서키워드는 많지만 매일 쓰는 것은 열두 개 정도입니다. type/properties/required/$ref만 제대로 쓰고 오류 메시지를 잘 처리하면 실무 사례의 80퍼센트를 덮습니다.
타입과 스키마는 각자 한 구간만 덮습니다. 하나는 컴파일 타임, 하나는 런타임. 질문은 어느 쪽을 고르느냐가 아니라 두 개를 자동으로 동기화하는 방법입니다.
생성된 스키마는 종종 유효한 데이터를 막습니다. 샘플이 풍부할수록 스키마가 나빠지는 이유, 그리고 다중 레코드 샘플링, 의미 완성, 오류 지목의 워크플로를 배웁니다.
$ref는 재사용을, allOf와 oneOf는 구성을 해결하지만 둘을 겹쳐 쌓을 때 문제가 터집니다. $id, $defs, 조건부, 재귀, 번들링, 디버깅을 다룹니다.
검증기는 기계 오류를 내지만 사용자는 어느 입력 상자가 틀렸는지 알고 싶어 합니다. Ajv errors 배열, instancePath와 schemaPath, 그룹화와 문구를 다룹니다.
검증을 통과해도 데이터가 깨끗하다는 뜻이 아닙니다. Pydantic은 기본으로 미선언 필드를 무시하고, Zod는 제거하며, Ajv는 그대로 통과시킵니다. 본문은 무음 수용의 세 가지 형태를 보이고, 객체를 닫고 강제 형변환을 제어하며 모든 중첩 단계를 조이는 완전한 방법을 제시합니다.
스키마는 작성으로 끝이 아니라 거기서부터 망가지기 시작합니다. 오타 하나가 검증을 조용히 느슨하게 만들고, 리팩터링 하나가 픽스처 전체를 오작동시킵니다. 이 글은 정례·부례·스냅샷 3종 세트, 스키마 자체의 린트, 컴파일 한 번 재사용, CI에 설치하는 네 개의 게이트로 이루어진 실행 가능한 계약 테스트 구성을 다룹니다.