JSON Schema 생성기
JSON 데이터에서 표준 준수 JSON Schema 정의를 자동으로 생성
// JSON Schema가 자동으로 생성됩니다JSON Schema란 무엇인가요?
JSON Schema는 JSON 데이터 구조를 설명하고 검증하기 위한 사양입니다. 구조, 데이터 타입, 제약 조건에 대한 규칙을 정의하며 API 검증, 폼 검증, 설정 파일 검증 등에 널리 사용됩니다.
JSON Schema로 할 수 있는 것:
- 데이터 검증: JSON 데이터가 예상 형식과 제약 조건에 맞는지 확인
- 문서 생성: API 문서와 타입 정의 자동 생성
- 코드 인텔리전스: IDE에서 스마트 완성 및 타입 검사 획득
- 자동화 테스트: 테스트에서 응답 데이터 형식 자동 검증
이 도구는 JSON Schema Draft-07 사양을 지원하며 중첩 객체, 배열 타입, 열거값 등 복잡한 구조를 지능적으로 추론합니다.
사용 방법
사용 방법
- 왼쪽 입력 상자에 JSON 데이터를 붙여넣거나, 샘플을 클릭하여 예제 데이터를 불러오세요
- 옵션을 설정하세요: Schema ID 설정, 모든 필드 필수 여부 선택, 기본값 추가 등
- 오른쪽에 해당 JSON Schema 정의가 자동으로 생성됩니다
- 복사를 클릭하여 생성된 Schema를 클립보드에 복사하세요
- API 검증, 폼 검증 또는 구성 파일 검증에 Schema를 사용하세요
Schema 팁
- 생성된 스키마는 제공한 샘플 JSON을 반영하므로, 결과를 복사하기 전에 대표적인 선택적 필드, null 값, 배열 및 엣지 케이스를 포함하세요.
- 필수 필드와 숫자/문자열 형식을 수동으로 검토하세요. 샘플 기반 추론은 항상 비즈니스 규칙을 알 수 없습니다.
활용 사례
기술 원리
JSON Schema는 여러 IETF 초안(Draft 4 / 6 / 7 / 2019-09 / 2020-12)에 걸쳐 정의된 JSON 문서 주석 및 검증을 위한 선언적 어휘입니다. 최신 버전은 Draft 2020-12로, 7가지 기본 타입(string, number, integer, boolean, array, object, null), 개방형 형식 어휘(email, uri, date-time, uuid, ipv4, hostname 등), 그리고 수십 가지 제약 키워드를 정의합니다. 제약 키워드에는 pattern(정규식), minimum/maximum/exclusiveMinimum/exclusiveMaximum(숫자 범위), minLength/maxLength(문자열 길이), minItems/maxItems/uniqueItems(배열 제약), required(객체 수준의 필수 배열), additionalProperties(추가 필드 허용 여부), enum과 const(허용 값), $ref(하위 스키마 재사용) 등이 있습니다. 이 페이지는 기본적으로 Draft 2020-12 출력을 생성하며, 드롭다운에서 구 Draft-07(프로덕션 스키마에서 여전히 가장 일반적)을 선택할 수 있습니다. 생성기의 추론은 사용자가 제공한 JSON을 한 번 순회하며 스키마 객체를 재귀적으로 구축합니다. 추론의 핵심 매핑은 다음과 같습니다: 정수(Number.isInteger이고 소수부 없음) -> {type: 'integer'}, 실수 -> {type: 'number'}, 문자열 -> {type: 'string'}, 불리언 -> {type: 'boolean'}, 배열 -> {type: 'array', items: <첫 번째 요소에 재귀>} 또는 Draft 2020-12의 튜플을 위한 {type: 'array', prefixItems: [...]}, 객체 -> {type: 'object', properties: <각 키에 재귀>}, null -> {type: 'null'}. 혼합 요소 타입의 배열에 대해 생성기는 관찰된 각 타입을 포함하는 oneOf 하위 스키마를 출력합니다. 여러 샘플 객체의 경우, 생성기는 비교하여 required 목록을 조립합니다. 모든 샘플에 존재하는 키는 필수, 어떤 샘플에서든 누락된 키는 선택 사항입니다. 샘플이 특정 값에 집중될 때 패턴과 제약이 추론됩니다. 필드의 모든 숫자가 [1, 100] 범위에 있으면 {type: 'integer', minimum: 1, maximum: 100}을 출력하고, 문자열 필드가 항상 UUID이면 format: 'uuid' 태그와 pattern: '^[0-9a-f]{8}-...' 정규식을 출력합니다. 열거형 휴리스틱은 문자열 필드가 샘플 전반에 걸쳐 10개 이하의 고유 값을 가질 때 작동합니다(예: role: 'admin' | 'editor' | 'viewer' 모두 관찰됨). 이 경우 생성기는 enum 배열을 출력합니다. 깊이 중첩된 객체와 재귀 구조는 $defs 섹션(Draft 2020-12; 구 $definitions는 Draft-07 키워드)으로 추출되고 $ref를 통해 참조됩니다. 재귀 구조(예: 'children' 필드가 트리 노드 타입인 트리 노드)는 부모의 $defs 항목을 가리키는 스텁 $ref를 가지며, 검증기는 검증 시 이를 해석합니다. 생성기는 자동으로 적절한 ref-vs-inline 트레이드오프를 선택합니다. 얕은 스키마는 인라인으로 유지되고, 깊은 스키마는 출력의 가독성을 유지하기 위해 정의로 분리됩니다. 생성된 스키마는 주어진 입력에 대해 결정론적입니다. 동일한 JSON 샘플은 항상 동일한 스키마를 생성하며, 생성기는 원격 호출 없이 순수 JavaScript로 구현됩니다.
- 타입 추론 규칙: 정수 -> integer, 실수 -> number, 문자열 -> string, 불리언 -> boolean, 배열 -> array + items, 객체 -> object + properties. JSON null -> type: null(Draft 6+) 또는 type: 'null' 문자열.
- 필수 필드 감지: 모든 샘플 객체를 비교하여 모든 객체에 존재하는 필드는 필수로 취급되어 required 배열에 추가. 누락된 필드는 선택 사항. 단일 샘플 입력은 required: []를 남김(휴리스틱에 최소 2개 샘플 필요).
- 열거형 추론 휴리스틱: 필드가 샘플 전반에 걸쳐 적은 수의 고유 문자열 값을 가질 때(카디널리티 <= 10) 자동으로 enum 제약으로 인식. 더 큰 카디널리티는 일반 문자열 타입으로 유지.
- 자동 감지 형식: 문자열 시그니처를 기반으로 email, uri, date-time, uuid 같은 형식 힌트가 문서화와 검증을 위해 태그됨. format 키워드는 Draft 2020-12에서 정보 제공용이며, 검증자는 이를 강제하거나 무시할 수 있음.
- 중첩 $ref 추출: 깊이 중첩된 객체는 내부 $defs(Draft 2020-12 키워드; 구 $definitions는 Draft 7)로 추출되고 $ref를 통해 참조되어 스키마가 너무 장황해지는 것을 방지. 재귀 구조는 부모의 $defs 항목을 가리키는 스텁 $ref를 받음.
- 제약 확장: 기본 타입 외에도 minimum/maximum(숫자 범위), minLength/maxLength(문자열 길이), pattern(정규식) 등의 제약을 추가할 수 있음. 입력 샘플이 특정 값에 집중될 때 생성기가 이를 출력.
- 드래프트 선택: 2020-12(최신)가 기본값이며 $defs 사용. 2019-09도 $defs 사용. Draft-07은 $definitions를 사용하며 대부분의 기존 도구가 여전히 이를 출력. Draft 6는 필수 필드를 속성의 형제 속성으로가 아닌 부모의 required 배열에 나열하는 strict-required 시맨틱스를 도입.
- 조합 키워드(Draft 2019-09+): allOf(모든 하위 스키마에 매칭), anyOf(최소 하나), oneOf(정확히 하나), not(매칭 불가). 샘플 값이 두 개의 분리된 하위 스키마(예: integer vs string)에 맞을 때 생성기는 oneOf를 선택.
예시
단순 객체 -> Schema
{"name": "Alice", "age": 25}
->
{
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "integer" }
},
"required": ["name", "age"]
}배열을 포함한 Schema
{"tags": ["js", "ts"]}
->
{
"type": "object",
"properties": {
"tags": {
"type": "array",
"items": { "type": "string" }
}
}
}Enum을 포함한 Schema
{"role": "admin"}
->
{
"type": "object",
"properties": {
"role": { "type": "string", "enum": ["admin", "user", "guest"] }
}
}자주 묻는 질문
JSON Schema가 뭔가요?
JSON Schema(현재 2020-12 드래프트)는 JSON 문서를 검증하기 위한 어휘입니다. 어떤 필드가 있는지, 그 타입, 범위, 패턴은 어떤지 등 문서의 기대 형태를 기술하며, XML Schema나 TypeScript 타입과 비슷한 역할을 합니다. Ajv, Hyperjump를 비롯한 대부분의 API 프레임워크가 런타임 검증에 활용합니다.
생성기는 어떤 JSON Schema 드래프트로 출력하나요?
최신 드래프트(보통 2020-12 또는 draft-07)를 사용합니다. 출력은 버전을 선언하는 $schema, 필요 시 $id, type, 그리고 객체/배열/문자열/숫자/불리언/null에 맞는 키워드로 시작합니다. 검증기가 특정 구버전을 요구한다면 드래프트 옵션을 바꿔 주세요.
JSON 샘플에서 타입은 어떻게 추론하나요?
샘플을 순회하며 각 속성의 타입을 기록합니다. 배열의 경우 한 개 이상의 요소에서 items 스키마를 추론하며(요소 타입이 다르면 합집합), 여러 타입이 섞인 속성은 oneOf나 anyOf로 표현합니다. 결과는 너그러운 출발점이므로, required, minLength, pattern 같은 제약은 직접 다듬어야 합니다.
모든 속성이 required로 표시되나요?
설정에 따라 달라집니다. 기본값은 관찰된 모든 속성을 required로 표시하는 것입니다. 샘플이 단지 한 예시일 뿐이고 다른 인스턴스에서는 일부 필드가 빠질 수 있다면 'all optional' 옵션을 켜세요. 생성 후 required 배열을 직접 수정해도 됩니다.
중첩된 객체와 배열은 어떻게 처리되나요?
중첩 객체는 중첩된 'properties' 블록이 되고, 배열은 'items' 정의가 됩니다. 깊은 중첩도 잘 동작합니다. 같은 형태가 반복적으로 나타난다면 이후에 $defs / $ref로 리팩터링할 수 있지만, 생성기는 자동으로 중복을 제거하지는 않습니다.
추론할 수 없는 항목은요?
포맷 제약(date-time, email, uuid), enum 멤버십, 정규식 패턴, minimum/maximum, minItems/maxItems, 의존 관계 등은 단일 샘플로는 알 수 없으므로 직접 추가해야 합니다. 생성된 스키마는 골격으로 삼고 거기서부터 다듬으세요.
JSON이 업로드되나요?
아니요. 추론은 로컬에서 동작합니다. 붙여 넣은 JSON은 브라우저 밖으로 나가지 않습니다.