@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를 사용한 문법으로 사용 됨
즉 나눠서 코딩을 할 수 있다는 것
리퀘스트의 수명 주기 알아야 편함.
미들웨어가 실행되고 가드가 실행되고 나서
인터셉터가 시작됨 (pre-controller)라는건 컨트롤러가 시작 되기전
시작이되면 파이프가 시작이 됨 거치고 나서 컨트롤러 서비스가 거쳐지고
다시 인터셉터가(post-request) 등장하게됨
만약 익셉션이 발생하면 익셉션필터로 가게되고
서버 응답을 하게 됨
SuccessInterceptor를 만들고 적용시켜봄
rxjs 문법을 이용한 map을 활용해서 적용시킴
before... 를 삭제시킨 이유는 어차피 이 과정은
미들웨어에서 처리하는 경우가 많기 때문임