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

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
반응형
저작자표시 비영리 변경금지 (새창열림)

'💻 개발 > 프레임워크' 카테고리의 다른 글

(공식문서) NestJS 인터셉터  (0) 2025.02.18
(공식문서) NestJS 가드  (0) 2025.02.18
(공식문서) NestJS Exception filters  (0) 2025.02.12
[Cursor 페이지네이션] nestJS + Prisma - cursor 페이지네이션 방식 (성능 최적화, 직접 cursor 구현)  (1) 2024.03.31
[Spring][JPA] JPA + S3 + DB 사용해서 파일 업로드 하기  (0) 2023.02.01
'💻 개발/프레임워크' 카테고리의 다른 글
  • (공식문서) NestJS 인터셉터
  • (공식문서) NestJS 가드
  • (공식문서) NestJS Exception filters
  • [Cursor 페이지네이션] nestJS + Prisma - cursor 페이지네이션 방식 (성능 최적화, 직접 cursor 구현)
foodev
foodev
이것저것 개발과 이것저것 리뷰 합니다.
    반응형
    250x250
  • foodev
    개발 개맛집
    foodev
  • 전체
    오늘
    어제
    • 분류 전체보기 (109)
      • 🌟🙇🏻‍♂️ 꼭 읽어봤으면 하는 글 (4)
      • 💻 개발 (72)
        • 설정 및 세팅 (4)
        • DB&서버&네트워크&암호 (11)
        • React (0)
        • JPA, Querydsl (13)
        • 알고리즘 (7)
        • 언어 (15)
        • 프레임워크 (12)
        • HTML, CSS (10)
      • ✍🏻 (33)
        • 회고록 (16)
        • 독서록 (7)
        • 일지록 (9)
        • 세미나 (1)
      • 💡 리뷰 (0)
        • 제품리뷰 (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    di란
    typedi란
    디비스냅샷
    nestjs pipe body
    di동작원리
    스냅샷방식
    해피해킹 방향키
    validation failed (numeric string is expected)
    di의존성
    nestjs pipe
    창업패키지후기
    해피해킹 꿀팁
    해피해킹 카라비너
    QueryDSL
    스냅샷과 히스토리
    JPA
    해피해킹 키매핑
    서이추
    db 날림
    githubaction 라벨 ci/cd
    스냅샷과로그성
    azure ci/cd
    githubaction 라벨 배포
    db 초기화
    db 날린 썰
    typedi 동작원리
    토이프로젝트개발일지
    스냅샷과히스토리성 차이
    개발썰
    해피해킹 커스텀
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
foodev
(공식문서) NestJS Pipes와 queryString, Body가 데이터 처리하는 방법
상단으로

티스토리툴바