Search

#024 #Pipe 더 이해하기

 마이크로 소프트 파이프 / 필터 패턴 공식 문서

 파이프 패턴이란?

복잡한 처리가 필요한 작업을 재사용이 가능한 독립적인 컴포넌트로 분리하는데, 이 컴포넌트를 파이프라고 한다. 이렇게 전체를 구성하는 한 거대한 로직을 작은 파이프로 역할을 분배하여 구성하게 되면, 이 파이프들은 다른 곳에서 재사용이 용이해지며 쉽게 확장할 수 있다.

 기존 방식의 문제점

→ 그림에는 두가지 경우의 데이터가 전달되는 과정을 보여준다. → 한 곳에서 요청데이터가 들어오면 여러 로직을 거쳐서 비즈니스 로직에 도달하게 되는데, 예를 들어 모든 요청마다 로그인 검증, 권한 검증 같은 로직이 필요하다고 가정해보자. 그렇다면 모든 요청에서 똑같은 역할을 하는 작업이 중복되어 처리해야 될것이고, 이걸 코드 상에서 구현할려면 수많은 중복 코드가 발생할 것이다.

 개선 방안

→ 이런 식으로 매 요청이 필요한 작업이 다를 수 있기 때문에, 작업이 필요한 경우에만 이미 만들어져 있는 파이프를 다시 사용하는 패턴이라고 생각하면 된다.

 코드 구현

우린 기존에 파라메터 ParseIntPipe 하나만 사용함으로서, 파이프패턴의 진정한 작동 방식에 대해서 감이 안 올 수 있다. 하지만 위의 설명에서 나온 그림처럼 파이프들은 체인처럼 작동할 수 있고, 다른 파이프들을 추가하여 추가 작업을 할 수 있다.

 폴더 생성

src 폴더 내부에 pipes 폴더를 만들고 positive.int.pipe.ts 를 만들어 보자.

 코드 구성 - positive.int.pipe.ts

import { Injectable, PipeTransform } from '@nestjs/common'; @Injectable() export class PositiveIntPipe implements PipeTransform { transform(value: number) { return value; } }
JavaScript
복사
파이프의 기본로직이다. → PipeTransform을 구현하고 → transform() 을 오버라이딩 한다. 이 PositiveIntPipe 의 역할은 어떤 값이 들어와도 정수로 반환하는 역할이다.

 사용 - catController

→ 위의 사진과 같이 파라매터에 여러가지 파이프를 등록 할 수 있다. → ParseIntPipe의 결과값이 PositiveIntPipe 흘러들어가게 되는 모습이 파이프 같다고 하여 파이프 패턴이라고 보면 된다.

 테스트

localhost:8000/cats/2 로 URL요청이 들어왔을 때 로그가 어떻게 찍히는지 확인해야지 작동순서를 알 수 있을 것이다.
 : PositiveIntPipe 에서 찍히는 로그이다. 즉 Pipe들을 순서대로 타도 나서 getOneCat 의 비즈니스 로직이 실행이 되는 것을 알 수 있다.

 예외처리

PositiveIntPipe 에 예외처리 로직을 추가할 수도 있을 것이다. 0보다 작은 수가 URI로 들어오는 경우의 예외처리를 해보자.
URI로 음수로 들어오면 PositiveIntPipe 에서 예외처리가 정상적으로 되었다.