Interceptors와 AOP


Interceptor에는 AOP기술에서 영감을 받았다.

AOP란 관점 지향 프로그래밍으로 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.

스크린샷 2024-03-09 오전 1.27.31.png

cats.controller.ts

  @Get()
  getAllCat() {
    // throw new HttpException('api is broken', 401); // === throw new Error("")

    return { cats: `get all cat` };
  }

success.interceptor.ts

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

@Injectable()
export class Successnterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    console.log('Before...'); // pre-controller , middleware와는 실행순서가 다르다

    const now = Date.now();
    return next.handle().pipe(
      map((data) => ({
        success: true,
        data,
      })),
    ); // post-request
  }
} // AOP

Before…은 controller가 시작하기 전 즉, pre-controller 단계다.

return 은 request 이후 즉, post-request 단계다.

cats.controller.ts

@Controller('cats')
@UseInterceptors(SuccessInterceptor)
@UseFilters(HttpExceptionFilter)
export class CatsController {
  constructor(
    private readonly catsService: CatsService,
    private readonly authService: AuthService, // DI , cats.module에서 Authmodule을 import 해야 사용가능
  ) {}
...
}

cats.controller.ts@UseInterceptors(SuccessInterceptor)를 넣어주면 cats.controller.ts로 들어가는 요청은 모두 interceptor를 거치게 된다.

위와 같은 코드의 서버에 클라이언트 요청을 보낸 후 받은 응답(server response)은 다음과 같다.