Framework/NestJS

[NestJS] 내장 파이프(validationPipe)를 사용해서 유효성 검사하기

  • -
Validation Pipe를 사용하여 유효성 검증을 하는 방법을 정리한 글입니다.

 

파이프란?

NestJS에서 파이프는 HTTP 요청의 핸들러 전/후에 적용되는 중간 단계입니다.

파이프는 요청 데이터를 검증하거나 수정하거나, 응답을 가공하는 등의 역할을 수행하여 요청과 응답을 다룹니다.

 

가령 사용자가 회원가입을 할 때, 작성한 정보가 모두 유효한 값일 때 회원 가입을 할 수 있도록 하는 것과 같이 값의 유효성을 검사하는데에 파이프가 쓰이게 됩니다.

 

파이프는 NestJS에서 기본적으로 제공되는 몇 가지 내장 파이프와 사용자가 직접 만들어 사용할 수 있는 커스텀 파이프들이 있습니다.

이 글에서는 Validation Pipe를 사용하여 유효성 검사를 하는 예제에 대해 설명하고 있습니다.

 

 

 

 

패키지 설치

Validation Pipe를 사용하기 위해서는 class-validator와 class-transfromer 패키지가 필요합니다.

아래 명령을 실행하여 패키지를 설치할 수 있습니다.

npm install class-validator class-transformer

 

 

 

 

전역 ValidationPipe 설정하기

유효성 검증을 하기 위해서는 Validation Pipe를 main.ts에 설정해야 합니다. 

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
// ✨validationPipe 임포트
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  // ✨전역 파이프에 validationPipe 객체 추가
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();



 

 

 

검증용 Dto 만들기

앞서 회원가입을 예시로 들었기 떄문에 UserDto를 만들어보겠습니다.

import { IsEmail, IsString } from "class-validator";

// 유저를 생성할 때
export class CreateUserDto {
  @IsEmail()
  email: string;

  @IsString()
  password: string;

  @IsString()
  username: string;
}

// 유저 정보를 업데이트 할 때
export class UpdateUserDto {
  @IsString()
  username: string;

  @IsString()
  password: string;
}


유저를 생성할 때와, 업데이트할 때 필요한 정보가 달라 각각 DTO를 만들었습니다.

IsEmail은 해당 필드가 이메일인지 검증하는 데코레이터이고,

IsString은 해당 필드가 문자열인지 검증하는 데코레이터입니다.

 

IsEmail과 IsString 이외에도 많은 데코레이터들이 있습니다.

 

데코레이터 기능
@IsEmpty() 값이 null 또는 undefined, ""인지 확인
@IsNotEmpty() 값이 null 또는 undefined, ""이 아닌지 확인
@IsIn(values: any[]) 값이 values 배열에 있는 값인지 확인
@IsNotIn(values: any[]) 값이 values 배열에 없는 값인지 확인
@IsBoolean() 값이 boolean인지 확인
@IsDate() 값이 Date 타입인지 확인
@IsString() 값이 문자열인지 확인
@isInt() 값이 int인지 확인
@IsAlpha 값이 영어(a-z, A-Z)인지 확인

 

더 많은 데코레이터는 아래 저장소에서 확인하실 수 있습니다.

https://github.com/typestack/class-validator?tab=readme-ov-file#validation-decorators

 

GitHub - typestack/class-validator: Decorator-based property validation for classes.

Decorator-based property validation for classes. Contribute to typestack/class-validator development by creating an account on GitHub.

github.com



적용하기

import { Controller, Body, Get, Post, Put, Delete, Param } from "@nestjs/common";
import { User } from './user.entity';
// ✨ Dto 임포트
import { CreateUserDto, UpdateUserDto } from './user.dto';
import { UserService } from './user.service';

@Controller('users')
export class UserController {
  constructor(private userService: UserService) {
  }

  @Post('/create')
  createUser(@Body() user: CreateUserDto) {
    return this.userService.createUser(user);
  }

  // ✨CreateUserDto 적용
  @Get('/getUser/:email')
  async getUser(@Param('email') email: string) {
    const user = await this.userService.getUser(email);
    console.log(user)
    return user;
  }

  // ✨UpdateUserDto 적용
  @Put('/update/:email')
  updateUser(@Param('email') email: string, @Body() user: UpdateUserDto) {
    console.log(user);
    return this.userService.updateUser(email, user);
  }

  @Delete('/delete/:email')
  deleteUser(@Param('email') email: string) {
    return this.userService.deleteUser(email);
  }

}

 

그러면 이제 데코레이터가 Body에 있는 json의 value를 검사하게 됩니다.

 


이 글을 참고하여 본인의 프로젝트에 응용하거나, 다른 곳에서라도 도움이 되었으면 좋겠습니다.

글 읽어주셔서 감사합니다.

'Framework > NestJS' 카테고리의 다른 글

[NestJS] NestJS 프로젝트 첫 시작  (0) 2023.12.27
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.