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
적용하기
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 |
---|