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

핵심부터 말하면, 신규 프로젝트에는 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를 가정해 같은 파일이 두 곳에서 다르게 검증될 수 있습니다.