🛠️NestJS의 lifecycle
요청이 왔을 때 NestJS에서의 lifecycle을 보면 다음과 같다.
1. Requset
2.1. Globally bound middleware
2.2. Module bound middleware
3.Guards
4. Interceptor(컨트롤러 앞단)
4.1. Golbal interceptor
4.2 Controller interceptor
4.3 Route interceptor
5. Pipes
7. Service(존재한다면)
8. Interceptor(컨트롤러 뒷단)
8.1. Route interceptor
8.2 Controller interceptor
8.3 Global interceptor
9. Exception
9.1. Route
9.2. Controller
9.3. Global
10. Server response
미들웨어란?
미들웨어
1. 요청과 응답 사이에서 동작하는 중간 처리 단계
2. 라우팅 포인트 이전에 실행됨
3. DI가 가능 !
4. Express에서의 미들웨어와 거의 흡사
미들웨어 작성
먼저 ip, method, 상태코드를 로깅하는 미들웨어를 만들어보자.
nest g middleware logger -> 로거라는 이름의 미들웨어를 만드는 명령어
import { Injectable, Logger, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
private logger = new Logger('HTTP');
use(req: Request, res: Response, next: NextFunction) {
res.on('finish', () => {
this.logger.log(
`${req.ip} ${req.method} ${res.statusCode}`,
req.originalUrl,
);
});
next();
}
}
'finish' 라는 이벤트가 일어나면 실행
⚙️내부로직 상세설명
콘솔에 바로 찍는것보다
NestJS는 보통 로깅을 해줄 때 Logger클래스를 사용하면 좋음
private logger = new Logger('HTTP') -> HTTP프로토콜에 관한 로거임
res.on('finish',() => { //finish 라는 이벤트 발생 시
this.logger.log(
'${req.ip}', '${req.method}', '${res.statusCode}',
req.originalUrl); -> 이런식으로 사용 가능
});
응답 ::1 GET 200 (ip, method, 상태코드)
미들웨어 적용
미들웨어 데코레이터는 따로 없지만, 모듈 클래스의 configure() 메서드를 사용하여 설정할 수 있다.
미들웨어를 포함하는 모듈은 NestModule 인터페이스를 구현해야 한다.
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './common/middleware/logger.middleware';
import { CatsModule } from './cats/cats.module';
@Module({
imports: [CatsModule],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes('cats');
}
}
모듈에 이런식으로 넣어주면됨
consumer (소비자)에게 LoggerMiddleware 적용
.forRoutes('cats'); -> cats 라우터에 바인딩
.forRoutes('*'); -> 모든 엔드포인트에 대해 해당 미들웨어가 실행됨
'NestJS' 카테고리의 다른 글
[NestJS] Pipes (2) | 2024.12.02 |
---|---|
[NestJS] Exception (0) | 2024.11.28 |
[NestJS] Provider, Module (0) | 2024.11.20 |
[NestJS] Controller (0) | 2024.11.20 |
[Express] 라우터 분리, 모듈화 (0) | 2024.11.14 |