본문 바로가기
Back-end/Node-NestJS

[Nest.js] Interceptor VS Filter VS Middleware 차이점

by 꼬바리 2022. 9. 7.

Nest.js 에서  Interceptor VS Filter VS Middleware  세가지 모두 매우 유사한 개념이며, 사용자의 선호도 따라 결정됩니다.


 

Nest.js의 라이프 사이클(Life Cycle)

1. 미들웨어 (Middleware)
2. 글로벌 가드 (Global Guards)
3. 컨트롤러-레벨 가드 (Controller-level Guards)
4. 메서드-레벨 가드 (Method-level Guards)
5. 글로벌 파이프 (Global Pipes)
6. 컨트롤러-레벨 파이프 (Controller-level Pipes)
7. 메서드-레벨 파이프 (Method-level Pipes)
8. 컨트롤러 및 프로바이더 (Controller & Provider)
9. 글로벌 인터셉터 (Global Interceptors)
10. 컨트롤러-레벨 인터셉터 (Controller-level Interceptors)
11. 메서드-레벨 인터셉터 (Method-level Interceptors)
12. 예외 필터 (Exception Filters)


인터셉터

인터셉터는 경로 처리기가 호출 되기 전후  응답/요청에 액세스할 수 있습니다 .

 

등록

  • @UseInterceptors()컨트롤러 또는 메서드 범위가 있는 컨트롤러 클래스에서 직접
  • 전 세계적 app.useGlobalInterceptors()으로 main.ts

  • LoggingInterceptor: 라우트 핸들러 이전과 이후에 결과를 요청합니다. 소요 시간을 측정합니다.
  • ResultMapping: 응답 객체로 변환 하거나 결과 null []래핑: users->{users: users}

결론

등록이 미들웨어에 비해 라우트 핸들러에 가깝다는 점이 마음에 듭니다. 그러나 몇 가지 제한 사항이 있습니다. 예를 들어 경로 처리기에서 response라이브러리별 개체와 함께 보낼 때 응답 코드를 설정하거나 인터셉터로 응답을 변경할 수 없습니다( 문서 참조) .@Res()

 


미들웨어

미들웨어는 경로 처리기가 호출되기 에만 호출됩니다. 응답 개체에 액세스할 수 있지만 경로 처리기의 결과가 없습니다. 기본적으로 익스프레스 미들웨어 기능입니다.

등록

  • 모듈에서 관련 경로를 선택하는 매우 유연한 방법(와일드카드 포함, 메서드별...)
  • 전 세계적 app.use()으로main.ts

  • FrontendMiddleware: API를 제외한 모든 경로를 로 리디렉션합니다. 이 스레드index.html 를 참조 하세요.
  • 시중에 나와 있는 모든 익스프레스 미들웨어를 사용할 수 있습니다. 많은 라이브러리 가 있습니다 . 예를 들어 body-parser또는morgan

결론

미들웨어의 등록은 매우 유연합니다. 예를 들어: 하나를 제외한 모든 경로에 적용합니다. 그러나 그것들은 모듈에 등록되어 있기 때문에 해당 메소드를 볼 때 컨트롤러에 적용된다는 사실을 깨닫지 못할 수도 있습니다. 또한 시중에 나와 있는 모든 익스프레스 미들웨어 라이브러리를 사용할 수 있다는 점도 좋습니다.

 


예외 필터

예외 필터는 경로 핸들러와 인터셉터 다음에 호출됩니다. 응답이 나오기 전에 마지막으로 변경할 수 있는 곳입니다.

등록

  • @UseFilters()컨트롤러 또는 메서드 범위가 있는 컨트롤러 클래스에서 직접
  • 전 세계적 app.useGlobalFilters()으로 귀하의main.ts

  • UnauthorizedFilter: 사용자가 이해하기 쉬운 메시지에 매핑
  • NotFoundFilter: 찾을 수 없는 모든 경로(API의 일부가 아님)를 index.html.

결론

예외 필터의 기본 사용 사례는 이해할 수 있는 오류 메시지를 제공하는 것입니다(기술적 세부 정보 숨기기). 그러나 다른 창의적인 사용 방법도 있습니다. 단일 페이지 애플리케이션을 제공할 때 일반적으로 index.htmlAPI의 경로를 제외한 모든 경로가 리디렉션되어야 합니다. 여기에서 리디렉션할 수 있습니다 NotFoundException. 어떤 사람들은 이 영리한 다른 사람들이 해커라고 생각할 수도 있습니다. 당신의 선택. ;-)

 


따라서 실행 순서는 다음과 같습니다.

 

미들웨어 -> 인터셉터 -> 경로 처리기 -> 인터셉터 -> 예외 필터(예외가 발생한 경우)

 

세 가지 모두를 사용하여 생성자에 다른 종속성(예: 서비스,...)을 삽입할 수 있습니다.

 

인터셉터나 파이프 전에 실행되는 Guard 도 존재한다.

NestJ 파이프라인 다이어그램

출처 : https://stackoverflow.com/questions/54863655/whats-the-difference-between-interceptor-vs-middleware-vs-filter-in-nest-js

 

 


미들웨어

인터셉터

필터

Nest.js 미들웨어의 사용법과 기능은 기본적으로 Express.js와 동일하며 일반적으로 다음을 위해 작동합니다. 인터셉터는 다음 기능을 수행할 수 있는 컨트롤러와 클라이언트 측 사이에서 데이터를 변환할 수 있습니다. Nest.js에서 필터는 일반적으로 애플리케이션에서 처리되지 않은 모든 예외를 처리하는 예외 필터를 나타냅니다.
  • 모든 코드를 실행합니다.
  • 요청 및 응답 개체를 변경합니다.
  • 요청-응답 주기를 종료합니다.
  • 스택의 다음 미들웨어 함수를 호출합니다.
  • 현재 미들웨어 함수가 요청-응답 주기를 종료하지 않으면 next() 다음 미들웨어 함수에 제어를 전달하기 위해 호출해야 합니다. 그렇지 않으면 요청이 중단됩니다.
  • 메서드 실행 전후에 추가 논리 바인딩
  • 함수에서 반환된 결과를 변환
  • 함수에서 throw된 예외를 변환합니다.
  • 기본 기능 동작 확장
  • 특정 조건에 따라 함수를 완전히 재정의합니다(예: 캐싱 목적).
  • 내장 전역 예외 필터는 HttpException 유형의 예외(및 그 하위 클래스)를 처리합니다.
  • 사용자 정의 예외 필터는 제어의 정확한 흐름과 클라이언트로 다시 전송되는 응답의 내용을 제어하기 위해 설계되었습니다. 예를 들어, 일부 동적 요소를 기반으로 로깅을 추가하거나 다른 JSON 스키마를 사용합니다.
728x90
반응형

댓글