[Nestjs] interceptor사용

최영섭·2024년 4월 27일
0

0. 배경 및 요구사항

  • express코드를 nestjs로 리펙터링하는 중이다.
  • 기존 code에서 항상 return data에 success항목을 넣어 200번대 응답이라면 항상 success:true를 함께 반환하였다. (처음 백엔드를 시작하면서 작성하였던 코드인데 지금은 상당히 맘에 안들어 없애고 싶다….;;;하지만 프론트엔드에서 상당히 많은 부분 이 success에 의존하고 있어 변경이 어렵다.)
  • nestjs에서 매번 성공 로직시 success: true를 추가해주는 것이 아니라 intercepter를 활용하여 200번대 응답시 컨트롤러에서 반환된 응답 데이터를 가로채고 수정하도록 한다.

1. success.interceptor.ts 파일을 생성

200번대의 응답시 success: true, 아닐시 success: false

import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable()
export class SuccessInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(
      map((data) => {
        const response = context.switchToHttp().getResponse();
        const statusCode = response.statusCode;

        if (statusCode >= 200 && statusCode < 300) {
          return {
            success: true,
            data,
          };
        } else {
          return {
            success: false,
            data,
          };
        }
      }),
    );
  }
}

2. app.module에 추가

import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { SuccessInterceptor } from './success.interceptor';

@Module({
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: SuccessInterceptor,
    },
  ],
})
export class AppModule {}

위와 같이 설정했을때 자연스럽게 성공 혹은 실패시 그에 맞는 success값이 추가된다.

ex

{
	success: true,
	data: [
		...
	]
}
profile
세상에 필요한 것을 고민하고 그것을 만드는 과정에서 문제를 해결하는 일이 즐겁습니다. 창업, 백엔드, RAG에 관심을 가지고있습니다.

0개의 댓글