NestJS 기초 (8) 미들웨어

2022. 10. 7. 22:53·개발/NestJS

미들웨어란 라우트 핸들러 이전에 호출되는 함수입니다. 미들웨어 함수는 애플리케이션의 요청-응답 사이클 내에서 request 및 response 객체와 next() 미들웨어 함수에 접근할 수 있습니다. next 미들웨어 함수는 보통 next라는 변수명으로 사용됩니다.

Nest 미들웨어는 기본적으로 express 미들웨어와 동일합니다. 다음은 express 문서에서 설명하고 있는 미들웨어의 역할입니다.

  • 미들웨어 함수는 다음과 같은 일을 할 수 있습니다.
    • 코드 실행
    • request, reponse 객체 요청 변경
    • 요청-응답 사이클 종료
    • 스택 내 다음 미들웨어 함수 호출
    • 현재 미들웨어 함수가 요청-응답 사이클을 종료하지 않으면 next()를 반드시 호출하여 다음 미들웨어 함수로 권한을 넘겨야 합니다.

함수 또는 @Injectable() 데코레이터를 사용한 클래스 내에서 Nest 미들웨어를 구현할 수 있습니다. 클래스는 NestMiddleware 인터페이스를 실행해야 하지만 함수에는 특별한 조건은 없습니다. 클래스 메소드를 사용하여 다음과 같이 간단한 미들웨어를 만들 수 있습니다.

# logger.middleware.ts

import { Injectable, NestMiddleware } from '@nestjs/common';,
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
    use(req: Request, res: Response, next: NextFunction) {
        console.log('Request...');
        next();
    }
}

디펜던시 인젝션

Nest 미들웨어는 디펜던시 인젝션을 완전히 지원합니다. 프로바이더와 컨트롤러를 통해 동일한 모듈 내에 디펜던시 인젝션을 할 수 있습니다. 이는 보통 constructor를 사용합니다.

미들웨어 사용하기

@Module() 데코레이터 내에는 미들웨어가 없습니다. 그 대신 우리는 모듈 클래스의 configure() 메소드를 사용하여 이를 설정했습니다. 미들웨어를 포함하고 있는 모듈은 반드시 NestModule 인터페이스를 사용합니다. AppModule 레벨에서 LoggerMiddleware를 설정해보도록 하겠습니다.

# app.module.ts

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

위 예시는 앞서 CatsController 내에서 정의한 /cats 라우트 핸들러의 LoggerMiddleware를 설정하는 예시입니다. 마지막 .forRoutes('cats') 부분을 .forRoutes('\*')로 변경하면 와일드카드 형식으로 사용할 수 있습니다.

 

미들웨어를 설정할 때 라우트 path와 요청 method 를 forRoute() 메소드에 전달하여 미들웨어를 통제할 수도 있습니다. 아래의 예시는 RequestMethod enum을 불러와 원하는 요청 메소드 유형을 참조합니다.

# app.module.ts

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 });
  }
}

NestJS답게 로그 찍기

미들웨어를 구현했다면 관련 로그를 console.log()를 통해 찍어볼 수도 있지만 다음과 같이 NestJS 내에서 제공하는 방법을 활용할 수도 있습니다.

#logger.middleware.ts

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

참고 자료

  • https://docs.nestjs.com/middleware

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

NestJS 기초 (9) 예외 처리  (0) 2022.10.09
NestJS 기초 (7) 환경 변수 관리하기  (0) 2022.10.06
NestJS 기초 (6) 모듈  (0) 2022.10.04
'개발/NestJS' 카테고리의 다른 글
  • NestJS 기초 (10) 파이프와 유효성 검사
  • NestJS 기초 (9) 예외 처리
  • NestJS 기초 (7) 환경 변수 관리하기
  • NestJS 기초 (6) 모듈
휘Hwi
휘Hwi
여행, 사진, 개발, 책 이야기를 기록하는 여행자 휘의 블로그 𓂍
Klook.com
  • 휘Hwi
    휘: 끝나지 않은 이야기
    휘Hwi
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 기록
        • 일상 에세이
        • 인사이트
        • 투자와 재테크
        • 코인 이야기
        • 아카이빙
        • 집무실 레터
        • 사랑에 대하여
        • 번역 이야기(完)
        • 프리랜서 일지(完)
      • 여행
        • 🌎 세계 여행기 S1 (完)
        • 🌊 삼삼한 여행기 (完)
        • 🚶 온더로드
        • 🇯🇵 일본
        • 🏝️ 발리
        • 🇻🇳 베트남
        • 🇱🇰 스리랑카
        • 🇮🇳 인도
        • 🇹🇭 태국
        • 🇸🇬 싱가포르
        • 🇦🇺 호주
        • 🇭🇰 홍콩
        • 🇰🇷 한국
        • 🍚 여행자의 한 끼
        • ℹ️ 여행 정보
      • 사진
        • 사진가
        • 사진 이론과 생각
        • 사진 관련 정보
      • 영상
        • 파이널컷 모션 공부
        • 고프로 GoPro
        • 영상 관련 정보
      • 책
        • 책 읽고 쓰기
      • 개발
        • 티스토리
        • Internet
        • HTML
        • CSS
        • JavaScript
        • Typescript
        • React
        • Node.js
        • Express
        • NestJS
        • Python
        • Django
        • MySQL
        • MongoDB
        • AWS
        • Deployment
        • Terminal
        • Git
        • Glossaries
        • Articles
        • Projects
        • TIL;
      • 미분류
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
휘Hwi
NestJS 기초 (8) 미들웨어
상단으로

티스토리툴바