NestJS / / 2024. 11. 15. 16:26

NestJS Pipe

NestJS에서 Pipe는 요청 데이터의 유효성 검사(validation)와 변환(transformation)을 위해 사용되는 강력한 도구입니다. Pipe는 요청이 처리되기 전에 데이터의 형식을 변경하거나 유효성을 검증하는 데 주로 사용됩니다. 예를 들어, 클라이언트에서 받은 데이터를 특정 형식으로 변환하거나 특정 조건에 맞는지 확인하는 데 활용할 수 있습니다.

Pipe의 역할

  1. 데이터 변환 (Transformation)

    Pipe는 클라이언트가 보내온 데이터를 컨트롤러에서 사용할 수 있도록 변환합니다. 예를 들어, 문자열로 받아온 데이터를 숫자로 변환하는 등의 작업을 할 수 있습니다.

  2. 데이터 유효성 검사 (Validation)

    데이터가 올바른 형식인지, 특정 조건을 만족하는지 검증합니다. 예를 들어, 이메일 형식인지, 숫자가 음수가 아닌지 등을 검사할 수 있습니다. 유효성 검사를 통과하지 못하면 요청을 거부하고 클라이언트에 오류 메시지를 반환할 수 있습니다.

Pipe 적용 위치

Pipe는 NestJS에서 메서드파라미터 단위로 적용할 수 있으며, 전역으로 설정하여 모든 요청에 적용할 수도 있습니다. 다음과 같은 위치에 적용할 수 있습니다.

  • 메서드 단위: 컨트롤러의 특정 메서드에만 Pipe를 적용합니다.
  • 파라미터 단위: 메서드의 특정 파라미터에만 Pipe를 적용합니다.
  • 전역 단위: 모든 요청에 Pipe를 적용합니다.

내장된 Pipe

NestJS는 몇 가지 기본 Pipe를 제공합니다.

  1. ValidationPipe

    데이터 유효성 검사를 수행합니다. DTO 클래스와 함께 사용하여 요청 데이터가 DTO에서 정의한 조건을 충족하는지 검사합니다.

    예를 들어, @IsString(), @IsInt() 같은 데코레이터를 활용하여 특정 형식의 데이터를 검사합니다.

  2. ParseIntPipe

    문자열로 들어온 파라미터를 정수로 변환합니다. 변환에 실패하면 BadRequestException을 발생시킵니다.

  3. ParseBoolPipe

    문자열을 불리언 값으로 변환합니다. true, false, 1, 0 등으로 변환 가능합니다.

  4. ParseUUIDPipe

    파라미터가 UUID 형식인지 검사하고, 올바른 형식이 아니면 예외를 발생시킵니다.

  5. DefaultValuePipe

    파라미터가 없을 때 기본값을 설정합니다.

  6. ParseArrayPipe

    요청 데이터를 배열로 변환하고 각 요소에 대해 유효성 검사를 수행할 수 있습니다.

Custom Pipe 만들기

NestJS에서는 기본 Pipe 외에도 커스텀 Pipe를 만들어 사용할 수 있습니다. 커스텀 Pipe는 PipeTransform 인터페이스를 구현하여 만듭니다.

예제: 요청 데이터를 대문자로 변환하는 커스텀 Pipe

import { Injectable, PipeTransform } from '@nestjs/common';

@Injectable()
export class UppercasePipe implements PipeTransform {
  transform(value: string) {
    return value.toUpperCase();
  }
}

이제 UppercasePipe를 컨트롤러의 메서드 파라미터에 적용하면, 해당 데이터가 자동으로 대문자로 변환됩니다.

Pipe 사용 예시

아래는 NestJS의 ValidationPipeParseIntPipe를 활용하여 데이터 유효성 검사를 수행하는 예시입니다.

import { Controller, Get, Param, ParseIntPipe, UsePipes, ValidationPipe } from '@nestjs/common';

@Controller('users')
export class UsersController {

  @Get(':id')
  getUserById(@Param('id', ParseIntPipe) id: number) {
// id는 자동으로 정수로 변환되어 처리됩니다.return { userId: id };
  }

  @Post()
  @UsePipes(ValidationPipe)
  createUser(@Body() createUserDto: CreateUserDto) {
// createUserDto의 유효성 검사가 자동으로 이루어집니다.
  }
}

위 코드에서 ParseIntPipeid를 정수로 변환하며, ValidationPipeCreateUserDto에 정의된 유효성 규칙을 검사합니다.

전역 Pipe 설정

전역으로 Pipe를 설정하면 모든 요청에 대해 동일한 Pipe가 적용됩니다. 전역 Pipe는 main.ts에서 설정할 수 있습니다.

import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

// 전역 ValidationPipe 적용
  app.useGlobalPipes(new ValidationPipe({
    whitelist: true,
    forbidNonWhitelisted: true,
    transform: true,
  }));

  await app.listen(3000);
}
bootstrap();

위 예시에서 전역으로 설정된 ValidationPipe는 요청 데이터를 DTO에 정의된 필드만 남기고 나머지를 제거(whitelist)하거나, 허용되지 않은 필드가 있으면 오류를 발생(forbidNonWhitelisted)하게 설정되었습니다.

요약

  • Pipe는 데이터의 변환과 유효성 검사를 위해 사용됩니다.
  • NestJS의 기본 Pipe: ValidationPipe, ParseIntPipe 등 다양한 기본 Pipe가 제공됩니다.
  • Custom Pipe: PipeTransform 인터페이스를 구현하여 커스텀 Pipe를 만들 수 있습니다.
  • 전역 Pipe: 모든 요청에 Pipe를 일관되게 적용하기 위해 전역 설정이 가능합니다.

'NestJS' 카테고리의 다른 글

NestJS Guard  (0) 2024.11.16
NestJS 핫리로드 트러블슈팅  (1) 2024.11.16
회원가입로직  (2) 2024.11.14
NestJS DI(Dependency Injection)  (0) 2024.11.06
NestJS 초기 파일들의 의미  (3) 2024.11.04
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유