NestJS 요청 수명 주기(Request LifeCycle)

김석규·2022년 11월 8일
0

NestJS는 요청을 처리할 때 요청 수명 주기라는 순서대로 응답을 생성한다. 일반적으로 요청은 미들웨어를 시작으로 가드, 인터셉터, 파이프, 마지막으로 반환 경로의 인터셉터로 흐른다.

미들웨어

  • 먼저 전역으로 바인딩된 미들웨어 부터 실행된다.
  • 이후 모듈에 바인딩 된 미들웨어가 실행된다.
  • 서로 다른 모듈에 바인딩된 미들웨어의 경우 루트 모듈, 가져오기 배열에 모듈이 추가된 순서대로 미들웨어가 실행된다.

가드

  • 전역 가드, 컨트롤러 가드, 라우트(Route) 가드 순서대로 실행된다.
  • 미들웨어와 마찬가지로 바인딩된 순서대로 실행된다.
  • app.useGlobalGuard() 모듈을 통해 구성요소를 사용하거나 제공하는 경우 전역적으로 바인딩된다.
  • 가드 데코레이터가 컨트롤러 클래스 앞에 있으면 컨트롤러에 바인딩되고, 내부에 선언되면 라우터에 바인딩된다.

인터셉터

  • 대부분의 이터셉터는 가드와 동일하다. 단, 인터셉터가 RxJS Observables를 반환하면 옵저버블은 선입선출 방식으로 해결(Resolve)한다.
  • 인바운드 요청은 표준 전역, 컨트롤러, 라우터를 거치고, 요청에 대한 응답은 라우터, 컨트롤러, 전역 순서이다.
  • 파이프, 컨트롤러 또는 서비스에서 발생하는 모든 오류는 인터셉터의 catchError에서 읽을 수 있다.

파이프

  • 매개변수와 관련하여 선입선출이다. 경계 시퀸스를 라우팅하기 위해 컨트롤러에 대한 표준전역을 따른다.
  • 라우트 파라미터 수준에서 여러 파이프가 실행중인 경우 첫 번째 매개변수 부터 마지막 매개변수의 순서로 실행된다.
  • 이는 라우트 수준, 컨트롤로 수준 파이프에도 적용된다.

필터

  • 필터는 전역 먼저 확인하지 않는 유일한 구성 요소이다. 가능한 가장 낮은 수준에서 해결(Resolve)한다. 라우트에서 컨트롤러, 마지막으로 전역 필터로 진행된다.
  • 그러나 필터에서 필터로 예외를 전달 할 수는 없다.
  • 라우터 수준 필터가 예외를 포착하면 컨트롤러 또는 전역 필터가 동일한 예외를 포착 할 수 없고, 이와 같은 효과를 얻는 유일한 방법은 필터간에 상속을 사용하는 것이다.

일반적인 요청 수명 주기

  • 들어오는 요청
  • 미들웨어
    • 전역적으로 바인딩된 미들웨어
    • 모듈 바인딩 미들웨어
  • 가드
    • 글로벌 가드
    • 컨트롤러 가드
    • 라우트 가드
  • 컨트롤러 이전 인터셉터
    • 글로벌 인터셉터(컨트롤러 이전)
    • 컨트롤러 인터셉터(컨트롤러 이전)
    • 라우트 인터셉터(컨트롤러 이전)
  • 파이프
    • 글로벌 파이프
    • 컨트롤러 파이프
    • 라우트 파이프
    • 매개변수 파이프 경로 지정
  • 컨트롤러(메서드 핸들러)
  • 서비스(존재하는 경우)
  • 요청 후 인터셉터
    • 라우트 인터셉터(요청 후)
    • 컨트롤러 인터셉터(요청 후)
    • 전역 인터셉터(요청 후)
  • 예외 필터(라우트, 컨트롤러, 전역)
  • 서버 응답
profile
백엔드 개발자 지망생

0개의 댓글