zod검증typescript
Zod 런타임 검증, 어디에 넣고 어디에 빼야 하나
✨ AI 요약
긴 글, 핵심만 먼저 — 이 글을 3줄로 정리해드려요.
조회 11
TypeScript의 타입은 컴파일 타임에만 존재한다. 런타임에 들어오는 데이터(요청 바디, 외부 API 응답, 환경변수)는 타입이 보장해 주지 않는다. 이 경계를 지키는 게 Zod의 역할이다.
신뢰 경계에만 세워라
Zod를 모든 함수에 바르면 코드가 스키마 지옥이 된다. 원칙은 하나 — 신뢰할 수 없는 데이터가 들어오는 경계에서 한 번만 검증한다.
- API 라우트의 요청 바디 ✅
- 외부 API 응답 ✅
- 환경변수 (부팅 시 1회) ✅
- 내부 함수 간 인자 전달 ❌ — 여긴 타입 시스템의 영역
스키마에서 타입을 뽑아라
const CreatePost = z.object({
title: z.string().min(1).max(150),
content: z.string(),
tags: z.array(z.string().max(24)).max(5).default([]),
});
type CreatePostInput = z.infer<typeof CreatePost>;
타입을 따로 정의하고 스키마도 따로 만들면 반드시 어긋난다. 스키마가 원본, 타입은 z.infer로 파생 — 방향을 고정하자.
safeParse로 흐름 제어
const parsed = CreatePost.safeParse(await req.json());
if (!parsed.success) {
return NextResponse.json(
{ error: parsed.error.issues[0].message },
{ status: 400 },
);
}