JSON Toolkit

draft-07인가 2020-12인가

핵심 요약: 2020-12가 현재이고 $defs, prefixItems, unevaluatedProperties를 더하지만 많은 도구가 여전히 draft-07만 말합니다. 전체 도구 체인이 지원하는 것으로 고르세요.

고급약 4분 소요2026-10-30 발행2026-10-30 업데이트
JSON Schema 초안 차이와 선택법

핵심부터 말하면, 신규 프로젝트에는 2020-12를 쓰고, 검증기, 코드 생성기, OpenAPI 도구 중 하나라도 draft-07만 지원하는 순간 draft-07으로 대체하며, 항상 $schema로 초안을 고정하세요.

짧은 답: 신규 작업은 2020-12, 옛 구성 요소가 강제하면 draft-07.

타임라인

초안 연도 주목할 것
draft-04 2013 $id 대신 id; 옛 API에서 여전히 흔함
draft-06 2017 const, propertyNames
draft-07 2018 if/then/else, readOnly, contentMediaType; 최고 호환성
2019-09 2019 $defs가 definitions를 대체, unevaluatedProperties
2020-12 2020 prefixItems, $dynamicRef; 현재 권장

2020-12가 개선하는 것

배열 튜플이 특수 사례에서 벗어남. draft-07은 "첫 요소는 A, 둘째는 B"를 items: [{...}, {...}]와 additionalItems로 표현합니다. 2020-12는 위치별 스키마에 prefixItems, 나머지에 items를 씁니다.

$defs가 표준 이름. 2019 이후 작성된 도구가 기본으로 그곳을 봅니다.

unevaluatedProperties가 구성과 동작. allOf와 함께 additionalProperties: false는 형제 분기가 정의한 필드를 거부합니다. unevaluatedProperties: false는 전체 스키마가 실제로 평가한 속성만 고려하며, 구성이 필요로 하는 것입니다.

draft-07이 정답일 때

상황 이유
OpenAPI 3.0 스키마 객체가 draft-04/07 부분집합
오래된 검증기(ajv 6, 일부 Java 라이브러리) prefixItems나 $dynamicRef를 모름
플랫폼이 버전을 강제 일부 로우코드 플랫폼과 게이트웨이가 고정
07에서 멈춘 코드 생성기 알 수 없는 키워드를 조용히 무시

마지막 경우를 직접 시험하세요. prefixItems 스키마를 검증기에 넣으세요. 알 수 없는 키워드를 보고하지 않고 불평 없이 통과하면 제약을 무시하는 것이고, 이것이 가장 위험한 결과입니다.

버전 섞기

항상 $schema를 선언하세요. 기본값이 다릅니다. ajv는 draft-07, 여러 Python 라이브러리는 2020-12를 가정합니다. 그러면 같은 파일이 두 곳에서 다르게 검증됩니다.

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://example.com/schemas/order.json",
  "type": "object"
}

초안을 넘어 $ref하지 마세요. 동작이 정의되지 않습니다.

배치로 업그레이드하세요. 한 저장소에 두 초안이 있으면 "여기엔 어떤 규칙이 적용되나"가 구전 지식이 됩니다.

FAQ

검증기가 2020-12를 지원하는지 어떻게 확인하나?

prefixItems를 쓰는 스키마를 검증기에 넣으세요. 알 수 없는 키워드 오류는 초안을 지원하지 않는다는 뜻이고, 조용히 통과하면 제약을 무시하는 것이며 더 나쁩니다.

프로젝트가 왜 단일 초안을 써야 하나?

한 저장소의 두 초안은 "여기엔 어떤 규칙이 적용되나"를 구전 지식으로 만듭니다. 모든 파일이 같은 해석을 공유하도록 배치로 업그레이드하세요.

$schema를 항상 선언해야 하나?

예. 기본값이 다릅니다. ajv는 draft-07, 여러 Python 라이브러리는 2020-12를 가정해 같은 파일이 두 곳에서 다르게 검증될 수 있습니다.

더 읽을거리