Published 2024. 11. 21. 17:14

🛠️NestJS의 lifecycle 

요청이 왔을 때 NestJS에서의 lifecycle을 보면 다음과 같다.

 

1. Requset

2. Middleware 📌 오늘 공부할 내용

   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

6. Controller(method handler)

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 공식문서 - middleware

'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
복사했습니다!