NestJS의 인터셉터(Interceptors)란?

Daehyeon Yun·2024년 8월 7일

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 데코레이터로 적용하거나 글로벌로 설정한다.

profile
열심히 살아야지

0개의 댓글