[NestJS] Pipe / Interceptor
![[NestJS] Pipe / Interceptor](/_next/image?url=https%3A%2F%2Fdonghyuncc-cloudfront-aws.ncloud.sbs%2F95e4789b-faab-4c51-a5e7-2cc74e443dfc.png&w=3840&q=75)
NestJS Pipe와 Interceptor
요청이 컨트롤러에 닿기 전, 응답이 클라이언트로 나가기 전.
NestJS는 그 흐름 사이에 끼어들 수 있는 수단을 두 가지 제공한다.
바로 Pipe와 Interceptor다.

Pipe

Pipe는 요청 데이터가 컨트롤러에 도달하기 전에 가공하는 역할을 한다. 하는 일은 두 가지다.
- 변환 (Transform): 입력 데이터를 원하는 타입으로 바꾼다.
- 검증 (Validation): 조건을 만족하지 않으면 예외를 던진다.
기본 사용법
ParseIntPipe는 URL로 들어온 문자열 "1"을 숫자 1로 바꿔준다. 변환에 실패하면 컨트롤러에 진입하기도 전에 400을 반환한다.
내장 Pipe 종류
| Pipe | 역할 |
|---|---|
| ParseIntPipe | 문자열 → 정수로 변환한다, 실패 시 400 |
| ParseFloatPipe | 문자열 → 실수, 실패 시 400 |
| ParseBoolPipe | "true" / "false" → boolean |
| ParseUUIDPipe | UUID 형식 검증, 실패 시 400 |
| ValidationPipe | DTO 기준으로 요청 바디 전체 검증 |
위 네 가지는 파라미터 하나를 다루지만, ValidationPipe는 DTO 객체 단위로 동작한다는 점이 다르다.
ValidationPipe + DTO
DTO의 조건을 하나라도 어기면 컨트롤러 진입 전에 400이 나간다. 컨트롤러 안에서 직접 타입을 확인할 필요가 없어진다.
전역 적용
매 라우트마다 붙이는 게 번거롭다면 main.ts에 한 번만 선언하면 된다.
Interceptor

Interceptor는 요청 전과 응답 후, 양쪽 모두에 개입할 수 있다.
Pipe가 들어오는 데이터만 처리한다면, Interceptor는 흐름 전체를 처리할 수 있다.
Interceptor의 핵심은 next.handle()이라는 매서드다.
이 메서드는 컨트롤러(또는 다음 핸들러)로 요청을 넘기는 역할을 한다.
즉,
- next.handle() 호출 이전 → 요청이 컨트롤러에 도달하기 전
- next.handle() 호출 이후 → 컨트롤러 실행 결과가 반환된 이후
이 구조 덕분에 Interceptor는 요청과 응답을 모두 제어할 수 있다.
주로 이런 경우에 쓴다.
- 요청 전: 로깅, 캐시 확인
- 응답 후: 응답 포맷 통일, 실행 시간 측정
전역 적용
main.ts에 선언하면 Pipe와 동일하게 전역으로 적용시킬 수 있다.
Pipe vs Interceptor
Pipe
컨트롤러 진입 전에만 실행된다. 데이터를 변환하거나, 조건에 맞지 않으면 예외를 던진다.
Pipe는 입력값을 다루는 게 목적이다.
Interceptor
요청 전과 응답 후, 양쪽에 모두 개입한다. 로깅, 응답 포맷 통일, 캐싱처럼 흐름 전체에 걸쳐 있는 작업에 쓴다.
정리
Pipe와 Interceptor를 이해하면, NestJS의 요청-응답 흐름을 원하는 지점에서 제어할 수 있다.