NestJS 요청 라이프 사이클 (NestJS Request Lifecycle)

2023. 12. 11. 22:55프레임워크/Nest.js

요청 라이프 사이클이란?

 

요청이 디바이스로부터 서버로 보내진 다음에 응답이 되어서 돌아오는 과정을 전부 표현한 것

 

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

 

아래 사진은 기본적인 REST API 의 라이프 사이클이다.

 

 

실제로 이 정확한 순서대로 실행이 된다.


1. Middleware

 

전역으로 바인딩 되어 있는 미들웨어를 가장 먼저 실행한다. (main.ts 에 app.use 로 바인딩 되어 있는 미들웨어들)

express와 비슷한 방식으로 바인딩 된 순서대로 순차적으로 실행된다.

 

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

2. Guard

 

사용자의 권한을 체크하는 로직이 들어간다. 예를 들어 jwt 를 사용한다면 @UseGuards()를 통해 jwt의 값이 유효한지 검사할 수 있다.

 

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

3. Interceptor

 

인터셉터는 컨트롤러에 접근하기 전, 후에서 바인딩 시킬 수 있다.

컨트롤러에 접근하기 전에 사용하려면 return 전에 사용하려면 return 전에 사용하면 되고 컨트롤러 접근 후에 사용하려면 return 문에 사용하면 된다.

 

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

4. Pipe

 

요청이 들어오는 파라미터의 validation 혹은 형변환이 필요할 때 파이프에서 진행한다.

 

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

5. Controller

 

routing, http method, Request 에 담긴 페이로드, Response에 담을 페이로드를 Controller 에서 관리 할 수 있다.


6. Service

 

실제 비즈니스 로직을 Service 단 에서 관리할 수 있다.


7. Exception Filter

 

Exception Filter는 로직을 처리하다가 오류가 발생하면 HttpException 을 throw 하게 된다.

 

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

참고링크

 

https://docs.nestjs.com/faq/request-lifecycle

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

https://ckanywhere.tistory.com/4

 

Nest.js 개요와 라이프 사이클

Nest.js 개요 Nest.js는 Node.js의 프레임 워크이다. 확장이 쉬우며, rest-api, graphql, microservice(non-http), websocket 의 템플릿을 cli 를 통해 자동으로 생성 해준다. Express/Fastify 기반의 서버를 제공한다. IoC를

ckanywhere.tistory.com

https://velog.io/@emer/NestJS-%EC%9A%94%EC%B2%AD-%EC%88%98%EB%AA%85-%EC%A3%BC%EA%B8%B0Request-LifeCycle

 

NestJS 요청 수명 주기(Request LifeCycle)

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

velog.io