NestJS로 효율적인 백엔드 개발하기 (08) - 파이프

2025. 12. 13. 19:50·NestJS/개념과 구조 정리

파이프(Pipe)는 무엇일까??

  • 변환 : 입력 데이터를 원하는 형태로 변환한다.(예: 문자열을 정수로)
  • 유효성 검사 : 입력 데이터를 평가하고, 유효한 경우 변경 없이 그대로 전달하고, 그렇지 않으면 예외를 발생시킨다.
  • 기본적으로 사용할 수 있는 여러 가지 내장 파이프를 제공
  • 커스텀 파이프 생성 가능

여러가지 제공되는 함수가 많다. 공식문서를 확인하는것이 좋다.
https://docs.nestjs.com/pipes

변환

파이프를 테스트 하기 위해서 아래의 명령어를 입력해서 컨트롤러 하나를 만들어둔다.

nest g controller pipe-test

ParseIntPipe에 대해서 한번 테스트를 해볼건데, 일단 아래와 같이 코드를 한번 적어본다.

import { Controller, Get, Query } from '@nestjs/common';

@Controller('pipe-test')
export class PipeTestController {
  @Get('parseInt')
  parseInt(@Query('id') id: number) {
    return { id, type: typeof id };
  }
}

지금 반환하는 id의 타입이 number로 지정해주었지만 string으로 나온다. 이제 여기서 코드를 수정하여 ParseIntPipe를 사용해보자.

  parseInt(@Query('id', ParseIntPipe) id: string) // <- ParseIntPipe 추가

리턴되는 id의 타입이 number로 바뀌었다. 추가적으로 인스턴스가 아닌 클래스를 생성하여 생성자로 에러 주입도 가능하다. 이전에 셋팅했던 Exception Filters를 통해서 출력이 되는것을 확인할 수 있다.

@UseFilters(HttpExceptionFilter)
@Controller('pipe-test')
export class PipeTestController {
  @Get('parseInt')
  parseInt(
    @Query(
      'id',
      new ParseIntPipe({ errorHttpStatusCode: HttpStatus.BAD_REQUEST }),
    )
    id: string,
  ) {
    return { id, type: typeof id };
  }
}

*새로운 생성자로 주입을 안해도 ExceptionFilters를 UseFilter처리 해두면 자동으로 되긴한다.


class-validation, class-trasnformer

NestJS에도 유효성검사를 하는 라이브러리가 존재한다. 기본적인 유효성 검사를 하는데 있어서 코드가 길어지지 않고 간단하게 사용 가능하기 때문에 생각보다 편하게 사용할 수 있다.

https://docs.nestjs.com/techniques/validation

사용하기 위해서 하단에 명령어를 사용하여 npm install을 해주자

npm i class-validator class-transformer

원래는 DTO를 나눠야 하지만 한 페이지 안에서 한번 처리를 해본다. 이전에 사용하던 코드에서 계속 진행을 해보자.

//pipe-test.controller.ts 그대로 계속 이어서 함
import {
  Body,
  Controller,
  Get,
  ParseIntPipe,
  Post,
  Query,
  UseFilters,
} from '@nestjs/common';
import { IsNumber, IsString } from 'class-validator';
import { HttpExceptionFilter } from 'src/filter/http-exception-filter';

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

  @IsNumber()
  age: number;
}

//@UseFilters(HttpExceptionFilter)
@Controller('pipe-test')
export class PipeTestController {
  @Get('parseInt')
  parseInt(@Query('id', ParseIntPipe) id: number) {
    return { id, type: typeof id };
  }

  @Post('dtoTest')
  dtoTest(@Body() pipeDto: PipeDto) {
    return pipeDto;
  }
}

기존에 컨트롤러 코드를 저렇게 수정한 후 루트에 있는 main.ts를 열어서 하단의 코드와 같이 수정해보자.

//루트에 있는 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);
  app.useGlobalPipes(new ValidationPipe()); // <- 이 부분이 추가 됨
  await app.listen(process.env.PORT ?? 3000);
}
bootstrap();
정확한 데이터를 전송하는 경우

정확하지 않은 경우


배포하는 경우 중요한 상황

프론트엔드와 협업하는 단계에서는 어떤 유효성 검사가 실패했는지 명확하게 전달하는 것이 중요하다. 그래야 빠르게 원인을 파악하고 수정할 수 있기 때문이다. 하지만 모든 개발이 끝나고 실제 서비스로 배포하는 시점에서는 이야기가 조금 달라진다. 운영 환경에서까지 내부 유효성 검사 규칙이나 상세한 오류 메시지를 그대로 노출하는 것이 과연 안전할까? 경우에 따라서는 굳이 알릴 필요 없는 정보일 수도 있고, 오히려 서비스 구조를 추측할 수 있는 단서가 될 수도 있다. 결국 환경에 따라 보여줘야 할 오류의 수준을 다르게 가져가는 것이 더 합리적인 선택이 된다.

//main.ts
app.useGlobalPipes(new ValidationPipe({ disableErrorMessages: true }));


참고

https://docs.nestjs.com/pipes

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

https://docs.nestjs.com/techniques/validation

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

 

'NestJS > 개념과 구조 정리' 카테고리의 다른 글

NestJS로 효율적인 백엔드 개발하기 (10) - 인터셉터  (0) 2025.12.15
NestJS로 효율적인 백엔드 개발하기 (09) - 가드  (0) 2025.12.14
NestJS로 효율적인 백엔드 개발하기 (07) - 예외 필터  (0) 2025.12.12
NestJS로 효율적인 백엔드 개발하기 (06) - 미들웨어(클래스형, 함수형)  (0) 2025.12.12
NestJS로 효율적인 백엔드 개발하기 (05) - 모듈에 대해 알아보자  (0) 2025.12.12
'NestJS/개념과 구조 정리' 카테고리의 다른 글
  • NestJS로 효율적인 백엔드 개발하기 (10) - 인터셉터
  • NestJS로 효율적인 백엔드 개발하기 (09) - 가드
  • NestJS로 효율적인 백엔드 개발하기 (07) - 예외 필터
  • NestJS로 효율적인 백엔드 개발하기 (06) - 미들웨어(클래스형, 함수형)
나는지토
나는지토
  • 나는지토
    안녕은헬로입니다.
    나는지토
  • 전체
    오늘
    어제
    • 분류 전체보기 (27)
      • Backend Design (1)
      • NestJS (19)
        • 개발 (9)
        • 개념과 구조 정리 (10)
      • SpringBoot (0)
      • Java (4)
        • 코테 (0)
      • PostgreSQL (2)
      • Docker (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    인증 가드
    ArrayList
    nestjs/jwt
    컨트롤러
    JWT
    자료구조
    서비스
    토큰 검사
    채팅
    Collections
    역할 검사
    db 연결 오류
    PostgreSQL
    조회 방식
    Java
    Redis
    커서기반 조회
    코딩테스트
    nestjs
    BullMQ
  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
나는지토
NestJS로 효율적인 백엔드 개발하기 (08) - 파이프
상단으로

티스토리툴바