NestJS 프레임워크 사용을 위한 기본 개념에 대해 간략하게 정리해 보고자 한다.
본 포스팅에서는 middleware에 대해 알아보고 LoggerMiddle를 설정해 보도록 하겠다.
< 목차 >
- Middleware
- LoggerMiddleware 설정
1. Middleware
NestJS 미들웨어는 기본적으로 Express 미들웨어와 동일하다. 미들웨어가 어떠한 방식으로 동작하는지에 대해서는 이전 포스팅에서 작성해 놓은 내용이 있으니 참고하면 좋을 듯 하다.
2022.02.10 - [Node/Express] - Node.js - express (8) 라우터와 미들웨어 (router & middleware)
NestJS에서의 미들웨어에 대해서는 다음 두 가지 정도 숙지하고 있도록 하자.
- 미들웨어는 라우트 핸들러 이전에 호출되는 함수이다.
- NestJS 미들웨어는 의존성 주입(Dependency Injection)을 지원한다.
2. LoggerMiddleware 설정
우선 Nest CLI 를 사용해 다음과 같이 logger 미들웨어를 생성해준다.
## logger 미들웨어 생성
$ nest g mi logger
Nest CLI 에 의해 생성된 logger.middleware.ts 파일 안에 다음과 같이 LoggerMiddleware 클래스를 만들어 주도록 하자. NestJS에서는 logging을 할 때 Logger 클래스를 사용하므로 이를 활용하였다.
// logger.middleware.ts 파일
import { Injectable, Logger, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
// NestJS에서는 로깅을 할 때 Logger 클래스 사용
private logger = new Logger();
use(req: Request, res: Response, next: NextFunction) {
res.on('finish', () => {
this.logger.log(`${req.ip} ${req.method} ${res.statusCode}`, req.originalUrl);
});
next();
}
}
응답(response)에 대한 결과값도 logging 해주기 위해 res.on( 'finish' , () => {} ) 을 통해 이벤트를 등록하여 응답이 완료되었을 때 this.logger.log( ) 메소드가 실행되도록 하였다.
이제 만들어준 LoggerMiddleware를 AppModule에 적용해야 하는데, @Module( ) 데코레이터에는 미들웨어를 위한 장소가 없다. 대신 모듈 클래스의 configure( ) 메소드를 사용해 다음과 같이 AppModule에서 미들웨어를 설정하면 된다.
// app.module.ts 파일
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';
import { LoggerMiddleware } from './common/middlewares/logger.middleware';
@Module({
imports: [CatsModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes('*');
}
}
configure( ) 메소드를 통해 consumer에게 LoggerMiddleware를 제공(apply)하게 되며 forRoutes('*')의 '*'은 모든 엔드 포인트에 대해 LoggerMiddleware를 적용하겠다는 의미이다.
'Node > NestJS' 카테고리의 다른 글
NestJS - Pipes & Interceptors (0) | 2023.03.26 |
---|---|
NestJS - Exception filter 설정 (0) | 2023.03.16 |
NestJS - 캡슐화(Encapsulation) & Modules (0) | 2023.03.10 |
NestJS - 의존성 주입(DI) & Providers (0) | 2023.03.10 |
NestJS - 기본 구조 & Controllers (0) | 2023.03.09 |