모듈과 미들웨어의 차이
1. 모듈과 미들웨어의 차이점
항목 | 모듈(Module) | 미들웨어(Middleware) |
역할 | 기능을 그룹화하여 관리 | 요청을 가로채어 특정 작업 수행 |
위치 | 애플리케이션 전체 구조의 일부 | 요청-응답 사이에서 실행 |
사용 목적 | 코드 구조화, 재사용성 향상, 의존성 관리 | 요청 전처리, 보안, 로깅, 데이터 변환 |
적용 대상 | 특정 기능과 관련된 컨트롤러 및 서비스 | 특정 요청(route) 또는 전체 요청 |
실행 시점 | 애플리케이션 실행 시 | 요청이 컨트롤러에 도달하기 전 |
📌언제 모듈과 미들웨어를 사용할까?
모듈: 기능을 그룹화하고, 유지보수 및 확장성을 고려할 때 사용
모듈은 NestJS 애플리케이션의 구조를 모듈화하여 유지보수성과 확장성을 높임
미들웨어: 요청을 가로채어 공통 작업(전처리, 보안, 로깅, 인증, 데이터 변환 및 검증 등)을 수행할 때 사용
2. 모듈(Module)
📌 개념
NestJS의 핵심 아키텍처 단위로, 관련된 기능(컨트롤러, 서비스, 프로바이더 등)을 그룹화하는 역할을 합니다.
각 모듈은 @Module() 데코레이터를 사용하여 정의됩니다.
모듈은 NestJS 애플리케이션을 모놀리식이 아닌 모듈화된 구조로 만들 수 있도록 도와줍니다.
🔹 하는 일
◇ 관련된 기능을 그룹화
예: UserModule, AuthModule, ProductModule 등
◇ 의존성 관리
하나의 모듈이 다른 모듈의 서비스나 리소스를 사용할 수 있도록 설정 (imports, providers 속성 활용)
- 애플리케이션의 확장성을 높임
모듈을 독립적으로 관리할 수 있어 유지보수가 용이
- 모듈 간의 의존성 주입
특정 모듈에서 제공하는 서비스(예: AuthService)를 다른 모듈에서도 쉽게 사용 가능 (exports 속성 활용)
🔹 예제
import { Module } from '@nestjs/common'; // NestJS의 @Module 데코레이터(NestJS에서 모듈을 정의)를 가져옴.
import { UserService } from './user.service'; // 유저 관련 로직을 처리하는 서비스(UserService)를 가져옴.
import { UserController } from './user.controller'; // 유저 관련 API 요청을 처리하는 컨트롤러(UserController)를 가져옴.
@Module({
// 이 모듈에서 사용할 컨트롤러를 등록.
// UserController는 클라이언트의 요청을 처리하는 역할을 함.
controllers: [UserController],
// 이 모듈에서 사용할 서비스(비즈니스 로직)를 등록.
// UserService는 데이터 처리 및 로직을 담당함.
providers: [UserService],
// 다른 모듈에서도 UserService를 사용할 수 있도록 내보냄.
exports: [UserService],
})
// UserModule을 정의하고 export
export class UserModule {}
2. 미들웨어(Middleware)
📌 개념
NestJS의 요청-응답 사이에서 실행되는 함수로, 요청(Request)이 컨트롤러에 도달하기 전에 특정 작업을 수행합니다.
Express의 미들웨어와 비슷한 개념이며, @MiddlewareConsumer를 사용하여 특정 경로에 적용할 수 있습니다.
🔹 하는 일
◇ 요청 로깅
모든 요청을 기록하여 디버깅 및 모니터링 가능
◇ 인증 및 권한 검사
특정 API에 접근하는 사용자 권한 체크
◇ 데이터 변환 및 검사
예: 요청의 데이터를 JSON 형식으로 변환하거나, 입력값 검증
◇ CORS 설정
Cross-Origin Resource Sharing(교차 출처 리소스 공유) 설정 가능
◇ 요청 전처리
특정 경로에 대해 사전 작업 수행 가능 (예: 캐싱, 요청 수정)
🔹 예제
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(`[${req.method}] ${req.url}`);
next(); // 다음 미들웨어로 이동
}
}
📌 미들웨어 적용 방법
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { LoggerMiddleware } from './logger.middleware';
@Module({})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes('*'); // 모든 경로에 적용
}
}
참고
https://jinbroing.tistory.com/126