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
https://ckanywhere.tistory.com/4
'프레임워크 > Nest.js' 카테고리의 다른 글
NestJS TypeORM 설정 및 연결 with PostgreSQL (0) | 2023.12.14 |
---|---|
Dependency Injection / Inversion of Control [의존성 주입 / 제어의 역전] [NestJS] (0) | 2023.12.13 |
nestjs prisma 사용해보기 with AWS RDS (1) | 2023.12.04 |
Mongoose 사용하기 [Nest.js] (0) | 2023.12.03 |
Nest.js 미들웨어 (logger 미들웨어) (1) | 2023.12.02 |