NestJS - Pipe

Server_side·2024년 2월 15일
1
post-custom-banner

Pipe

파이프란 무엇일까?
공식문서를 통해 확인해 보면 PipeTransform 인터페이스를 구현하는 @Injectable() 데코레이터가 달린 클래스를 말한다.

파이프는 일반적으로 아래 두 가지 역할로 사용된다.

  • transformation
    입력 데이터를 원하는 형식으로 변환 (예: 문자열 -> 정수)
  • validation
    입력 데이터를 평가하고 유효하다면 로직 처리를 위해 전달
    데이터가 유효하지 않다면 예외 처리
    (예: 비밀번호의 길이가 4자 이상이어야하지만 4자 미만인 경우 예외 처리

위 두 가지 경우, 컨트롤러 라우터 핸들러의 인수에 적용됨
즉, 핸들러에 의해 로직이 실행되기 전 파이프를 적용하여 해당 인수에 대한 transformation/validation을 실시한 후 로직 실행


Pipe 적용법

pipe를 적용하는 레벨은 총 세 가지로 구분할 수 있다.

  • Handler-level
    말그대로 핸들러 레벨은 말그대로 해당 핸들러의 모든 파라미터에 적용하는 것
  • Parameter-level
    하나의 특정 파라미터에만 적용하는 것
  • Global-level
    어플리케이션 전체 즉, 클아이언트로 부터 들어오는 모든 요청에 대해 적용하는 것

예시:
아래는 핸들러 레벨로 pipe를 적용한 코드다.
하나의 핸들러에 @UsePipes(ValidationPipe) 데코레이터를 사용하여 파이프를 적용한다.
이렇게 적용된 파이프는 해당 핸들러로 들어오는 인수 createBoardDto에 대해 validation을 수행하게 된다.

validation 즉 유효성 검사는 아래의 CreateBoardDto 클래스에 정의된 @IsNotEmpty() 데코레이터를 만족하는지 검사하는 것이다.
이외에도 @IsString(), @MinLength() 등의 데코레이터가 존재한다.


Built-in Pipes

NestJs에는 미리 만들어져 있는 빌트인 파이프가 있고 직접 커스텀하여 만드는 커스텀 파이프가 존재한다.
아래는 빌트인 파이프의 종류를 나열한 것이다.
예를 들어 ParseIntPipe의 경우는 전달받은 인수를 10진수로 변환해주는 역할을 한다.

NestJs Built-in Pipes

  • ValidationPipe
  • ParseIntPipe
  • ParseFloatPipe
  • ParseBoolPipe
  • ParseArrayPipe
  • ParseEnumPipe
  • DefaultValuePipe
  • ParseFilePipe

Custum Pipe

커스텀 파이프는 개발자의 입맛에 맞게 만들어 사용하는 파이프를 말한다.
예시를 통해 학습해보자
아래는 게시글에 대한 상태를 변경하는 컨트롤러다.
클라이언트로부터 들어오는 status에 대해 BoardStatusValidationPipe를 파라미터 레벨로 적용한 모습이다.

BoardStatusValidationPipe 클래스를 살펴보면 인수로 들어온 value가 BoardStatus의 속성(PUBLIC, PRIVATE)인지 유효성 검사를 하며, BoardStatus의 속성이 아니라면 BadRequestException으로 예외처리 해주는 로직을 가지고 있다.


요약

pipe란 컨트롤러의 메서드가 실행되기 전 인수에 대해 알맞은 validation/transformation 를 실시한 후 통과한다면 메서드를 실행하지만 예외가 발생할 경우 메서드는 실행되지 않는다.
즉, 메서드가 실행되기 전 올바른 작동을 위해 한번 걸러준다고 생각하면 될 듯 하다.


참고

NestJS 공식문서
John ahn님 인프런 강의

profile
아마도 난 백엔드 style?
post-custom-banner

0개의 댓글