본문 바로가기
💻 프론트엔드 : Frontend/Javascript | Typescript

validation library 비교 (zod, class-validator, joi)

by 예옹이 2024. 10. 11.

data validation library 순위

  1. Zod (31k ⭐)
  2. Validator.js (22.7k ⭐)
  3. Yup (22.4k ⭐)
  4. Joi (20.7k ⭐)
  5. Ajv (13.5k ⭐)
  6. Superstruct (6.9k ⭐)
  7. Valibot (5.3k ⭐)
  8. v8n (4.2k ⭐)
  9. Typia (4.1k ⭐)
  10. 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를 채택하기로 하였습니다.