-
Nest.js 에서의 PipeNest.js 2025. 2. 12. 10:04
* 목적
: 요청이 controller로 인수를 보내기 전에 요청 객체를 변환 및 검증 할 수 있는 기회를 제공
: 종류는 2가지가 있다. 1. 검증 (validator), 2. 변경 (transformer)
* 왜 쓰는가?
: api 서버 개발시 프론트에서 잘못된 인수를 넘겨주는 경우에 대해 대응 하기 위해서!
: 즉! 프론트에서 아무리 개떡같이 줘도, 백엔드는 찰떡같이 알아 들어야 한다.
: 개인적으로 백엔드 개발자의 역량은 이런 디테일을 얼마나 잘 살려줘야 고수로 갈수 있는게 아닐까 싶다.
* nestjs 에 내장된 파이프 종류
: ValidationPipe, ParseIntPipe, ParseBoolPipe, ParseArrayPipe, ParseUUIDPipe, DefaultValuePipe
* 필요 패키지
npm install class-validator class-transformer --save
- 패키지에 어떤 기능들이 있는지 나와있는 문서
: https://github.com/typestack/class-validator#manual-validation
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
* 사용 예시
- Validation Pipe
: Validation Pipe 는 DTO에 정의한 validation decorator 기준들을 체킹 해준다.
export class AuthCredentialDto { @IsNotEmpty() @IsString() @MinLength(4) @MaxLength(20) username: string; @IsNotEmpty() @IsString() @MinLength(8) @MaxLength(20) @Matches(/^[a-zA-Z0-9]*$/, { message: 'password only accepts english and number', }) password: string; }
// src/auth/auth.controller.ts @Post('/signup') @UsePipes(ValidationPipe) createUser( @Body(ValidationPipe) authCredentialDto: AuthCredentialDto, ): Promise<User> { return this.authService.createUser(authCredentialDto); }
- ParseIntPipe
@Delete('/:id') deleteBoard(@Param('id', ParseIntPipe) id: number): Promise<void> { return this.boardsService.deleteBoard(id); }
- Transformer
// src/boards/pipes/board-status-validation.pipe.ts import { BadRequestException, PipeTransform } from '@nestjs/common'; import { BoardStatus } from '../board-status-enum'; // custom pipe export class BoardStatusValidationPipe implements PipeTransform { readonly StatusOptions = [BoardStatus.PUBLIC, BoardStatus.PRIVATE]; transform(value: any) { value = value.toUpperCase(); if (!this.isStatusValid(value)) { throw new BadRequestException(`${value} is an invalid status`); } return value; } private isStatusValid(status: any) { const index = this.StatusOptions.indexOf(status); return index !== -1; } }
// src/boards/boards.controller.ts @Patch('/:id') updateBoardStatus( @Param('id', ParseIntPipe) id: number, @Body('status', BoardStatusValidationPipe) status: BoardStatus, ): Promise<Board> { return this.boardsService.updateBoardStatus(id, status); }
'Nest.js' 카테고리의 다른 글
Nest.js 모듈 생성(추가) 퀵가이드 (0) 2025.03.05 Nest.js 로그 (0) 2025.02.26