it-box

JSON → JSON Schema

JSON 샘플에서 Draft 2020-12 JSON Schema를 생성합니다.

JSON → JSON Schema 도구 열기

JSON 샘플에서 Draft 2020-12 형식의 JSON Schema 초안을 만듭니다.

사용 순서

  1. 검증하려는 데이터와 같은 모양의 JSON 샘플을 붙여 넣습니다.
  2. 생성된 type, properties, required 값을 확인합니다.
  3. 배열 items가 anyOf로 나뉜 곳은 실제로 허용해야 할 형태인지 봅니다.
  4. format, enum, 숫자 범위처럼 샘플에서 알 수 없는 제약은 직접 추가합니다.

예시

{"name":"Ada","age":30} 샘플의 결과는 type이 object이고, properties.age.type이 number이며, required가 ["name", "age"]입니다. 결과는 들여쓰기된 형태입니다.

한계

샘플 값에서 형태만 추론하며 enum, format, minimum, maxLength, additionalProperties는 만들지 않습니다. 정수와 실수를 구분하지 않아 숫자는 모두 number입니다. 객체의 모든 키가 required에 들어가며, 빈 배열의 items는 제약이 없는 {}입니다. 같은 모양이라도 키 순서가 다르면 다른 스키마로 취급되어 anyOf 항목이 늘어납니다. 입력은 2 MiB, 중첩은 64단계까지입니다.

보안 주의

required가 샘플의 모든 키에 붙기 때문에, 실제 API에서 생략할 수 있는 필드가 있으면 이 스키마로 검증하는 순간 정상 요청이 거부됩니다. 검증 규칙으로 배포하기 전에 선택 필드를 required 목록에서 직접 빼세요.

배경 지식

JSON Schema는 JSON 데이터가 어떤 모양이어야 하는지 선언하는 표준입니다. 같은 스키마로 요청 검증, 문서 생성, 폼 자동 구성을 할 수 있어서 데이터 계약을 한곳에 모으는 용도로 쓰입니다. 같은 스키마 파일을 프런트엔드와 백엔드가 함께 참조하면, 양쪽이 서로 다른 모양의 데이터를 기대하는 실수를 줄일 수 있습니다.

샘플에서 자동으로 만든 스키마는 본 값만 반영하므로 한쪽으로 치우치기 쉽습니다. 샘플의 나이가 모두 30이었다면 범위 제약이 생기지 않고, 날짜 문자열도 date 형식으로 추정되지 않습니다. 결과는 제약을 덧붙이기 위한 뼈대로 보는 편이 안전합니다. 숫자 범위, 문자열 길이, 허용 값 목록은 업무 규칙에서 나오는 것이라 샘플만으로는 절대 추론되지 않는다는 점을 기억하세요.

자주 묻는 질문

정수와 실수를 구분할 수 있나요?

구분하지 않습니다. 모든 숫자가 "type": "number"로 나옵니다. integer가 필요하면 결과에서 해당 필드만 직접 바꾸세요. 샘플에 소수점이 없었다는 이유만으로 정수라고 단정하기는 어렵습니다.

빈 배열이면 어떤 스키마가 나오나요?

"items": {}가 나와서 원소가 어떤 타입이든 허용됩니다. 빈 배열만으로는 원소 타입을 알 수 없으므로, 실제 원소가 들어 있는 샘플을 함께 넣어 다시 만들거나 items를 직접 지정하세요.

null이 섞일 수 있는 필드는 어떻게 표현하나요?

샘플 값이 null이면 "type": "null"로 나옵니다. 문자열이거나 null일 수 있는 필드라면 결과를 받은 뒤 type을 ["string", "null"] 배열로 고치면 됩니다. 두 종류의 값이 모두 있는 샘플을 넣으면 anyOf로 나뉘기도 합니다.