NestJS-Pipe

효딩딩·2023년 7월 18일
0

Pipes

마이크로소프트-공식문서
nestJS-pipes

정의

  • 클라이언트 요청에서 들어오는 데이터를 유효성 검사, 형변환을 수행해서 서버가 원하는 데이터를 얻을 수 있도록 도와주는 클래스이다.

사용목적

  • 데이터 유효성 검사, 형변환, 예외 처리 등을 수행하며, 잘못된 요청을 걸러내거나, 파라미터를 올바른 형태로 변환하여 컨트롤러에 전달하는 데 사용된다.

실행순서

  • 가드와 인터셉터 사이에 실행되며, 컨트롤러에 데이터를 전달하기 전에 실행된다.

구현방식

  • 클래스 기반으로 구현되며, @Injectable() 데코레이터와 함께 사용되어야 하고 PipeTransform 인터페이스를 구현해야한다. 결론적으로 데이터 변환 및 유효성 검사를 수행하여 컨트롤러에 데이터를 전달하는 역할을 한다.

catsController.ts

> GET localhost:3000/123

@Get(':id')
  getOneCat(@Param() param) {
    console.log(param)  //  { id: '123' } 결과값이 나오게 된다. 
    return 'get one cat apl'
  }


@Get(':id')
  getOneCat(@Param('id') param) { // 명확하게 키 값을 알려주면
    console.log(param)   // 123 벨류값이 나오게 된다.
  // pipes를 이용하여 id가 들어왔을 때 number로 타입변환을 해줄 수 있다. 
    console.log(typeof param) // 원래는 타입이 string이다.
    return 'get one cat apl'
  }

  
@Get(':id')
  getOneCat(@Param('id', ParseIntPipe) param: number) {
    console.log(param)   // 123
    console.log(typeof param) // number 변환됨. id가 number type으로 사용하는 경우가 많다.
    return 'get one cat apl'
  }

- 만약 GET localhost:3000/abc  Int 로 전달 되지 않는 경우 Validation error를 낼 수 있다.
- 요청이 들어왔을 때 ParseIntPipe로 number로 타입변환을 해주고 유효성검사도 해주면 일석이조가 된다. 
  
- GET localhost:3000/abc  postman 요청할 경우 Validation 에러가 나옴.
{
    "success": false,
    "timestamp": "2023-07-09T12:02:00.278Z",
    "message": "Validation failed (numeric string is expected)",
    "error": "Bad Request",
    "statusCode": 400
}

파이프 패턴

  • 파이프는 단방향 통신을 위한 용도로 사용된다.
  • 하나의 파이프는 이전 파이프에서 전달된 결과를 입력 값으로 받아 또 다른 결과 값을 주고 NestJS에서의 파이프는 클라이언트 요청에서 들어오는 데이터를 유효성 검사 및 변환을 수행하여 서버가 원하는 데이터를 얻을 수 있도록 도와주는 역할을 한다.
  • 각 필요한 처리를 각각 단일 작업을 수행하는 별도의 구성 요소 및 필터로 파이프를 세분화한다.
  • request에 원하는 데이터를 주기위해 파이프라인에서 필터를 결합할 수 있다.
  • 이렇게 하면 중복코드 방지, 처리 요구 사항이 변경되는 경우 구성 요소를 쉽게 제거, 교체,추가를 쉽게 할 수 있다.

과정

사용자의 요청에 의한 특정한 데이터가 들어오면 하나의 변환, 유효성 검사를 수행하게 되는데
(1) 하나의 input이 들어오면 특정 로직을 수행해서 output을 밷는다.
(2) 그 output은 다음 함수로 들어가서 output을 밷는다.각각의 함수들은 자신만의 기능을 수행해서 다음 함수에 넘겨주기만 하는것이다.
(3) 하나의 변환이 된 새로운 데이터를 파이프에 넣는다
(4) 다시 변환 또는 유효성 검사를 한다.
(여기서 실패할경우 exception으로 빠지게 됨 성공 시 원하는 결과가 하나로 나옴)
(5) 원하는 결과가 하나로 나와 비지니스 로직에 들어가 실행하게된다.

PositiveIntPipe.ts

// transform 이라는 함수가 있음. 이 함수의 결과값이 파이프의 결과값이 되는것임.

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

@Injectable()
export class PositiveIntPipe implements PipeTransform {
  transform(value: number) {
   // 만약 벨류가 음수라면 에러를 밷게 로직 짜기
    if (value < 0) {
      throw new HttpException('value > 0', 400);
    }

    return value;
  }
}

catsController.ts

  • Param정의를 보면 (property: string, ...pipes(PipeTransform<any, any> 되있는데 ...pipes 되있다. 아래같이 파이프로 쭉 이을 수 있다.
  • ParseIntPipe로 string을 number로 변경해준다.
  • PositiveIntPipe로 음수일경우 exception에러반환을 해주고 양수일 경우 반환을 해준다.
    이렇게 pipe를 타고 흘러가서 결과값인 param 을 받게 된다.
@Get(':id')
  getOneCat(@Param('id', ParseIntPipe, PositiveIntPipe) param: number) {
    return 'get one cat apl'
  }
profile
어제보다 나은 나의 코딩지식

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

덕분에 좋은 정보 얻어갑니다, 감사합니다.

답글 달기