파이프란 무엇일까?
공식문서를 통해 확인해 보면 PipeTransform 인터페이스를 구현하는 @Injectable() 데코레이터가 달린 클래스를 말한다.
파이프는 일반적으로 아래 두 가지 역할로 사용된다.
위 두 가지 경우, 컨트롤러 라우터 핸들러의 인수에 적용됨
즉, 핸들러에 의해 로직이 실행되기 전 파이프를 적용하여 해당 인수에 대한 transformation/validation을 실시한 후 로직 실행
pipe를 적용하는 레벨은 총 세 가지로 구분할 수 있다.
예시:
아래는 핸들러 레벨로 pipe를 적용한 코드다.
하나의 핸들러에 @UsePipes(ValidationPipe) 데코레이터를 사용하여 파이프를 적용한다.
이렇게 적용된 파이프는 해당 핸들러로 들어오는 인수 createBoardDto에 대해 validation을 수행하게 된다.
validation 즉 유효성 검사는 아래의 CreateBoardDto 클래스에 정의된 @IsNotEmpty() 데코레이터를 만족하는지 검사하는 것이다.
이외에도 @IsString(), @MinLength() 등의 데코레이터가 존재한다.
NestJs에는 미리 만들어져 있는 빌트인 파이프가 있고 직접 커스텀하여 만드는 커스텀 파이프가 존재한다.
아래는 빌트인 파이프의 종류를 나열한 것이다.
예를 들어 ParseIntPipe의 경우는 전달받은 인수를 10진수로 변환해주는 역할을 한다.
커스텀 파이프는 개발자의 입맛에 맞게 만들어 사용하는 파이프를 말한다.
예시를 통해 학습해보자
아래는 게시글에 대한 상태를 변경하는 컨트롤러다.
클라이언트로부터 들어오는 status에 대해 BoardStatusValidationPipe를 파라미터 레벨로 적용한 모습이다.
BoardStatusValidationPipe 클래스를 살펴보면 인수로 들어온 value가 BoardStatus의 속성(PUBLIC, PRIVATE)인지 유효성 검사를 하며, BoardStatus의 속성이 아니라면 BadRequestException으로 예외처리 해주는 로직을 가지고 있다.
pipe란 컨트롤러의 메서드가 실행되기 전 인수에 대해 알맞은 validation/transformation 를 실시한 후 통과한다면 메서드를 실행하지만 예외가 발생할 경우 메서드는 실행되지 않는다.
즉, 메서드가 실행되기 전 올바른 작동을 위해 한번 걸러준다고 생각하면 될 듯 하다.