NestJS는 요청을 처리할 때 요청 수명 주기라는 순서대로 응답을 생성한다. 일반적으로 요청은 미들웨어를 시작으로 가드, 인터셉터, 파이프, 마지막으로 반환 경로의 인터셉터로 흐른다.
미들웨어
- 먼저 전역으로 바인딩된 미들웨어 부터 실행된다.
- 이후 모듈에 바인딩 된 미들웨어가 실행된다.
- 서로 다른 모듈에 바인딩된 미들웨어의 경우 루트 모듈, 가져오기 배열에 모듈이 추가된 순서대로 미들웨어가 실행된다.
가드
- 전역 가드, 컨트롤러 가드, 라우트(Route) 가드 순서대로 실행된다.
- 미들웨어와 마찬가지로 바인딩된 순서대로 실행된다.
- app.useGlobalGuard() 모듈을 통해 구성요소를 사용하거나 제공하는 경우 전역적으로 바인딩된다.
- 가드 데코레이터가 컨트롤러 클래스 앞에 있으면 컨트롤러에 바인딩되고, 내부에 선언되면 라우터에 바인딩된다.
인터셉터
- 대부분의 이터셉터는 가드와 동일하다. 단, 인터셉터가 RxJS Observables를 반환하면 옵저버블은 선입선출 방식으로 해결(Resolve)한다.
- 인바운드 요청은 표준 전역, 컨트롤러, 라우터를 거치고, 요청에 대한 응답은 라우터, 컨트롤러, 전역 순서이다.
- 파이프, 컨트롤러 또는 서비스에서 발생하는 모든 오류는 인터셉터의 catchError에서 읽을 수 있다.
파이프
- 매개변수와 관련하여 선입선출이다. 경계 시퀸스를 라우팅하기 위해 컨트롤러에 대한 표준전역을 따른다.
- 라우트 파라미터 수준에서 여러 파이프가 실행중인 경우 첫 번째 매개변수 부터 마지막 매개변수의 순서로 실행된다.
- 이는 라우트 수준, 컨트롤로 수준 파이프에도 적용된다.
필터
- 필터는 전역 먼저 확인하지 않는 유일한 구성 요소이다. 가능한 가장 낮은 수준에서 해결(Resolve)한다. 라우트에서 컨트롤러, 마지막으로 전역 필터로 진행된다.
- 그러나 필터에서 필터로 예외를 전달 할 수는 없다.
- 라우터 수준 필터가 예외를 포착하면 컨트롤러 또는 전역 필터가 동일한 예외를 포착 할 수 없고, 이와 같은 효과를 얻는 유일한 방법은 필터간에 상속을 사용하는 것이다.
일반적인 요청 수명 주기
- 들어오는 요청
- 미들웨어
- 전역적으로 바인딩된 미들웨어
- 모듈 바인딩 미들웨어
- 가드
- 컨트롤러 이전 인터셉터
- 글로벌 인터셉터(컨트롤러 이전)
- 컨트롤러 인터셉터(컨트롤러 이전)
- 라우트 인터셉터(컨트롤러 이전)
- 파이프
- 글로벌 파이프
- 컨트롤러 파이프
- 라우트 파이프
- 매개변수 파이프 경로 지정
- 컨트롤러(메서드 핸들러)
- 서비스(존재하는 경우)
- 요청 후 인터셉터
- 라우트 인터셉터(요청 후)
- 컨트롤러 인터셉터(요청 후)
- 전역 인터셉터(요청 후)
- 예외 필터(라우트, 컨트롤러, 전역)
- 서버 응답