
NestJS에서인터셉터(Interceptors)는요청과응답을 가로채어 추가 처리를 할 수 있게 해주는 기능이다. 주로요청 전/후 로직을 실행하거나 응답데이터를 변환하고, 로깅, 캐싱, 에러 처리등을 수행하는데 사용된다.
인터셉터(Interceptors) 의 특징요청 및 응답 조작 : 요청 을 처리하기 전에 검사하거나 변형하고 , 응답 을 반환하기 전에 데이터를 수정하거나 형식을 변경할 수 있다.다양한 용도 : 로깅 , 캐싱 , 성능 모니터링 , 변환 , 보안 검사 , 예외 처리 등 다양한 용도로 사용할 수 있다.글로벌, 컨트롤러 , 메소드 수준에서 사용 가능 : 특정 범위에서만 적용할 수 있다.인터셉터(Interceptors) 사용법인터셉터(Interceptors) 정의하기→ NestIntercptor 라는 인터페이스를 구현하여 인터셉터를 정의한다.
/* Injectable : NestJS의 DI를 사용하기 위함
* NestInterceptor : 인터셉터를 정의하기 위한 인터페이스
* ExecutionContext : 현재 실행중인 요청 가져오기
* CallHandler : 컨트롤러 메소드 호출
* Observable : RxJS 클래스 호출. 비동기 데이터 스트림을 뜻함. 인터셉터는 해당 스트림을 통해
* 데이터 변환 가능
*/
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Injectable() // 의존성 주입 가능 클래스 지정
export class TransformInterceptor<T> implements NestInterceptor<T, any>{
// intercept를 통해 요청을 가로채고 다음 처리 단계(컨트롤러)로 전달
// context : 현재 실행중인 요청을 말한다.
// next : 컨트롤러를 호출하는 메소드
intercept(context: ExecutionContext, next: CallHandler): Observable<any>{
// next.handle() : 다음 핸들러(컨트롤러 메소드) 호출
return next.handle().pipe( // pipe : 연산자를 연결하여 Observable의 데이터 처리
map(data -> ({ data })), // 응답 데이터를 수정하여 `{ data : originData }`형식으로 변경
);
}
}
인터셉터(Interceptors) 적용하기→ 인터셉터를 적용하고자 하는 컨트롤러 혹은 특정 핸들러에 @UseInterceptors 데코레이터를 사용하여 적용하거나, 글로벌 로 적용한다.
import { Controller, Get, UseInterceptors } from '@nestjs/common';
@Controller('dogs')
@UseInterceptors(TransformInterceptor) // 컨트롤러에 인터셉터 적용
export class DogsController{
@Get()
findAll(){
return ['dog1', 'dog2'];
}
}
→ 글로벌 인터셉터(Global Interceptors) 를 적용하기 위해선 app.module.ts 에서 설정할 수 있다.
import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core'; // 인터셉터 모듈 불러오기
@Module({
providers: [
{
provide: APP_INTERCEPTOR,
useClass: TransformInterceptor, // 정의한 인터셉터 적용
},
],
})
export class AppModule {}
→ NestJS 에서 인터셉터(Interceptors) 는 요청과 응답 을 가로채어 추가 처리를 가능하게 한다.
→ 인터셉터(Interceptors) 는 요청 및 응답 조작 , 로깅, 캐싱, 예외처리 등 다양한 용도로 사용할 수 있고 적용 범위를 지정할 수 있다.
→ 사용법 : NestInterceptor 를 구현하여 정의하고, @UseInterceptors 데코레이터로 적용하거나 글로벌로 설정한다.