데이터 형 변환과 데이터 유효성 체크를 위해서 사용
메소드가 호출되기 직전에 파이프 삽입
데이터를 원하는 형식으로 변환
ex) string to integer
url은 string임 처음에
핸들러 레벨에서 @UsePipes 데코레이터를 이용해서 사용
###Global Pipes
애플리케이션 레벨에서 사용
ex) useGlobalPipes
-- ValidationPipe
-- ParseIntPipe
-- ParseBoolPipe
-- ParseArrayPipe
-- ParseUUIDPipe
-- DefaultValuePipe
class-validator 패키지
https://github.com/nestjs/class-validator
데이터 유효성 체크를 위한 패키지
$ npm install class-validator class-transformer --save
DTO 코드 - CreateBoardDto
import { IsNotEmpty } from 'class-validator';
export class CreateBoardDto {
@IsNotEmpty()
title: string;
description: string;
}
Controller
@Post()
@UsePipes(ValidationPipe) // 추가 부분
createBoard(@Body() createBoardDto: CreateBoardDto): Board {
return this.boardsService.createBoard(createBoardDto);
}
@UsePipes(ValidationPipe) 를 통해 validation을 체크
title과 description이 빈 값이면 400 error
service 부분 처리
//개별 게시글 조회
getBoardById(id: string): Board {
const found = this.boards.find((board) => board.id === id);
if (!found) {
throw new NotFoundException(`게시글을 찾을 수 없어요 id: ${id} `);
}
return found;
}

없는 게시글일 경우 404 메시지 출력~!
Service 코드 수정
deleteBoard(id: string): void {
const found = this.getBoardById(id);
this.boards = this.boards.filter((board) => board.id !== found.id);
}
this.boards.filter를 실행하기 전에
getBoardById(id) 에서 예외처리가 되어있다~!
없는 id를 삭제 시도하면
404 페이지 발생~!
src/boards/pipes/board-status-validation.pipe.ts
board-status-validation.pipe.ts
import { ArgumentMetadata, PipeTransform } from '@nestjs/common';
export class BoardStatusValidationPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
console.log('value', value);
console.log('metadata', metadata);
return value;
}
}
Controller 코드
@Patch('/:id/status')
updateBoardStatus(
@Param('id') id: string,
@Body('status', BoardStatusValidationPipe) status: BoardStatus,
) {
return this.boardsService.updateBoardStatus(id, status);
}
게시물 상태 업데이트 하는 펑션에 @Body('status', BoardStatusValidationPipe) 를 추가한다.
(BoardStatusValidationPipe는 위에서 정의한 pipe 클래스다.)
결과


board-status-validation.pipe.ts
import { ArgumentMetadata, BadRequestException, PipeTransform } from '@nestjs/common';
import { BoardStatus } from '../Models/board.model';
export class BoardStatusValidationPipe implements PipeTransform {
readonly StatusOptions = [BoardStatus.PRIVATE, BoardStatus.PUBLIC];
private isStatusValid(status: any) {
const index = this.StatusOptions.indexOf(status);
return index !== -1;
}
transform(value: any) {
value = value.toUpperCase();
if (!this.isStatusValid(value)) {
throw new BadRequestException(`${value} isn't in the status options`);
}
return value;
}
}
결과값
