카테고리 없음

(공식문서) NestJS 인터셉터

foodev 2025. 2. 18. 15:38
728x90

 

 

관련된 링크

 

 

🌠 목차
✅ 
✅ 
✅ 

 

인터셉터의 기능 및 역할


AOP 기법에서 영감을 얻은 유용한 기능

메서드 실행 전/후에 추가 로직을 바인딩 

함수에서 반환된 결과 변환

함수에서 던져닌 예외를 변환

기본 함수 동작 확장

특정 조건에 따라 함수를 완전히 재정의(ex:캐싱)

 

쉽게 말해서 

컨트롤러 핸들러 메서드의 전후에 추가적인 로직을 삽입하거나,

핸들러의 결과값 또는 예외를 변환하는 등 다양한 작업을 수행할 수 있는 클래스입니다.

마치 컨트롤러 핸들러를 감싸는 래퍼(wrapper)와 같은 역할을 합니다.

 

인터셉터 구현 


중 제목 작성

인터셉터는 @Inejectable() 데코레이터 주석을 달고 NestInterceptor 인터페이스를 구현하는 클래스입니다.

 

각 인터셉터는 두 개의 인수를 받는 ExecutionContext와 CallHanlder 인자를 받습니다.

첫 번째 인수는 ExcutionContext(guard와 정확히 동일한 객체) 

Execution은 해당 글에 적었습니다 참고 -> 2025.02.18-(공식문서) NestJS 가드 

 

(공식문서) NestJS 가드

가드는 @Injectable() 데코레이터로 주석이 달린 클래스로,CanActivate 인터페이스를 구현합니다.  관련된 링크: https://docs.nestjs.com/guards   🌠 목차✅ 가드와 미들웨어 차이점✅ 가드 구현 canActivati

study-easy-coding.tistory.com

 

ExecutionContext: 현재 실행중인 컨텍스트에 대한 정보를 제공합니다.

callhandler(): handle() 메서드를 통해 라우트 핸들러 메서드를 호출합니다.

 

인터셉터 활용 예시


로깅: 요청 처리 시간, 요청/응답 데이터 등을 로깅합니다.

응답 변환: 컨트롤러 핸들러에서 반환된 결과값을 원하는 형태로 변환합니다.

예외 처리: 컨트롤러 핸들러에서 발생한 예외를 catch하고, 원하는 형태로 변환하거나 추가적인 처리를 수행합니다.

캐싱: 특정 조건을 만족하는 경우 캐시에서 응답을 반환하여 성능을 향상시킵니다.

타임아웃: 일정 시간 동안 응답이 없는 경우 요청을 종료합니다.

 

정리


1. 로깅 인터셉터 작성 문제

문제: 요청 처리 시간을 측정하여 로그에 출력하는 LoggingInterceptor를 작성하시오.

조건:

  • @Injectable() 데코레이터를 사용하여 DI 컨테이너에 등록해야 합니다.
  • NestInterceptor 인터페이스를 구현해야 합니다.
  • intercept() 메서드 내에서 ExecutionContext와 CallHandler를 활용해야 합니다.
  • console.log()를 사용하여 "Before..."와 "After... (소요 시간)ms" 메시지를 출력해야 합니다.
  • RxJS의 tap 연산자를 사용하여 observable 스트림을 처리해야 합니다.

 

 

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
	intercept(context: Executioncontext, next: CallHandler): Observable<any> {
    const now = Date.now();
    return next
    	.handle()
        .pipe(
        	tap(()=> console.log(`after...${Date.now() - now}ms))m,
        };
	}	
}

 

 

Observable 스트림

  • 비동기 데이터 처리: Observable은 RxJS 라이브러리에서 제공하는 비동기 데이터 스트림을 나타냅니다.
  • 시간에 따라 발생하는 이벤트 또는 값들의 순차적인 흐름이라고 생각하면 됩니다.

next.handle()

  • 다음 핸들러 호출: next는 CallHandler 객체로, handle() 메서드를 호출하여 다음 인터셉터 또는 라우트 핸들러를 실행합니다.
  • Observable 반환: handle() 메서드는 Observable을 반환하며, 이 Observable은 라우트 핸들러의 실행 결과를 포함합니다.

pipe()

  • 연산자 연결: pipe() 메서드는 RxJS 연산자를 연결하여 Observable 스트림을 변환합니다. 여러 연산자를 순차적으로 적용하여 데이터를 처리할 수 있습니다.

tap()

  • 부수 효과: tap() 연산자는 Observable 스트림의 값을 변경하지 않고,  부수 효과(side effect)를 수행합니다.
  • 예를 들어, 로깅, 디버깅, 데이터 검증 등에 사용할 수 있습니다.
  • 예제: 위 코드에서 tap() 연산자는 라우트 핸들러가 실행된 후 소요 시간을 로그에 출력하는 부수 효과를 수행합니다.

 

 

 

글 잼나게 보셨으면 좋아요 눌러주고 가세요

관심받는 거 좋아합니다

 

728x90