💻 개발/프레임워크

(공식문서) NestJS Pipes와 queryString, Body가 데이터 처리하는 방법

foodev 2025. 2. 18. 13:51
728x90
파이프는 @Injectable() 데코레이터로 주석이 달린 클래스로, PipeTransform 인터페이스를 구현합니다.

 

 

 

관련된 링크 : https://docs.nestjs.com/pipes

 

 

🌠 목차
✅ 파이프의 일반적 사례
✅ 파이프 바인딩과 적용
✅ queryString과 body의 데이터 처리 차이점

 

파이프의 일반적 사례


 

transfromation: 입력 데이터를 원하는 형식(예: 문자열에서 정수로)으로 변환합니다.

validation: 입력 데이터를 평가하여 유효하면 변경 없이 통과하고, 그렇지 않으며 예외를 던집니다. 

 

두 경우 모두 컨트롤러 경로 핸들러에서 처리 중인 인수에 대해 작동합니다

 

파이프 작동 방식

  1. 요청: 클라이언트가 서버로 요청을 보냅니다.
  2. 파이프 실행: NestJS는 요청 데이터를 파이프에 전달합니다.
  3. 변환 & 검사: 파이프는 데이터를 변환하고 유효성을 검사합니다.
  4. 결과 반환: 파이프는 변환되고 검증된 데이터를 컨트롤러에 전달합니다.
  5. 컨트롤러 실행: 컨트롤러는 파이프가 제공한 데이터를 사용하여 로직을 처리합니다.

 

파이프는 예외영역에서 실행됩니다.

파이프에서 예외가 발생하면 exception filters에서 처리됩니다

 

파이프 바인딩과 적용


queryString 에서 Pipe

@Get(':id') async findOne(@Param('id', ParseIntPipe) id: number) 
{ 
    return this.catsService.findOne(id); 
}

 

다음과 같은 ParseIntPipe를 사용했다고 가정합니다

그러면 id값은 number이거나 예외를 발생합니다.

 

GET localhost:3000/개발개맛집이 들어왔다면

typeof(id)의 결과는 string이 됩니다.

이에 따라 예외 필터에 걸려서 아래의 문구를 보게 됩니다.

{
  "statusCode": 400,
  "message": "Validation failed (numeric string is expected)",
  "error": "Bad Request"
}

 

 

이렇게 pipe가 예외를 던지는 이유는 findOne() 함수가 실행되지 않도록 함에 있습니다.

 

body에서 Pipe 적용은?

위에 내용은 쿼리스트링에서 pipe를 적용했습니다.

그렇다면 POST 메소드의 body 값에는 어떻게 적용할 수 있을까요? 

 

아쉽게도 NestJS의 pipe를 이용하여 body 값을 체크할 수 없습니다.

보통 class-decorator를 import 하여 사용하거나 nestia의 typechecking 함수를 이용합니다.

uuId 체크 예시: 

import { IsUUID } from 'class-validator';
export interface CreateEventBody {
  @IsUUID()
  uuid?: string;
  prevUrl?: string;
}

 

queryString과 body의 데이터 처리 차이점


 

 

데이터가 도착하는 시점

  • 쿼리 스트링: 쿼리 스트링은 URL의 일부로, 요청이 서버에 도착하는 즉시 파싱되어 파이프에 전달됩니다.
  • 본문(Body): 본문 데이터는 요청의 내용 부분으로, 서버에 도착한 후 별도의 처리를 거쳐야 파이프에 전달될 수 있습니다.

데이터 처리 방식

  • 쿼리 스트링: 쿼리 스트링은 주로 문자열 형태로 전달됩니다. 파이프는 이 문자열을 원하는 타입(숫자, 날짜 등)으로 변환하거나 유효성을 검사합니다.
  • 본문(Body): 본문 데이터는 다양한 형식(JSON, XML 등)으로 전달될 수 있습니다. 파이프는 이 데이터를 파싱 하고, 필요한 경우 변환하거나 유효성을 검사합니다.

파이프 적용 시점

  • 쿼리 스트링: 쿼리 스트링은 요청과 함께 도착하므로, 파이프가 즉시 적용될 수 있습니다.
  • 본문(Body): 본문 데이터는 파싱 과정을 거쳐야 하므로, 파이프는 파싱 후에 적용될 수 있습니다.

 

글 잼나게 보셨으면 좋아요 눌러주고 가세요

관심받는 거 좋아합니다

 

728x90