JSON Schema 조건부 필드 검수unevaluatedProperties additionalProperties 차이JSON Schema allOf 추가 속성JSON Schema if then 속성 검수

JSON Schema 조건부 필드 검수, 자동 모드의 필드가 왜 거절될까요

공통 스키마에서 자동 모드 필드가 거절되는 조건을 살펴봅니다. additionalProperties와 unevaluatedProperties를 가상 입력 8개로 비교합니다.

이 글을 쓴 알파카랩스카카오·네이버·쿠팡 출신, 재하청 0%, 대기업·공공기관 등 18개사+ 레퍼런스

발행 ·알파카랩스

2026년 11월 기준, 공통 스키마가 자동 전용 필드를 막으면 그 제한을 빼고 결합 위치에 unevaluatedProperties: false를 둡니다.

자동 모드에서만 작업 ID를 받는 가상 API를 생각해 보겠습니다. 공통 스키마에 ID와 모드를 적고, 자동 모드 조건에 작업 ID를 넣었습니다. 그런데 공통 스키마에서 등록되지 않은 속성을 거절하면 자동 모드에 필요한 작업 ID까지 막힙니다.

공통 스키마에서 허용한 속성만 보면 어떻게 되나요?#

additionalProperties는 같은 스키마 객체의 properties와 patternProperties에서 처리하지 않은 속성에 적용합니다. 공통 스키마 안에서 이 값을 false로 두면 바깥 조건이 작업 ID를 허용해도 그 공통 스키마는 입력을 거절합니다. allOf는 각 하위 스키마를 모두 통과해야 하므로 다른 조건이 이 거절을 취소하지 않습니다. JSON Schema Core 추가 속성 규칙

공통 스키마의 제한을 제거하고 결합한 객체에 unevaluatedProperties: false를 둘 수 있습니다. 이 키워드는 같은 입력 객체에서 인접한 규칙과 그 하위 스키마가 성공적으로 평가한 속성을 모아, 남은 속성을 거절합니다. 예시에서 자동 모드일 때는 then이 작업 ID를 검사하고, 수동 모드에서는 그 분기가 적용되지 않아 작업 ID가 남은 속성이 됩니다. JSON Schema Core 미평가 속성 규칙

어떤 입력을 통과시켜야 하나요?#

두 스키마 모두 공통 ID와 모드, 자동 모드의 문자열 jobId를 요구합니다. 차이는 추가 속성 제한을 공통 스키마 내부에 두는지, 결합 위치에 두는지입니다.

가상 입력공통 스키마에서 제한결합 위치에서 제한
수동과 공통 필드만 전달통과통과
자동과 문자열 jobId 전달거절통과
자동에서 jobId 누락거절거절
수동에 jobId 전달거절거절
수동에 등록하지 않은 필드 전달거절거절
자동의 jobId가 숫자거절거절
자동에 올바른 jobId와 추가 필드거절거절
공통 필드 mode가 허용 목록 밖거절거절
2026년 11월 13일 Python jsonschema 4.26.0의 Draft202012Validator로 합성 입력 8개를 두 스키마에 적용했습니다.

다음은 결합 위치에서 제한한 예시입니다. 공통 스키마의 추가 속성 제한을 적용한 비교본에서는 결합 위치의 제한을 빼고 공통 스키마에 additionalProperties: false를 둡니다.

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "$defs": {
    "base": {
      "properties": {
        "id": { "type": "string" },
        "mode": { "enum": ["manual", "auto"] }
      },
      "required": ["id", "mode"]
    }
  },
  "allOf": [
    { "$ref": "#/$defs/base" },
    {
      "if": {
        "properties": { "mode": { "const": "auto" } },
        "required": ["mode"]
      },
      "then": {
        "properties": { "jobId": { "type": "string" } },
        "required": ["jobId"]
      }
    }
  ],
  "unevaluatedProperties": false
}

대표 입력 {"id":"B","mode":"auto","jobId":"J"}는 공통 스키마에서 제한한 비교본에서 거절되고 결합 위치에서 제한하면 통과합니다. 인수표에는 모드, 필수 속성, 허용 속성, 기대 판정, 실제 판정을 기록합니다. 자동 모드의 정상 입력이 거절되거나 수동 모드에서 작업 ID가 통과하면 연동 인수를 보류하고 적용 스키마와 도구 버전을 확인합니다.

모드마다 스키마를 따로 두어도 되나요?#

모드가 적고 도구가 결합 검사를 지원하지 않으면, 각 모드의 전체 속성을 선언한 별도 스키마에서 추가 속성을 제한할 수 있습니다. 서로 다른 규칙의 공통 필드가 바뀔 때 두 스키마를 함께 갱신할 책임을 정합니다.

OpenAPI 3.2.1의 Schema Object는 JSON Schema Draft 2020-12의 어휘를 바탕으로 합니다. 사용하는 검증기와 생성 도구에서 같은 입력을 직접 시험합니다. 검증기 버전이나 스키마 방언이 바뀌면 표의 8개 입력을 다시 확인합니다. 부분 수정에서 값의 누락을 해석하는 기준은 SCM 부분 수정 검수, 항목과 전체의 검수 차이는 OpenAPI NDJSON 검수에서 다룹니다.

기준과 시험은 어디에서 확인했나요?#

공개 문서는 2026년 11월 13일 확인했습니다. 표는 합성 데이터와 로컬 검증기의 결과입니다. 실제 HTTP 요청, SDK 생성, 데이터 적재는 검수 범위에 포함하지 않았습니다.

자주 묻는 질문#

allOf에서 나중에 필드를 추가하면 공통 스키마가 허용하나요?

allOf에서는 각 하위 스키마를 모두 통과해야 합니다. 공통 스키마가 추가 속성을 거절하면 다른 하위 스키마에 그 속성을 선언해도 통과하지 않습니다.

수동 모드에 jobId가 들어오면 어떻게 되나요?

예시에서 수동 모드는 then의 작업 ID 검사를 적용하지 않습니다. 결합 위치의 unevaluatedProperties가 그 속성을 거절합니다.

필드를 허용하면 입력에 반드시 있어야 하나요?

필수 여부는 required로 정합니다. 예시는 자동 모드일 때 then의 required로 jobId를 요구합니다.

공통 스키마의 additionalProperties를 남겨도 되나요?

공통 스키마의 false를 유지하면 그 검사에서 거절된 입력을 바깥의 unevaluatedProperties가 통과시키지 못합니다. 예시는 공통 스키마의 제한을 제거하고 결합 위치에 제한을 둡니다.

OpenAPI 문서가 열리면 실제 검수도 통과했다고 볼 수 있나요?

문서가 열리는 것과 서버나 생성 도구가 입력 규칙을 적용하는 것은 별개입니다. 실제 도구에서 정상 입력과 거절 입력을 함께 확인합니다.

모드별 입력의 인수 기준을 정할 때#

모드별 입력의 인수 기준을 정리합니다

첫 범위 협의에서 비식별 JSON과 모드별 필수·허용 속성을 바탕으로 입력 인수표를 정리합니다. 소요 시간은 스키마와 연동 범위를 확인한 뒤 협의합니다.

조건부 입력 인수표 초안 협의