미들웨어란?nestjs에서 구현하기middleware 만들기클래스로 구현하기 (Class Middleware)함수로 구현하기 (Functional Middlware)middleware 적용하기NestModule 구현하기bootstrap()에서 미들웨어 등록하기
- nestjs 공식문서 : https://docs.nestjs.com/faq/request-lifecycle#middleware
미들웨어란?
작업의 중간에서 추가 작업을 진행시킨 뒤, 원래 해야할 동작으로 이어가는 것을 말한다.
따라서 미들웨어를 구현하면서 미들웨어에서 처리할 부분을 구현할 뒤에는 반드시
next()
를 호출하여 원래 해야할 동작을 이어갈 수 있도록 해줘야 한다.Request를 받아서, 미들웨어에서 추가 공정을 거친 후, next()를 통해 정식으로 request를 핸들링하는 곳으로 넘겨준다.
nestjs에서 구현하기
middleware 만들기
NestMiddleware
인터페이스를 implement
해서 클래스를 만들면 미들웨어가 된다.NestMiddleware 인터페이스에 정의된
use
메소드를 구현해야 한다.미들웨어는
Express
를 해봤다면 동일하다고 보면 된다.클래스로 구현하기 (Class Middleware)
DI 레포지토리 등 클래스의 기능들을 활용할 거라면 클래스로 구현해야 한다.
import { NestMiddleware } from '@nestjs/common'; import { NextFunction, Request, Response } from 'express'; export class JwtMiddleware implements NestMiddleware { use(req: Request, res: Response, next: NextFunction) { // 1. 미들웨어에서 할 일 정의 // 2. next() 호출하여 동작 이어가기 } }
함수로 구현하기 (Functional Middlware)
DI, 레포지토리 등 클래스의 기능들을 활용할 게 아니라면, 단순하게 함수로 정의해도 된다.
export const jwtMiddleware = ( req: Request, res: Response, next: NextFunction, ) => { // 1. 미들웨어에서 할 일 정의 // 2. next() 호출하여 동작 이어가기 };
middleware 적용하기
전체에서 이용하고 싶은가, 또는 특정 경로,상황에서만 사용하고 싶은가에 따라 구현 방법이 나뉠 수 있다.
NestModule 구현하기
미들웨어를 어떤 모듈에 적용시킬 건지를 명시해야 한다.
- 글로벌로 사용하고자 하는 미들웨어라면 app.module.ts의 모듈에 적용시켜주면 되며,
- 다른 특정 모듈에만 적용시키고 싶다면 그 모듈에서 설정해주면 된다.

적용시키고자 하는 모듈에
implements NestModule
로 인터페이스를 구현해주면 된다.configure
를 작성해야 하며 consumer
를 이용해서 어떤 미들웨어를 apply
할 건지 명시할 수 있다.또한 미들웨어를 동작시키기 위한 조건들도 명시할 수 있다.
forRoutes
: 여기에 해당하는 것들에만 미들웨어 동작
exclusive
: 여기에 해당하지 않는 것들에만 미들웨어 동작
// i.g. // '/api' 경로로 들어오는 모든 요청에 대해서는 미들웨어 생략 .exclusive({ path: '/api', method: RequestMethod.ALL })
bootstrap()
에서 미들웨어 등록하기

implements NestModule을 하지 않고
main.ts
파일에서 app.ues(미들웨어)
을 통해서도 미들웨어를 적용할 수 있다.- bootstrap()에서 적용시킨 미들웨어는 앱 전체에서 사용 가능하다.
bootstrap()
에서 app.use()로 미들웨어를 등록하려는 경우에는,
미들웨어가 반드시 함수형 이어야만 한다.