>웹 프론트엔드 >JS 튜토리얼 >zod 대 클래스 유효성 검사기 및 클래스 변환기

zod 대 클래스 유효성 검사기 및 클래스 변환기

Patricia Arquette
Patricia Arquette원래의
2024-12-19 11:42:18766검색

zod vs class-validator & class-transformer

NestJS의 클래스 유효성 검사기 및 클래스 변환기와 zod 비교

zod나 클래스 검증자 및 클래스 변환기 사이에 혼란스럽거나 적어도 궁금했습니다.
NestJS의 검증 라이브러리로 사용됩니다.

급소

그냥 바로 가보세요.

1. 클래스 검증자 및 클래스 변환기를 선택하는 이유

  • NestJS에서 일반적으로 널리 사용되는 듀오 패키지입니다
  • 작성 방법은 데코레이터 기반 유효성 검사이기 때문에 매우 NestJS입니다.
  • 클래스 변환기 및 ValidationPipe를 사용하여 깔끔하고 원활한 통합

2. Zod를 선택한 이유

  • 프레임워크에 구애받지 않음
  • 매우 타이프스크립트
  • 기능적스키마 기반 접근 방식
  • 을 선호하는 사용자
  • 성능 및 경량 검증이 중요

세부

class-validator 및 class-transformer는 NestJS에서 유효성 검사로 가장 일반적으로 사용되는 2가지 패키지입니다.
네, 데코레이터 기반,
을 사용하여 작성 방법이 NestJS와 동일하다는 점만 빼면요. 또한 ValidationPipe와 함께 DTO

로 사용할 수 있기 때문에 깔끔하고 원활하기 때문입니다.

따라서 컨트롤러가 수신한 수신 데이터/페이로드는 해당 정의에 따라 검증 및 변경/변환되었습니다.
그동안 Zod는 수신된 데이터/페이로드를 수동으로 검증해야 합니다.
네, 1줄에서 최대 3줄까지 가능합니다
물론 검증 기능이 더 많이 필요할수록 수동 프로세스도 더 많이 필요합니다.

절차 세부사항

다음은 비교를 위한 세부 절차(주관적일 수 있음)입니다.

클래스 유효성 검사기 및 클래스 변환기

1. 설치

npm install class-validator class-transformer

2. 글로벌 검증 활성화

// main.ts
....
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
....
  // Enable validation globally
  app.useGlobalPipes(new ValidationPipe({
    transform: true, // Automatically transform payloads to DTO instances
    whitelist: true, // Strip unknown properties
    forbidNonWhitelisted: true, // Throw error for unknown properties
  }));
....
}
....

3. DTO(데이터 전송 개체) 정의

import { IsNotEmpty, IsString, IsInt, Min } from "class-validator";
import { Type, Transform } from "class-transformer";

export class CreateUserDto {
    @Transform(({ value }) => value.trim()) // Trim whitespaces
    @IsNotEmpty({ message: "Nama tidak boleh kosong" })
    @IsString({ message: "Nama harus berupa string" })
    @Min(3, { message: "Minimal panjang nama 3 karakter" })
    name: string;

    @Type(() => Number) // Transform input ke tipe Number
    @IsNotEmpty({ message: "Nama tidak boleh kosong" })
    @IsInt({ message: "Umur harus berupa bilangan bulat" })
    @Min(17, { message: "Minimal umur terdaftar 17 tahun" })
    age: number;
}

꽤 길지만 데코레이터 기반입니다.

4. 검증의 활용

import { Body, Controller, Post } from "@nestjs/common";
import { CreateUserDto } from "./create-user.dto";

@Controller("users")
export class UsersController {
    @Post()
    create(@Body() createUserDto: CreateUserDto) {
        // Pada titik ini data/payload createUserdDto
        // sudah tervalidasi & diubah sesuai definisinya
        // developer bisa langsung eksekusi service
        // atau logic yang lain
    }
}

조드

1. 설치

npm install zod

2. 검증 체계 생성

// user.validaiton.ts
import { z, ZodType } from "zod";

export class UserValidation {
    static readonly CREATE: ZodType = z.object({
        name: z
            .string({ message: "Nama harus berupa string" })
            .nonempty({ message: "Nama tidak boleh kosong" })
            .min(3, "Minimal panjang nama 13 karakter"),
        age: z
            .number({ message: "Umur harus berupa angka" })
            .int({ message: "Umur harus berupa bilangan bulat" })
            .min(17, "Minimal umur terdaftar 17 tahub"),
    });
}

export type TCreateUserPayload = z.infer<typeof UserValidation.CREATE>;

*개인적: 위의 스키마보다 이 스키마를 읽는 것이 더 좋습니다

3. 검증의 활용

import { Body, Controller, Post } from "@nestjs/common";
import { UserValidation, TCreateUserPayload } from "./user.validation.ts";

@Controller("users")
export class UsersController {
    @Post()
    create(@Body() createUserPayload: TCreateUserPayload) {
        const payload = UserValidation.CREATE.parse(createUserPayload);
        // Pada titik ini data/payload payload
        // sudah tervalidasi & diubah sesuai definisinya
        // developer bisa langsung eksekusi service
        // atau logic yang lain
    }
}

결론

개인적으로는 Zod를 사용하는 방식을 선호합니다.
다만, 강조해야 할 점은 팀의 필요와 기준에 따라 선택하는 것입니다.

https://abdulghofurme.github.io/posts/zod-vs-class-validator-n-class-transformer/

위 내용은 zod 대 클래스 유효성 검사기 및 클래스 변환기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.