data validation library 순위
- Zod (31k ⭐)
- Validator.js (22.7k ⭐)
- Yup (22.4k ⭐)
- Joi (20.7k ⭐)
- Ajv (13.5k ⭐)
- Superstruct (6.9k ⭐)
- Valibot (5.3k ⭐)
- v8n (4.2k ⭐)
- Typia (4.1k ⭐)
- Ow (3.8k ⭐)
출처 : https://byby.dev/js-object-validators
1. zod 활용
const schema = z.object({
name: z.string().min(2, '이름이 올바르지 않습니다'),
age: z.number().min(18, '18세 이상만 가능합니다'),
email: z.string().email('이메일이 올바르지 않습니다'),
sex: z.boolean()
});
- 함수형 접근: Zod는 함수 기반의 유효성 검사 라이브러리이다. 모든 검증 스키마는 함수처럼 작성되며, 검증된 결과는 함수 호출로 즉시 반환됩니다.
- 경량: Zod는 상대적으로 가볍고 단순한 API를 가지고 있어 빠르고 직관적인 코드 작성이 가능하다.
- TypeScript와의 통합: Zod는 TypeScript 타입을 스키마에서 직접 추론할 수 있다.
장점
- 간결한 문법
- 타입 추론
단점
- 클래스 수준의 유효성 검사에 비해 스키마를 코드에서 바로 작성해야 하므로 복잡한 구조에서는 사용이 다소 번거로울 수 있다.
2. class validator 활용
class UserInput {
@IsNotEmpty({ message: '이름을 입력하세요' })
name!: string;
@IsInt({ message: '나이를 입력하세요' })
@Min(18, { message: '18세 이상부터 가능합니다' })
age!: number;
@IsEmail({}, { message: '올바르지 않은 이메일입니다' })
email!: string;
@IsBoolean({ message: '성별을 지정하세요' })
sex!: boolean;
}
- 데코레이터 기반: class-validator는 데코레이터를 사용해 클래스를 기반으로 유효성 검사를 수행한다. TypeScript의 클래스 문법과 자연스럽게 통합되어 있으며, 클래스 속성에 데코레이터를 추가해 검증 규칙을 설정
- Class와의 통합: 데이터 구조와 검증 로직을 클래스 내부에서 정의할 수 있으며, 객체지향적인 방식으로 관리할 수 있다.
- 메타데이터 활용: TypeScript의 리플렉션 기능을 사용해 런타임에서 객체의 메타데이터를 추출하여 유효성 검사를 수행
장점
- 객체지향
단점
- 별도 설정 필요 : 패키지가 별도로 필요하고, 프로젝트에 추가적인 설정도 필요함
3. joi 활용
const schema = Joi.object({
name: Joi.string().min(2).required().messages({
'string.empty': '이름을 입력하세요',
'string.min': '최소 2자 이상 입력하세요'
}),
age: Joi.number().min(18).required().messages({
'number.base': '나이를 입력하세요',
'number.min': '18세 이상부터 가능합니다'
}),
email: Joi.string()
.email({ tlds: { allow: false } })
.required()
.messages({
'string.empty': '이메일을 입력하세요',
'string.email': '올바르지 않은 이메일 형식입니다'
}),
sex: Joi.boolean().required().messages({
'boolean.base': '성별을 선택하세요'
})
});
- 함수형 검증: Joi는 함수 기반의 검증 라이브러리로, 각 속성에 대해 세밀한 제어가 가능하다. 복잡한 검증 로직을 작성할 때 유용
- 서버 사이드 검증: 주로 서버 사이드에서 많이 사용되며, Express.js 같은 프레임워크와 통합하기에 적합
장점
- 세밀한 규칙 설정 : 각 속성에 대한 다양한 규칙 제공, 복잡한 조건도 처리 가능
- 광범위한 사용 : Express.js와 같은 서버 환경에서 주로 사용됨
단점
- typescript와의 통합 부족 : Zod 와 달리 Typescript의 타입 추론을 기본적으로 지원하지 않음, 수동 타입 명시 필요
- 복잡한 문법 : 스키마 정의로 인해 코드가 장황해지기도 함
구조상 class validator를 활용한 코드가 가장 깔끔하고 typescript를 활용하는 목적에 가장 부합하였으나
class validator와 joi를 활용하면 코드 설정(tsconfig.js, svelte.config.js)을 바꿔야하는 번거로움이 있어서 기존에 사용하던 zod를 채택하기로 하였습니다.
'💻 프론트엔드 : Frontend > Javascript | Typescript' 카테고리의 다른 글
헷갈리는 Lodash import 구문 : import * as _는 되고 import _는 안 되는 이유 (0) | 2025.06.24 |
---|---|
readExcelFile로 병합된 셀을 잘 받아오는 법 (0) | 2024.10.04 |
zod : 원하는 message가 아닌 ‘expected ~ but got ~’ 라 alert가 뜨는 현상 (2) | 2024.10.04 |
브라켓[]을 활용한 동적 라우팅 (0) | 2024.09.06 |