Pipes 란?
Pipes는 Nestjs에서 데이터 처리 파이프라인을 구성하는 요소로써 주로 데이터 변환과 검증 작업에 사용됩니다.
Pipes를 활용하여 코드의 재사용성과 유지 보수성을 높이면서 요청 데이터에 대한 안정성까지 보장할 수 있습니다.
Pipes는 Controller가 처리하는 요청 핸들러 메소드에 도달하기 전에 요청 데이터에 대한 변환과 검증을 수행합니다.
Pipes의 역할
데이터 변환 : 요청 데이터의 형태를 Controller에서 사용하기 적합한 형태로 변환합니다. 예를 들어 문자열로 전달된 숫자를 숫자 타입으로 변환할 수 있습니다.
데이터 검증 : 요청 데이터가 정의된 규칙에 맞는지 검사합니다. 유효하지 않은 데이터에 대해서는 예외를 발생시켜 안정성을 보장합니다.

내장 Pipes 살펴보기
Nestjs에는 9개의 내장 Pipes가 제공됩니다.
| NAME | Description |
| ValidationPipe | 요청 데이터를 검증합니다. 주로 DTO에 적의된 규칙에 따라 데이터의 유효성을 검사합니다. |
| ParseIntPipe | 요청 데이터를 정수로 파싱합니다. 파싱에 실패할 경우 예외가 발생합니다. |
| ParseFloatPipe | 요청 데이터를 부동 소숫점 숫자로 파싱합니다. 파싱에 실패할 경우 예외가 발생합니다. |
| ParseBoolPipe | 요청 데이터를 불리언 값으로 파싱합니다. 'true', 'false' 문자열만 유효하며 그 외의 값에선 예외가 발생합니다. |
| ParseArrayPipe | 요청 데이터를 배열로 파싱합니다. 배열이 아닌 경우 예외가 발생합니다. |
| ParseUUIDPipe | 요청 데이터가 유효한 UUID 인지 검사합니다. 유효하지 않은 UUID의 경우 예외가 발생합니다. |
| ParseEnumPipe | 요청 데이터가 특정 열거형(enum)에 정의된 값 중 하나인지 검사합니다. 유효하지 않을 경우 예외가 발생합니다. |
| DefaultValuePipe | 요청 데이터에 특정 필드가 없거나 비어있을 경우 기본값을 제공합니다. |
| ParseFilePipe | 파일 업로드 요청에 사용되며 파일을 받아 파싱하고 유효성을 검사합니다. -> 이 파이프는 자세한 설명이 없고 주로 다른 외부 라이브러리를 통해 구현한다고 합니다. |
- DTO : 데이터 전송 객체(Data Transfer Object)는 클라이언트에서 서버로 전달되는 데이터의 형식을 지정합니다.
- UUID : 범용 고유 식별자(Universally Unique IDentifier)는 RFC4122에 명시된 네트워크 상에서 고유성이 보장되는 ID를 위한 표준 규약입니다.
Pipes 사용방법
Pipes는 두가지의 사용 방법이 있습니다.
1. Method level pipe
특정 controller에만 파이프를 적용합니다.
import { Controller, Get, Param, ParseIntPipe, UsePipes } from '@nestjs/common';
import { AppService } from './app.service';
import { HttpExceptionFilter } from './filter/http-exception.filter';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get('/pipe-test/:id')
@UsePipes(new ParseIntPipe()) // 해당 controller의 모든 핸들러 메소드에 ParseIntPipe를 적용
PipeTest(
// ParseIntPipe를 적용하지 않으면 기본적으로 id는 string
// id: number을 선언해줘도 ParseIntPipe를 적용하지 않으면 string으로 인식
// 왜냐하면 express에서는 모든 파라미터가 string으로 인식되기 때문
@Param('id', ParseIntPipe) id: number
) {
return typeof id; // number
}
}
2. Global pipe
애플리케이션 전체에 적용합니다.
import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe()); // 애플리케이션 전체에 파이프를 적용
await app.listen(3000);
}
bootstrap();
프로젝트를 진행하면서 데이터를 변환하거나 검증해야하는 일은 절때 빠지지 않는 요소입니다.
기존 프로젝트를 진행하면서 데이터 변환이나 검증에 대한 부분을 서비스 로직에서 처리하는 경우가 많았는데
코드가 길어지고 지저분 해진다는 생각이 들어 함수로 만들어 리펙토링하는 경우가 많았습니다.
그렇기 때문에 리펙토링 과정에서 데이터 변환이나 검증 함수를 쓰는 다른 곳에서 에러가 발생하는 등
유지관리에 어려움을 느꼈는데 Pipes는 뭔가 가려운 곳을 긁어주는 느낌입니다.
'Nestjs' 카테고리의 다른 글
| [NestJs] Interceptors 알아보기 (0) | 2024.03.14 |
|---|---|
| [NestJs] Guards 알아보기 (0) | 2024.03.13 |
| [NestJs] Exception filters 알아보기 (0) | 2024.03.11 |
| [NestJs] 기본 구조 살펴보기 (0) | 2024.03.10 |
| [NestJs] NestJs 알아보기 (0) | 2024.03.10 |