프로그래밍/Nest.js

비동기 미들웨어 심화: Nest.js에서의 활용과 중요성

shimdh 2025. 3. 25. 10:12
728x90

비동기 미들웨어는 현대 웹 애플리케이션에서 필수적인 요소로 자리 잡고 있습니다. 특히 Nest.js와 같은 프레임워크에서 비동기 미들웨어는 요청 처리 과정에서 중요한 역할을 하며, 애플리케이션의 성능과 유연성을 높이는 데 기여합니다. 이번 포스트에서는 비동기 미들웨어의 개념, 필요성, 구현 방법 및 사용 사례에 대해 심도 있게 살펴보겠습니다.

비동기 미들웨어의 개념

미들웨어란?

미들웨어는 HTTP 요청이 서버에 도달하기 전에 또는 응답이 클라이언트로 전송되기 전에 실행되는 함수입니다. 이 함수는 요청의 흐름을 제어하고 필요한 처리를 수행하는 역할을 합니다. 미들웨어는 다음과 같은 다양한 기능을 수행할 수 있습니다:

  • 요청의 유효성 검사
  • 로그 기록
  • 요청에 대한 추가 정보 첨부

비동기 처리

JavaScript에서 비동기는 코드가 실행되는 동안 다른 작업이 동시에 진행될 수 있도록 해줍니다. 이는 I/O 작업이나 네트워크 요청 등 시간이 걸리는 작업을 효율적으로 처리할 수 있게 해주며, 사용자에게 더 빠르고 원활한 경험을 제공합니다.

비동기 미들웨어가 필요한 이유

비동기 미들웨어는 다음과 같은 경우에 특히 유용합니다:

  1. 데이터베이스 쿼리: 시간이 많이 소요되는 작업을 사전에 완료하여 요청 처리 시간을 단축할 수 있습니다.
  2. 외부 API 호출: 비동기 처리를 통해 다른 요청이 대기하는 동안에도 원활하게 작업을 진행할 수 있습니다.
  3. 인증 및 권한 부여: 추가적인 검증이 필요할 때, 비동기 미들웨어를 사용하여 필요한 정보를 미리 가져오고 검증할 수 있습니다.

비동기 미들웨어 구현 예시

Nest.js에서 비동기 미들웨어를 구현하는 방법은 다음과 같습니다:

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class AsyncMiddleware implements NestMiddleware {
  async use(req: Request, res: Response, next: NextFunction) {
    try {
      const user = await this.findUserById(req.params.id);
      if (!user) {
        return res.status(404).send('User not found');
      }
      req.user = user; // 사용자 정보를 요청 객체에 첨부
      next();
    } catch (error) {
      console.error(error);
      res.status(500).send('Internal Server Error');
    }
  }

  private async findUserById(id: string): Promise<any> {
    return new Promise((resolve) => {
      setTimeout(() => resolve({ id, name: 'John Doe' }), 1000);
    });
  }
}

위 코드에서는 AsyncMiddleware라는 이름의 클래스를 정의하고 있습니다. 이 클래스는 사용자의 ID를 기반으로 데이터를 가져오는 과정을 포함하고 있으며, 이 과정은 비동기로 실행됩니다. 이를 통해 요청이 들어올 때마다 사용자 정보를 효율적으로 조회하고, 필요한 경우 적절한 오류 처리를 수행할 수 있습니다.

비동기 미들웨어 사용 방법

비동기 미들웨어를 적용하려면 모듈 파일 내에서 설정해주어야 합니다:

import { Module, MiddlewareConsumer } from '@nestjs/common';
import { UsersController } from './users.controller';
import { AsyncMiddleware } from './async.middleware';

@Module({
  controllers: [UsersController],
})
export class UsersModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(AsyncMiddleware).forRoutes(UsersController);
  }
}

위 코드는 UsersModule 내에서 AsyncMiddleware를 특정 라우터(UsersController)에 적용하는 방법을 보여줍니다. 이를 통해 해당 컨트롤러에 대한 모든 요청에 대해 비동기 미들웨어가 자동으로 실행되며, 사용자 정보를 미리 가져오는 등의 작업을 수행할 수 있습니다.

결론

비동기 미들웨어는 Nest.js 애플리케이션의 성능과 유연성을 높이는 데 매우 중요합니다. 이를 통해 개발자는 다양한 요구 사항에 맞춰 복잡한 로직을 손쉽게 관리할 수 있으며, 사용자 경험 또한 향상될 것입니다. 비동기 미들웨어를 적절히 활용함으로써 애플리케이션의 응답 속도를 개선하고, 사용자에게 더 나은 서비스를 제공할 수 있는 기회를 얻게 됩니다.

728x90