본문 바로가기
JavaScript/js 문법

모듈과 미들웨어의 차이

by GREEN나무 2025. 2. 1.
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

 

 

 

 

 

'JavaScript > js 문법' 카테고리의 다른 글

NestJS - IsDate() vs @IsDateString()  (0) 2025.02.13
NestJS 파일 생성  (0) 2025.02.13
nestjs, api테스트 swagger  (0) 2025.01.27
정규식 테스트  (1) 2024.12.17
프리즈마(정리하기)  (0) 2024.12.05