npmtrends로 본 5년간 라이브러리 다운로드 수
데이터 검증은 웹 개발에서 중요한 요소다. 입력 값이 예상한 형식인지 확인하고, 문제가 발생하기 전에 방지할 수 있기 때문이다.
JavaScript 및 TypeScript에서 많이 사용하는 데이터 검증 라이브러리로는 Yup, Joi, Zod가 있다. 이 글에서는 세 라이브러리를 비교하고, 각각 어떤 상황에서 적합한지 알아보겠다.
세 라이브러리는 다음과 같은 공통점을 가진다.
required, min, max, pattern 등의 다양한 검증 메서드 지원 하지만 각각의 라이브러리는 특징이 다르기 때문에 특정 환경에서 더 적합하게 사용할 수 있다.
| 라이브러리 | 특징 | TypeScript 지원 | 성능 | 주요 사용 사례 |
|---|---|---|---|---|
| Yup | 직관적인 API, React와 잘 어울림 | ❌ (런타임 검증만 가능) | 빠름 | 프론트엔드 폼 검증 |
| Joi | Node.js 백엔드에 특화, 강력한 검증 기능 | ❌ (런타임 검증만 가능) | 느림 | Express/Koa API 요청 검증 |
| Zod | 타입스크립트 친화적, 정적 타입 지원 | ✅ (런타임 + 정적 타입) | 매우 빠름 | TypeScript 프로젝트 |
Yup은 프론트엔드 폼 검증에 적합한 라이브러리다. Formik과 함께 사용하기 좋다.
import * as yup from 'yup';
const schema = yup.object({
name: yup.string().required(),
age: yup.number().min(18).required(),
});
schema.validate({ name: 'John', age: 20 })
.then(() => console.log('Valid!'))
.catch(err => console.log(err.errors));
✔️ 장점
❌ 단점
Joi는 백엔드 API 요청 검증에 최적화된 라이브러리다. Express나 Koa 같은 Node.js 프레임워크에서 많이 사용된다.
when, custom, alternatives)을 지원 import Joi from 'joi';
const schema = Joi.object({
name: Joi.string().required(),
age: Joi.number().min(18).required(),
});
const { error } = schema.validate({ name: 'John', age: 20 });
if (error) {
console.log(error.details);
} else {
console.log('Valid!');
}
✔️ 장점
when) 기능이 강력 ❌ 단점
Zod는 TypeScript 친화적인 검증 라이브러리다. 런타임 검증과 정적 타입 검증을 동시에 지원하는 것이 가장 큰 장점이다.
z.infer<T> 지원) import { z } from 'zod';
const schema = z.object({
name: z.string(),
age: z.number().min(18),
});
type User = z.infer<typeof schema>; // TypeScript 타입 추론 가능
const result = schema.safeParse({ name: 'John', age: 20 });
if (result.success) {
console.log('Valid!');
} else {
console.log(result.error);
}
✔️ 장점
❌ 단점
when) 기능 부족 | 사용 사례 | 추천 라이브러리 |
|---|---|
| 프론트엔드 폼 검증 (React) | Yup |
| Node.js API 요청 검증 (Express/Koa) | Joi |
| TypeScript 기반 프로젝트 | Zod |
| 런타임 성능이 중요한 경우 | Zod |
| 유연한 조건부 검증이 필요한 경우 | Joi |
Yup이 적합하다. Joi가 많이 사용되지만, 성능 문제로 Zod를 대체하는 경우가 많다. Zod가 가장 강력한 선택이다. 👉 Zod가 최근 가장 인기 있고 추천되는 라이브러리지만, 상황에 따라 Yup과 Joi도 여전히 많이 사용된다!