[NestJS] Pipe / Interceptor

# nodeJS# nestJS
[NestJS] Pipe / Interceptor

NestJS Pipe와 Interceptor

요청이 컨트롤러에 닿기 전, 응답이 클라이언트로 나가기 전.
NestJS는 그 흐름 사이에 끼어들 수 있는 수단을 두 가지 제공한다.
바로 PipeInterceptor다.

image

Pipe

image

Pipe는 요청 데이터가 컨트롤러에 도달하기 전에 가공하는 역할을 한다. 하는 일은 두 가지다.

  • 변환 (Transform): 입력 데이터를 원하는 타입으로 바꾼다.
  • 검증 (Validation): 조건을 만족하지 않으면 예외를 던진다.

기본 사용법

ParseIntPipe는 URL로 들어온 문자열 "1"을 숫자 1로 바꿔준다. 변환에 실패하면 컨트롤러에 진입하기도 전에 400을 반환한다.

내장 Pipe 종류

Pipe역할
ParseIntPipe문자열 → 정수로 변환한다, 실패 시 400
ParseFloatPipe문자열 → 실수, 실패 시 400
ParseBoolPipe"true" / "false" → boolean
ParseUUIDPipeUUID 형식 검증, 실패 시 400
ValidationPipeDTO 기준으로 요청 바디 전체 검증

위 네 가지는 파라미터 하나를 다루지만, ValidationPipe는 DTO 객체 단위로 동작한다는 점이 다르다.

ValidationPipe + DTO

DTO의 조건을 하나라도 어기면 컨트롤러 진입 전에 400이 나간다. 컨트롤러 안에서 직접 타입을 확인할 필요가 없어진다.

전역 적용

매 라우트마다 붙이는 게 번거롭다면 main.ts에 한 번만 선언하면 된다.


Interceptor

image

Interceptor는 요청 전과 응답 후, 양쪽 모두에 개입할 수 있다.
Pipe가 들어오는 데이터만 처리한다면, Interceptor는 흐름 전체를 처리할 수 있다.

Interceptor의 핵심은 next.handle()이라는 매서드다.
이 메서드는 컨트롤러(또는 다음 핸들러)로 요청을 넘기는 역할을 한다.

즉,

  • next.handle() 호출 이전 → 요청이 컨트롤러에 도달하기 전
  • next.handle() 호출 이후 → 컨트롤러 실행 결과가 반환된 이후

이 구조 덕분에 Interceptor는 요청과 응답을 모두 제어할 수 있다.

주로 이런 경우에 쓴다.

  • 요청 전: 로깅, 캐시 확인
  • 응답 후: 응답 포맷 통일, 실행 시간 측정

전역 적용

main.ts에 선언하면 Pipe와 동일하게 전역으로 적용시킬 수 있다.


Pipe vs Interceptor

Pipe

컨트롤러 진입 전에만 실행된다. 데이터를 변환하거나, 조건에 맞지 않으면 예외를 던진다.
Pipe는 입력값을 다루는 게 목적이다.

Interceptor

요청 전과 응답 후, 양쪽에 모두 개입한다. 로깅, 응답 포맷 통일, 캐싱처럼 흐름 전체에 걸쳐 있는 작업에 쓴다.

정리

Pipe와 Interceptor를 이해하면, NestJS의 요청-응답 흐름을 원하는 지점에서 제어할 수 있다.