상세 컨텐츠

본문 제목

[TIL] 2024.03.18 Interceptor와 AOP 관점

카테고리 없음

by 재호링 2024. 3. 19. 01:14

본문

인터셉터는

@Injectable() 데코레이터로 주석이 달린 클래스 인터셉터는 NestInterceptor 인터페이스를 구현해야함

 

인터셉터에는 AOP( Aspect Oriented 프로그래밍 ) 기술 에서 영감을 받은 유용한 기능 세트가 있다.

 이를 통해 다음이 가능해진다.

  • 메소드 실행 전/후에 추가 로직 바인딩
  • 함수에서 반환된 결과를 변환
  • 함수에서 발생한 예외를 변환
  • 기본 기능 동작 확장
  • 특정 조건(예: 캐싱 목적)에 따라 기능을 완전히 재정의

관점 지향 프로그래밍 교차 관심사를 분리하여 모듈성을 높이는 것을 목표로 하는 프로그래밍 패러다임

즉 로깅처럼 인터셉터는 각가의 기능에 횡단을하면서 관점지향으로 재사용성을 목적으로 하나로 묶는 것

 

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

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    console.log('Before...');

    const now = Date.now();
    return next
      .handle()
      .pipe(
        tap(() => console.log(`After... ${Date.now() - now}ms`)),
      );
  }
}

 

    console.log('Before...'); << 컨트롤러가 시작되기 전 부분을 의미함
    tap(() => console.log(`After... ${Date.now() - now}ms`)), << 컨트롤러가 끝났을때 를 의미함

 

컨트롤러가 시작하고나서 그 다음에 post-request는

RxJS를 사용한 문법으로 사용 됨

 

즉 나눠서 코딩을 할 수 있다는 것

  1. Incoming request
  2. Middleware
    • 2.1. Globally bound middleware
    • 2.2. Module bound middleware
  3. Guards
    • 3.1 Global guards
    • 3.2 Controller guards
    • 3.3 Route guards
  4. Interceptors (pre-controller)
    • 4.1 Global interceptors
    • 4.2 Controller interceptors
    • 4.3 Route interceptors
  5. Pipes
    • 5.1 Global pipes
    • 5.2 Controller pipes
    • 5.3 Route pipes
    • 5.4 Route parameter pipes
  6. Controller (method handler)
  7. Service (if exists)
  8. Interceptors (post-request)
    • 8.1 Route interceptor
    • 8.2 Controller interceptor
    • 8.3 Global interceptor
  9. Exception filters
    • 9.1 route
    • 9.2 controller
    • 9.3 global
  10. Server response

리퀘스트의 수명 주기 알아야 편함.

 

미들웨어가 실행되고 가드가 실행되고 나서

인터셉터가 시작됨 (pre-controller)라는건 컨트롤러가 시작 되기전

시작이되면 파이프가 시작이 됨 거치고 나서 컨트롤러 서비스가 거쳐지고

다시 인터셉터가(post-request) 등장하게됨

만약 익셉션이 발생하면 익셉션필터로 가게되고

서버 응답을 하게 됨

 

 

 

SuccessInterceptor를 만들고 적용시켜봄

rxjs 문법을 이용한 map을 활용해서 적용시킴

before... 를 삭제시킨 이유는 어차피 이 과정은

미들웨어에서 처리하는 경우가 많기 때문임