Nodejs

 

 

 

NestJS 파이프(Pipe)란?

파이프는 NestJS에서 입력 데이터를 가공하거나 검증하는 역할을 하는 클래스이다. 컨트롤러가 핸들러를 실행하기 전에 파이프가 먼저 데이터를 처리하며, 변환(transform)과 검증(validate)이라는 두 가지 주요 기능을 제공한다.

주요 기능

1. 변환 (Transformation)

요청에서 받은 데이터를 원하는 형식으로 변환한다. 예: 문자열 → 숫자.

예시 코드:

@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) {
  return `Item #${id}`;
}

위와 같이 사용하면 URL 파라미터가 string이라도 ParseIntPipe를 통해 number로 변환되어 처리된다.

2. 검증 (Validation)

데이터가 유효한지 확인하고, 유효하지 않으면 예외를 던진다.

예시: class-validator를 활용한 DTO 검증

export class CreateUserDto {
  @IsString()
  name: string;

  @IsInt()
  age: number;
}
@Post()
create(@Body() createUserDto: CreateUserDto) {
  return createUserDto;
}

파이프 적용 위치

  • 핸들러 레벨: 특정 메서드의 파라미터에만 적용

  • 컨트롤러 레벨: 컨트롤러 전체에 적용

  • 전역 레벨: 애플리케이션 전체에 적용 (main.ts)

전역 설정 예시:

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}

 

ValidationPipe 기본값

new ValidationPipe({
  whitelist: false, // DTO에 정의되지 않은 속성을 자동 제거하지 않음
  forbidNonWhitelisted: false, // 정의되지 않은 속성이 있어도 에러 발생 X
  transform: false, // DTO 타입 자동 변환 X
  disableErrorMessages: false, // 상세 에러 메시지를 활성화 (true이면 메시지 숨김)
  validationError: {
    target: true, // 유효성 검사 실패 시 입력 객체 포함
    value: true, // 유효성 검사 실패 시 입력된 값 포함
  },
  stopAtFirstError: false, // 여러 개의 오류가 있어도 모든 오류 반환
});

 

===>ValidationPipe  프로젝트 설정

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { CustomExceptionFilter } from '../common/custom-exception.filter';
import { ValidationPipe } from '@nestjs/common';

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

  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true, // ❌ DTO에 정의되지 않은 속성은 자동 제거
      forbidNonWhitelisted: true, // ???? 정의되지 않은 속성이 있으면 400 에러 발생
      transform: true, // ???? DTO의 타입을 자동 변환 (예: "1" -> 1)
    }),
  );

  await app.listen(process.env.PORT ?? 3000);
}
bootstrap().catch((err) => {
  console.error('Bootstrap error:', err);
  process.exit(1);
});

 

 

 커스텀 파이프 만들기

사용자 정의 로직으로 파이프를 만들 수 있다. 예를 들어, 문자열을 무조건 대문자로 바꾸는 파이프:

@Injectable()
export class UppercasePipe implements PipeTransform {
  transform(value: any) {
    if (typeof value !== 'string') {
      throw new BadRequestException('Validation failed: not a string');
    }
    return value.toUpperCase();
  }
}

사용 예:

@Get()
greet(@Query('name', UppercasePipe) name: string) {
  return `Hello, ${name}`;
}

✅ 요약

  • 파이프는 데이터 변환 및 유효성 검사를 수행하는 강력한 도구

  • 내장 파이프와 커스텀 파이프 모두 유연하게 사용 가능

  • 전역/컨트롤러/핸들러 레벨에 따라 다양하게 설정 가능

  • ValidationPipe + DTO 조합은 가장 일반적인 검증 방식

 

 

// NestJS Pipe(파이프)란?
// NestJS에서 파이프는 요청 데이터를 변환하거나 검증하는 데 사용됩니다.
// 기본 제공 파이프와 커스텀 파이프를 활용하여 요청을 처리할 수 있습니다.

import { Controller, Get, Query, ParseIntPipe, UsePipes, ValidationPipe } from '@nestjs/common';
import { IsInt, IsOptional, IsString } from 'class-validator';

// DTO (Data Transfer Object) 정의
// ValidationPipe를 활용한 데이터 유효성 검사
class SampleDto {
  @IsString()
  name: string;

  @IsOptional()
  @IsInt()
  age?: number;
}

@Controller('sample')
export class SampleController {
  // 1. 기본 제공되는 ParseIntPipe 사용
  //    - ?id=123 을 정수로 변환하여 처리
  @Get('id')
  getById(@Query('id', ParseIntPipe) id: number) {
    return `ID: ${id}`;
  }

  // 2. ValidationPipe를 사용한 DTO 검증
  //    - ?name=John&age=30 요청 시 DTO에 맞게 변환 및 유효성 검사
  @Get('validate')
  @UsePipes(new ValidationPipe({ transform: true }))
  validateDto(@Query() query: SampleDto) {
    return `Validated Name: ${query.name}, Age: ${query.age}`;
  }
}

// 3. 커스텀 파이프 예제
//    - 특정 데이터를 변환하거나 검증하는 역할 수행
import { ArgumentMetadata, BadRequestException, Injectable, PipeTransform } from '@nestjs/common';

@Injectable()
export class CustomPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    if (typeof value !== 'string' || value.trim() === '') {
      throw new BadRequestException('값이 유효하지 않습니다.');
    }
    return value.trim().toUpperCase(); // 데이터를 대문자로 변환하여 반환
  }
}

// 4. 커스텀 파이프 사용 예제
@Controller('custom')
export class CustomController {
  //    - ?text=hello 요청 시 "HELLO" 로 변환하여 반환
  @Get('uppercase')
  useCustomPipe(@Query('text', new CustomPipe()) text: string) {
    return `Processed Text: ${text}`;
  }
}

/*  정리
1️⃣ **기본 제공 파이프**
   - ParseIntPipe: 문자열을 숫자로 변환
   - ValidationPipe: DTO 기반의 유효성 검사 수행

2️⃣ **커스텀 파이프**
   - CustomPipe: 요청 데이터를 대문자로 변환

✅ 파이프를 활용하면 NestJS에서 요청 데이터를 안전하게 처리하고 변환할 수 있습니다! */

 

 

 

 

 

about author

PHRASE

Level 60  라이트

아침 늦게 일어나고 낮에는 술을 마시며, 저녁에 쓸데없는 이야기를 하고 있으면 인간은 일생을 간단히 헛되게 만들 수 있다. -탈무드

댓글 ( 0)

댓글 남기기

작성

Nodejs 목록    more