Middleware 란?
Middleware는 클라이언트로부터 오는 요청을 서버가 처리하고 응답하기 전에 특정 로직을 실행할 수 있도록 하는 함수입니다.
요청과 응답 사이의 중간에서 작동한다하며 미들웨어라고 불리며 Nestjs를 비롯한 많은 웹 프레임워크에서 Middleware를 통해 로깅, 인증 검사, 요청 데이터의 파싱 등과 같은 태스크를 처리합니다.
기본적으로 Express의 Middleware와 동일한 동작을 수행합니다.
Middleware 실행 흐름
Middleware는 클라이언트로 부터 받은 HTTP 요청이 Controller에 도착하기 전 즉 라우터 핸들러에 도달하기 전에 동작합니다.
해당 요청은 구성된 Middleware를 순서대로 거치게 되며 각 Middleware는 요청을 분석하고 해당 Middleware의 작업을 수행합니다.
Middleware의 작업이 완료되면 next() 함수를 호출하여 다음 Middleware로 요청을 넘깁니다.
만약 Middleware에서 응답을 직접 전송하고 next()를 호출하지 않으면 응답이 종료됩니다.
최종적으로 Middleware가 모든 요청을 처리한 후 라우터 핸들러에 도달하여 비즈니스 로직을 처리하게 됩니다.

Middleware 사용하기
Middleware는 NestMiddleware 인터페이스를 구현하는 클래스로 정의되며 use 메서드 내부에 로직을 구현하여 요청과 응답을 조작합니다.
// logger.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
// use 메소드는 모든 미들웨어에서 필수적으로 구현해야 하는 메소드
// 요청과 응답을 조작하는 로직을 작성
use(req: Request, res: Response, next: NextFunction) {
console.log('미들웨어에서 요청 처리하는 중!');
next(); // 요청을 넘기는 함수. 해당 함수가 없으면 요청 종료
}
}
// app.module.ts
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { LoggerMiddleware } from './middleware/logger.middleware';
// 이 클래스를 Nestjs 모듈로 선언하는 데코레이터
@Module({
imports: [], // 해당 모듈에서 사용할 다른 모듈을 나열
controllers: [AppController], // 해당 모듈이 인식해야하는 컨트롤러를 나열
providers: [AppService], // 해당 모듈에서 사용할 서비스를 나열
})
// NestModule 인터페이스를 구현하여 미들웨어를 적용
export class AppModule implements NestModule {
// consumer는 미들웨어를 적용할 컨트롤러를 나타내는 객체
configure(consumer: MiddlewareConsumer) {
// 와일드 카드를 적용하여 모든 경로에 LoggerMiddleware를 적용
consumer.apply(LoggerMiddleware).forRoutes('*');
}
}
// app.controller.ts
import {
Controller,
Get,
Req,
} from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get('/logger-middleware-test')
loggerMiddlewareTest(): void {
console.log('미들웨어 통과 하고 비즈니스 로직 수행 중!');
return console.log('비즈니스 로직 수행 완료!');
}
}
결과
Middleware를 거쳐 비즈니스 로직을 처리하고 결과를 반환

Nodejs의 Expressjs를 활용하여 웹 페이지를 구축할때 로그인 검증, 유지 부분에서 Middleware를 많이 사용하였습니다.
말 그대로 Middleware이기 때문에 라우터 핸들러에 도착하고 Middleware를 거쳐 다음 함수로 요청을 전달한다고만 생각했는데 이런 식으로 동작하는지는 처음 알았습니다.
구조와 흐름에 대한 이해가 조금씩 되다보니 디버깅하는데 확실히 도움이 될거 같습니다.
'Nestjs' 카테고리의 다른 글
| [NestJs] Repository 패턴 사용해보기 (0) | 2024.03.20 |
|---|---|
| [NestJs] TypeORM 연결하기 (3) | 2024.03.18 |
| [NestJs] Interceptors 알아보기 (0) | 2024.03.14 |
| [NestJs] Guards 알아보기 (0) | 2024.03.13 |
| [NestJs] Pipes 알아보기 (1) | 2024.03.12 |