Zod의 핵심 가치
Zod는 현대적인 데이터 검증 및 타입 추론 도구로, 다음과 같은 특징을 통해 프론트엔드 개발자의 고급 기술 스택으로 자리 잡고 있습니다:
- TypeScript 연동 최적화: 스키마 정의 시 자동으로 타입 정보를 생성해 중복 작업을 제거합니다.
- 런타임 검증 지원: 컴파일 타임 검증에 비해 실제 실행 시 데이터 유효성을 점검하여 예측 불가능한 오류를 방지합니다.
- 간결한 API 설계: Yup과 AJV 대비 단순한 JSON Schema 학습 곡선을 제공합니다.
- 다양한 확장성: 중첩 구조, 커스텀 검증 로직, 비동기 처리 등 복잡한 요구사항을 지원합니다.
Zod의 기능 구조
Zod는 TypeScript 중심의 데이터 모델링 및 검증 라이브러리로, 개발자 경험 향상을 목표로 설계되었습니다. 주요 특징은 다음과 같습니다:
- 무존재 의존성: 외부 라이브러리 없이도 작동하는 경량 구조입니다.
- 크로스 플랫폼 호환성: Node.js 환경과 현대 브라우저에서 모두 실행 가능합니다.
- 초소형 크기: 최소 8KB의 파일 크기로 효율적인 배포가 가능합니다.
- 불변성 보장:
.optional()같은 메서드는 새 인스턴스를 반환해 상태 변경을 방지합니다. - 연속형 인터페이스: 직관적인 체인 호출 방식으로 코드 가독성을 높였습니다.
- 함수형 접근 방식: 파싱(logic parsing) 기반의 검증 메커니즘을 채택했습니다.
Zod 사용 방법
- 기본 데이터 타입
import { z } from 'zod';
const basicValidator = z.string();
console.log(basicValidator.parse('안녕하세요')); // 성공
console.log(basicValidator.parse(42)); // 오류 발생: 숫자 입력 시 예상 문자열 타입 불일치
원시 타입 범주
// 기본값
z.string();
z.number();
z.bigint();
z.boolean();
z.date();
z.symbol();
// 특수값
z.undefined();
z.null();
z.void(); // undefined 값 허용
// 유연한 타입
z.any(); // 모든 값 허용
z.unknown(); // 타입 분석 불가능한 값
// 공집합 타입
z.never(); // 아무런 값을 허용하지 않음
- 객체 구조 검증
const userValidator = z.object({
username: z.string().min(3),
birthYear: z.number().int()
});
console.log(userValidator.parse({ username: 'test', birthYear: 1990 })); // 유효한 객체 반환
- 배열 처리
const stringListValidator = z.array(z.string());
console.log(stringListValidator.parse(['a', 'b'])); // 정상 출력
console.log(stringListValidator.parse(['a', 123])); // 오류 발생: 숫자 입력 시 문자열 요구
- 열거형 검증
const statusValidator = z.enum(['active', 'inactive']);
console.log(statusValidator.parse('active')); // 정상
console.log(statusValidator.parse('pending')); // 오류 발생: 허용되지 않은 값 입력