요청과 응답 사이의 마법

Middleware는 요청(Request)과 응답(Response) 사이에서 실행되는 함수입니다.

일반적으로 HTTP 요청을 가로채고, 요청을 처리하기 전에 추가 작업을
수행할 수 있도록 도와줍니다.

이는 Express.js의 미들웨어 개념과 유사하며, 요청/응답 흐름의 중간에 위치하여
다양한 작업을 처리할 수 있습니다.

Middleware로 할 수 있는 작업

Middleware는 다음과 같은 작업에 유용합니다

  • 로그 작성: 요청에 대한 로그를 남기거나 요청 정보를 출력할 수 있습니다.
  • 인증 및 권한 부여: 사용자가 인증되었는지 또는 요청에 적합한 권한이 있는지 확인할 수 있습니다.
  • 요청 데이터 변환: 요청의 데이터를 가공하거나 수정할 수 있습니다.
  • 캐싱: 요청 결과를 캐싱하여 성능을 최적화할 수 있습니다.
  • 에러 처리: 요청 처리 중 발생한 에러를 처리하거나 로그를 남길 수 있습니다.

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()를 호출해 요청을 다음 단계로 넘기는 역할을 합니다.

Middleware 적용 방법

미들웨어를 적용하려면 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('*');          // 모든 경로에 대해 미들웨어가 적용됩니다.
  }
}

특정 경로에만 Middleware 적용하기

특정 경로 또는 컨트롤러에만 미들웨어를 적용할 수도 있습니다.
예를 들어 /users 경로에만 미들웨어를 적용하고 싶다면

consumer
  .apply(LoggerMiddleware)
  .forRoutes('users');  // '/users' 경로에만 미들웨어가 적용됩니다.

또는 특정 컨트롤러에만 미들웨어를 적용할 수도 있습니다

import { UsersController } from './users/users.controller';

consumer
  .apply(LoggerMiddleware)
  .forRoutes(UsersController);  // UsersController에만 미들웨어가 적용됩니다.

함수형 Middleware 선언

클래스 대신 함수 형태로도 미들웨어를 작성할 수 있습니다.

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에서 미들웨어를 사용하여 요청 흐름을 제어하고
원하는 작업을 수행할 수 있습니다.

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글