Middleware는 요청(Request)과 응답(Response) 사이에서 실행되는 함수입니다.
일반적으로 HTTP 요청을 가로채고, 요청을 처리하기 전에 추가 작업을
수행할 수 있도록 도와줍니다.
이는 Express.js의 미들웨어 개념과 유사하며, 요청/응답 흐름의 중간에 위치하여
다양한 작업을 처리할 수 있습니다.
Middleware는 다음과 같은 작업에 유용합니다
Nest.js에서 Middleware는 클래스 또는 함수 형태로 선언할 수 있습니다.
클래스 기반으로 선언하는 예시는 다음과 같습니다.
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(); // 요청을 다음 미들웨어 또는 컨트롤러로 넘깁니다.
}
}
위 코드에서 LoggerMiddleware는 요청이 들어오면 로그를 출력하고,
next()를 호출해 요청을 다음 단계로 넘기는 역할을 합니다.
미들웨어를 적용하려면 Module에 미들웨어를 등록해야 합니다.
이를 위해 configure 메서드를 사용합니다.
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './logger.middleware';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware) // LoggerMiddleware를 적용합니다.
.forRoutes('*'); // 모든 경로에 대해 미들웨어가 적용됩니다.
}
}
특정 경로 또는 컨트롤러에만 미들웨어를 적용할 수도 있습니다.
예를 들어 /users 경로에만 미들웨어를 적용하고 싶다면
consumer
.apply(LoggerMiddleware)
.forRoutes('users'); // '/users' 경로에만 미들웨어가 적용됩니다.
또는 특정 컨트롤러에만 미들웨어를 적용할 수도 있습니다
import { UsersController } from './users/users.controller';
consumer
.apply(LoggerMiddleware)
.forRoutes(UsersController); // UsersController에만 미들웨어가 적용됩니다.
클래스 대신 함수 형태로도 미들웨어를 작성할 수 있습니다.
import { Request, Response, NextFunction } from 'express';
export function logger(req: Request, res: Response, next: NextFunction) {
console.log(`Request...`);
next();
}
이 함수형 미들웨어도 동일하게 configure 메서드에서 등록할 수 있습니다.
consumer
.apply(logger)
.forRoutes('*');
Middleware는 요청과 응답 사이에서 실행되는 함수로,
요청을 가로채 다양한 작업을 처리할 수 있습니다.
클래스 또는 함수 형태로 선언 가능합니다.
apply 메서드를 통해 특정 경로 또는 컨트롤러에 미들웨어를 적용할수있습니다.
next() 함수를 호출하여 요청을 다음 미들웨어 또는 컨트롤러로 넘김니다.
이렇게 Nest.js에서 미들웨어를 사용하여 요청 흐름을 제어하고
원하는 작업을 수행할 수 있습니다.