1. Interceptor란?
Interceptor는 요청(request)과 응답(response) 사이에서 동작하는 미들웨어와 유사한 컴포넌트입니다.
NestJS의 AOP(관점 지향 프로그래밍) 기능 중 하나로, 서비스 로직에서 분리하여 처리할 수 있습니다:
2. 무엇을 할 수 있을까?
| 기능 |
설명 |
| 요청 전/후 로직 |
API 요청 시간 측정, 인증 전처리 등 |
| 응답 구조 변경 |
모든 응답을 { status, data, errorCode } 형식으로 통일 |
| 예외 래핑 |
try-catch 없이도 예외 처리 일괄 적용 |
| 캐싱 처리 |
중복된 요청에 대해 캐시된 응답 반환 |
3. 기본 구조
- intercept()가 호출되며 요청을 가로채고
- next.handle()은 실제 컨트롤러 함수 실행
- 결과 값을 map()으로 가공할 수 있습니다.
4. 적용 방법
(1) 전역(Global) 적용
// main.ts app.useGlobalInterceptors(new SuccessInterceptor());
(2) 특정 컨트롤러/라우터에 적용
@UseInterceptors(SuccessInterceptor) @Controller('user') export class UserController {}
5. 주의사항
| @Res() 사용 시 |
응답이 Interceptor를 거치지 않음 (자동 포맷 불가) |
| 성능 영향 |
모든 응답에 map() 연산자가 적용됨 |
| 비동기 처리 |
RxJS 개념 필수 (pipe, map, tap 등) |
6. 오늘 실제 작업 서비스: Bank & Valut Service
- 스마트 컨트랙트에서 불러온 응답 중 bigint 값은 string으로 변환
- 블록 정보를 객체로 포맷팅 하여 프런트엔드에 적합한 구조로 반환
- withdraw() 함수에서는 스마트 컨트랙트 예외 메시지를 직접 파싱 하여, "Only the owner" 메시지를 커스텀 예외로 변환
7. 마무리 정리
| Interceptor 개념 |
요청과 응답 사이를 가로채는 강력한 미들웨어 |
| 실전 활용 |
응답 포맷 통일, 블록체인 예외 처리, BigInt → String 변환 |
| NestJS 스타일 |
서비스는 책임 분리, 예외는 exception config에 일원화 |