개발 공부/NestJS

미들웨어 Middleware

2023. 3. 19. 09:16
목차
  1. 기본 로거 구현 해보기
  2. 미들웨어 적용
  3. 특정 메소드의 요청일 때만 미들웨어 적용하기

미들웨어는 라우터 핸들러보다 먼저 호출되는 함수, express의 middleware와 동작이 동일하다.

미들웨어 함수는 일반적으로 다음 작업들을 수행할 수 있다.

  • 모든 코드 실행
  • 요청(Request) 및 응답(Response) 객체 변경
  • 요청-응답 주기를 종료
  • 현재 미들웨어에서 요청-응답 주기를 종료하지 않으면 next 함수를 이용해 다음 미들웨어로 제어를 전달하도록 해야한다.

기본 로거 구현 해보기

함수나 @Injectable() 데코레이터가 존재하는 클래스로 구현해야 한다. 해당 클래스는 NestMiddleware를 구현해야 한다.

 

nest cli를 사용해 logger middleware를 생성한다.

$ nest g mi 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();
  }
}

 

응답 객체의 on 메소드에 finish 이벤트를 넣어주어 응답이 완료 되었을 때 콜백 함수가 작동하도록 하였다.

 

미들웨어 적용

Module() 데코레이터에는 미들웨어가 들어갈 자리가 없다. 대신 모듈 클래스의 configure() 메서드를 사용하여 설정한다.
미들웨어를 포함하는 모듈은 NestModule 인터페이스를 구현 해야한다. 

 

본인은 AppModule 레벨에서 LoggerMiddleware를 설정했다.

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('*');
  }
}

특정 메소드의 요청일 때만 미들웨어 적용하기

import { Module, NestModule, RequestMethod, 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({ path: 'cats', method: RequestMethod.GET });
  }
}

 

정상적으로 로깅 된 모습

더 자세한 내용이 알고 싶다면 공식문서를 추천한다.

https://docs.nestjs.com/middleware

'개발 공부 > NestJS' 카테고리의 다른 글

Serialize 직렬화  (0) 2023.03.23
인터셉터 Interceptor  (0) 2023.03.19
파이프 Pipe  (0) 2023.03.19
예외 필터 Exception filter  (0) 2023.03.19
Configuration  (0) 2023.03.12
  1. 기본 로거 구현 해보기
  2. 미들웨어 적용
  3. 특정 메소드의 요청일 때만 미들웨어 적용하기
'개발 공부/NestJS' 카테고리의 다른 글
  • 인터셉터 Interceptor
  • 파이프 Pipe
  • 예외 필터 Exception filter
  • Configuration
게으른 제이
게으른 제이
개발 관련 지식 및 다양한 정보들
게으른 제이
제이의 정보 블로그
게으른 제이
전체
오늘
어제
  • 분류 전체보기 (26) N
    • 개발 공부 (1) N
      • Node.js (1)
      • NestJS (10)
      • Docker (4)
      • 기타 (1)
      • Rust (1)
      • CS (4)
      • Flutter (1)
    • 기록 (2)
    • 정보 (1)
      • 일반 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • error
  • dependency-injection
  • NestJS
  • CS
  • DART
  • redis
  • LLM
  • OCP
  • Cache
  • Tool
  • Docker
  • flutter
  • Obsidian

최근 댓글

최근 글

hELLO · Designed By 정상우.
게으른 제이
미들웨어 Middleware
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.