JSON → Zod 스키마
JSON 데이터에서 Zod 유효성 검사 스키마를 즉시 생성. 중첩 객체, 배열, nullable 필드, 선택적 속성 지원. 브라우저에서 처리.
- 브라우저에서 처리
- 데이터가 브라우저 밖으로 나가지 않습니다
- 무료 · 회원가입 불필요
WeChat으로 스캔하여 공유
예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.
출력 형식
완전한 TypeScript 스니펫을 출력합니다:
import { z } from “zod”— Zod 가져오기const FooSchema = z.object({…})— 스키마 정의export type Foo = z.infer<typeof FooSchema>— 추론된 TypeScript 타입
주요 사용 사례
- API 유효성 검사: API 응답 예시에서 스키마를 생성하여 실제 응답을 런타임에 검증.
- 폼 유효성 검사: 폼 데이터 형태를 Zod 스키마로 변환하여 react-hook-form 등에서 활용.
- 설정 파일: JSON 파일에서 로드하는 설정 객체를 정의하고 검증.
- 타입 안전성: TypeScript와 결합하여 하나의 스키마에서 런타임 검증과 정적 타입 추론을 동시에.
변환 예시
루트 이름을 User로 두고 다음 JSON을 넣으면
{
"id": 42,
"email": "alice@example.com",
"price": 19.9,
"tags": ["admin", "beta"],
"metadata": null,
"orders": [
{ "sku": "A1", "qty": 2 },
{ "sku": "B7", "qty": 1, "note": "gift" }
]
}
다음 결과가 나옵니다.
import { z } from "zod";
const UserSchema = z.object({
id: z.number().int(),
email: z.string(),
price: z.number(),
tags: z.array(z.string()),
metadata: z.null(),
orders: z.array(z.object({
sku: z.string(),
qty: z.number().int(),
note: z.string().optional(),
})),
});
export type User = z.infer<typeof UserSchema>;
주문 두 건 중 한 건에만 note가 있으므로 note는 optional입니다. 출력에는 Zod 3과 Zod 4에서 모두 동작하는 호출만 씁니다.
생성된 스키마 다듬기
샘플에는 필드마다 값이 하나뿐이라 업무 규칙은 알 수 없습니다. 사용하기 전에 다음을 확인하세요.
| 생성 결과 | 문제 | 수정 (Zod 4) |
|---|---|---|
email: z.string() | 아무 문자열이나 통과 | z.email() (Zod 3: z.string().email()) |
qty: z.number().int() | 값이 항상 정수일 때만 맞음. 샘플의 price: 10도 .int()가 되어, 나중에 10.5가 “expected int”로 실패 | 가격은 z.number()로 바꾸고 .min(0)이나 .positive() 추가 |
metadata: z.null() | null만 통과 | z.string().nullable() |
status: z.string() | 아무 문자열이나 통과 | z.enum(["active", "inactive"]) |
| 샘플에 있던 필드 | API가 가끔 빼더라도 필수가 됨 | .optional() 추가 |
실패하면 멈춰야 하는 곳(시작 시 설정 읽기 등)에는 .parse()를 씁니다. ZodError를 던집니다. API 응답과 사용자 입력에는 .safeParse()를 씁니다. { success: false, error }를 반환하므로 오류를 직접 처리할 수 있습니다.
제한 사항
- 타입은 샘플 하나로 정해집니다. 빈 배열은
z.array(z.unknown()), 빈 객체는z.record(z.string(), z.unknown())가 됩니다. null은z.null()이 됩니다..nullable()은 붙지 않습니다. 객체 배열에서 어떤 키가 첫 항목에서null, 두 번째 항목에서 문자열이면z.union([z.null(), z.string()])이 됩니다.- 타입이 섞인 배열은 union이 됩니다.
[{"a": 1}, 2]같은 배열은 루트에 있든 객체 안에 있든z.array(z.union([z.number().int(), z.object({ a: z.number().int() })]))가 됩니다. 같은 배열의 객체는 하나의z.object로 합치므로 union의 객체 멤버는 하나입니다. - 문자열 형식과 범위는 없습니다. 이메일, URL, 날짜, UUID는 모두
z.string()입니다.
FAQ
Zod이란 무엇인가요?
Zod는 TypeScript 우선 스키마 선언 및 유효성 검사 라이브러리입니다. 데이터의 형태를 스키마로 정의하고 런타임에 데이터를 검증할 수 있습니다. API 응답 검증, 폼 유효성 검사, 설정 파싱에 널리 사용됩니다.
타입은 어떻게 추론되나요?
각 JSON 값을 검사합니다: 문자열→z.string(), 불리언→z.boolean(), 정수→z.number().int(), 부동소수점→z.number(), null→z.null(), 배열→z.array(), 객체→z.object(). 객체 배열에서 일부 항목에만 있는 키는 선택적으로 표시됩니다.
엄격 모드란 무엇인가요?
엄격 모드를 활성화하면 모든 z.object()에 .strict()가 추가됩니다. 스키마에 정의되지 않은 추가 키가 포함된 입력 객체를 Zod가 거부합니다. 비활성화 시 추가 키는 자동으로 무시됩니다.
생성된 스키마를 바로 사용할 수 있나요?
생성된 스키마는 좋은 시작점입니다. 문자열·숫자에 .min()/.max() 제약 추가, nullable 필드를 .nullable().optional()로 변경, 중첩 스키마를 별도 상수로 분리하는 등 프로젝트에 맞게 조정하는 것을 권장합니다.
JSON 데이터가 서버로 전송되나요?
아니요. 모든 처리는 브라우저 내에서 완전히 이루어집니다. JSON 데이터는 기기 밖으로 나가지 않습니다.