JavaScript/js 문법

모듈과 미들웨어의 차이

GREEN나무 2025. 2. 1. 13:25
728x90

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