참고자료 : https://docs.nestjs.com/faq/request-lifecycle
00. 들어가기 전
이번 포스트는 NestJS에서 Request를 받아서 Response 할 때까지 어떻게 흘러가는 지인, NestJS Request Lifecycle에 대해 정리한 글이다.
해당 부분에 대해서는 공식 문서만 참고하였다.
01. NestJS Lifecycle
아래의 이미지는 NestJS의 생명 주기를 도식화한 것이다. HTTP Request가 들어오면 Middleware, Guard, Interceptor, Pipes, Controller, Interceptor 순으로 거쳐서 Response가 된다.
여기에서 특이한 건 Filter 부분인데, 타 프레임워크와 다르게 NestJS에서의 Filter는 Exception을 처리하는 용도로 사용하게 됩니다. 해당 부분은 별도로 다루겠습니다.
02. Midleware
NestJS의 Middleware는 Express의 Middleware와 동일하다. Request와 Response 개체에 접근할 수 있으며 next()를 호출하여 다음 기능으로 넘어가야하며 스택에서 다음 미들웨어 함수를 호출한다.
Middleware는 전역적으로 선언된 것부터 실행한 후에 Module Middleware를 실행한다. Express와 유사하게 순서대로 실행된다고 생각하면 된다.
03. Guard
https://docs.nestjs.com/guards
Guard는 1개의 책임을 가지고 처리하는 클래스다. 런타임에 존재하는 특정 조건에 따라 주어진 요청이 Router에 의해 처리할 수 있게 가는 지 결정합니다. 예를 들면 AccessGuard, RoleGuard 등을 생성하여 인증이나 인가 처리를 할 수 있습니다.
보통 Express에서는 인증 인가 처리는 Middleware에서 처리하였지만 NestJS에서는 여러 이유로 Guard를 사용합니다. 이에 대해서는 따로 다루겠습니다.
Guard는 Global Guard부터 시작되어 Controller Guard, Routing Guard 순서대로 실행된다.
04. Interceptor
NestJS의 Interceptor는 AOP에서 영감을 받은 기능이며, ExcutionContext, CallHandler를 인자로 받아서 여러가지 로직을 처리할 수 있습니다.
인터셉터로는 아래 로직을 가능하게 합니다.
- 메서드 실행 전/후에 추가 로직 바인딩
- 함수에서 반환된 결과를 변환
- 함수에서 발생한 예외를 변환
- 기본 기능의 동작 확장
- 특정 조건에 따라 기능을 완전히 재정의
05. Pipes
NestJS의 Pipe는 2가지를 구현 가능합니다.
- 변환 : 입력 데이터를 원하는 형식으로 변환(number -> string or string -> number..)
- 유효성 검사 : 입력 데이터를 평가하고 유효한 경우에만 그대로 전달하고, 그렇지 않으면 예외를 발생시킵니다.
06. Filter
NestJS의 Filter는 전역 설정을 유일하게 우선시 하지 않으며, 즉 Routing Filter -> Controller Filter -> Global Filter 순서로 진행이 되고, 예외는 필터에서 필터로 전달 될 수 없기에 Routing Filter에서 예외를 감지하면 Controller나 Global에서 감지할 수 없습니다.
07. 마무리하며.
오늘은 NestJS의 Request Lifecycle에 대해서 간단하게 정리해보았는 데, 해당 LifeCycle에 들어가있는 각 요소에 대해서는 한 번씩 정리를 하는 것이 좋을 거 같다.
'B.E > Nest JS' 카테고리의 다른 글
node-optional를 이용한 Exception 관리 (0) | 2024.10.18 |
---|---|
NestJS에서 typeorm-transactional를 사용하여 트랜잭션 관리 (0) | 2024.05.13 |
NestJs Event 처리(@nestjs/event-emitter) (0) | 2024.04.11 |
NestJS V10 마이그레이션 + SWC (0) | 2023.10.11 |
Nestjs V10의 변화점 (0) | 2023.10.11 |