[TIL] 2024.03.18 Interceptor와 AOP 관점
인터셉터는
@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를 사용한 문법으로 사용 됨
즉 나눠서 코딩을 할 수 있다는 것
- Incoming request
- Middleware
- 2.1. Globally bound middleware
- 2.2. Module bound middleware
- Guards
- 3.1 Global guards
- 3.2 Controller guards
- 3.3 Route guards
- Interceptors (pre-controller)
- 4.1 Global interceptors
- 4.2 Controller interceptors
- 4.3 Route interceptors
- Pipes
- 5.1 Global pipes
- 5.2 Controller pipes
- 5.3 Route pipes
- 5.4 Route parameter pipes
- Controller (method handler)
- Service (if exists)
- Interceptors (post-request)
- 8.1 Route interceptor
- 8.2 Controller interceptor
- 8.3 Global interceptor
- Exception filters
- 9.1 route
- 9.2 controller
- 9.3 global
- Server response
리퀘스트의 수명 주기 알아야 편함.
미들웨어가 실행되고 가드가 실행되고 나서
인터셉터가 시작됨 (pre-controller)라는건 컨트롤러가 시작 되기전
시작이되면 파이프가 시작이 됨 거치고 나서 컨트롤러 서비스가 거쳐지고
다시 인터셉터가(post-request) 등장하게됨
만약 익셉션이 발생하면 익셉션필터로 가게되고
서버 응답을 하게 됨
SuccessInterceptor를 만들고 적용시켜봄
rxjs 문법을 이용한 map을 활용해서 적용시킴
before... 를 삭제시킨 이유는 어차피 이 과정은
미들웨어에서 처리하는 경우가 많기 때문임