PIPE 란?
파이프는 @Injectable () 데코레이터로 주석이 달린 클래스입니다. 파이프는 주로 요청 데이터의 변환 및 유효성 검사, 응답 데이터의 가공 등을 처리하기 위해 사용됩니다.
1. 데이터 유효성 검사 : 파이프를 사용하여 들어오는 데이터의 유효성을 검사할 수 있습니다. 이를 통해 잘못된 데이터가 들어오는 것을 방지하고, 안전한 데이터 처리를 보장할 수 있습니다.
2. 데이터 변환 : 클라이언트로부터 들어오는 데이터를 원하는 형식으로 변환할 수 있습니다. 예를 들어 JSON 형식의 데이터를 객체로 변환하거나, 문자열을 숫자로 변환할 수 있습니다.
3. 데이터 가공 : 파이프를 사용하여 요청 데이터나 응답 데이터를 가공할 수 있습니다. 예를 들어 문자열을 대문자로 변경하거나, 특정 필드를 추가하거나 제거할 수 있습니다.
Built-in pipe 종류
- ValidationPipe
- ParseIntPipe
- ParseFloatPipe
- ParseBoolPipe
- ParseArrayPipe
- ParseUUIDPipe
- ParseEnumPipe
- DefaultValuePipe
- ParseFilePipe
PIPE 사용하는 방법
Handler-level Pipes
핸들러 레벨에서 @UsePipes() 데코레이터를 이용해서 사용 할 수 있습니다. 이 파이프는 모든 파라미터에 적용이 됩니다.
아래 "유효성 체크 해보기"에서 조금 구체적으로 사용하는 방법을 말씀드리겠습니다.
@UsePipes(ValidationPipe)
createBoard(@Body() createBoardDto: CreateBoardDto) : Promise<Board> {
return this.boardsService.createBoard(createBoardDto);
}
Parameter-level Pipes
파라미터 레벨의 파이프 이기에 특정한 파라미터에게만 적용이 되는 파이프 입니다. 아래와 같은 경우에는 id만 파라미터 파이프가 적용이 됩니다.
@Patch('/:id/status')
updateBoardStatus(
@Param('id', ParseIntPipe) id: number,
@Body('status') status : BoardStatus
) {
return this.boardsService.updateBoardStatus(id, status);
}
Global Pipes
글로벌 파이프로서 애플리케이션 레벨의 파이브 입니다. 클라이언트에서 들어오는 모든 요청에 적용이 됩니다. 가장 상단 영역인 main.ts에 넣어주시면 됩니다.
유효성 체크 해보기
먼저 class-validator , class-transformer 모듈을 사용하기 위해서 아래와 같이 모듈을 설치해줍니다.
1. create-board.dto.ts
- board에 title과 description은 빈값이 안오도록 @IsNotEmpty() 데코레이터를 사용해보겠습니다.
import { IsNotEmpty } from "class-validator";
export class CreateBoardDto{
@IsNotEmpty()
title:string;
@IsNotEmpty()
description:string;
}
2. 위와 같이 데코레이터를 추가해줬다면 아래 컨트롤러에 @UsePipes(ValidationPipe) 데코레이터를 넣어주면 적용이 됩니다.
boards.controller.ts
@UsePipes(ValidationPipe)
createBoard(@Body() createBoardDto: CreateBoardDto) : Promise<Board> {
return this.boardsService.createBoard(createBoardDto);
}
잘 적용된 걸 확인할 수 있습니다.
![](https://blog.kakaocdn.net/dn/bMlrZr/btssgJX4kAV/q4yofpTmdJvdecAYwjoWJ1/img.png)
Custom PIPE 만들기
board-status-validation.pipe.ts
- custom pipe를 만들기 위해서는 PipeTransform interface를 구현하여야 합니다.
- transform 함수 안에 구현하고자 하는 비지니스 로직을 구현하면 됩니다.
- status 상태 값이 PRIVATE, PUBLIC 으로만 수정될 수 있도록 구현하였습니다.
import { ArgumentMetadata, BadRequestException, PipeTransform } from "@nestjs/common";
import { BoardStatus } from "../board-status.enum";
export class BoardStatusValidationPipe implements PipeTransform {
readonly StatusOptions = [
BoardStatus.PRIVATE,
BoardStatus.PUBLIC
]
transform(value: any, metadata: ArgumentMetadata) {
if(!this.isStatusValid(value)) {
throw new BadRequestException(`${value} isn't in the status options`);
}
return value;
}
private isStatusValid(status : any) {
const index = this.StatusOptions.indexOf(status);
return index !== -1
}
}
boards.controller.ts
@Patch('/:id/status')
updateBoardStatus(
@Param('id', ParseIntPipe) id: number,
@Body('status', BoardStatusValidationPipe) status : BoardStatus
) {
return this.boardsService.updateBoardStatus(id, status);
}
참고
'NestJS' 카테고리의 다른 글
Jest에서 의존성 주입과 Mock 데이터를 설정하는 방법 (0) | 2025.02.04 |
---|---|
[Nest.js] TypeORM 이용한 CRUD (0) | 2023.08.22 |
[Nest.js] 기본 파일 구조 및 요청 흐름 (2) | 2023.08.20 |
[Nest.js] Quick Start! (0) | 2023.08.15 |