티스토리 뷰

미들웨어란

미들웨어란 특정한 역할을 하는 함수 이다.
request와 response객체에 접근이 가능하여 요청-응답 사이클 도중 그 다음 함수에 대한 접근 권한을 갖는다.
더 간단하게 설명하면 클라이언트로 부터 온 요청을 처리하기 위해 응답을 보내기 전 중간(미들) 지점에서 특정한 로직을 처리하는 함수라고 할 수 있다.

예를들어, 유저 권한이 필요한 요청이 있다고 하자. 미들웨어는 그 요청을 처리하기 전에 미리 권한을 검증하는 미들웨어를 호출하여 검증된 요청에 대해서만 응답을 내려줄 수 있다.

Nest 미들웨어

Nest 미들웨어는 기본적으로 express미들웨어와 유사하다.
(req, res, next) 라는 인자를 받아 특정한 로직을 수행하고 next() 함수를 호출하면 다음 함수가 실행된다. 미들웨어가 하는 기능을 요약하면 다음과 같다. (feat. 구글번역)

미들웨어 기능은 다음 작업을 수행할 수 있습니다.
- 모든 코드를 실행합니다.
- 요청 및 응답 개체를 변경합니다.
- 요청-응답 주기를 종료합니다.
- 스택의 다음 미들웨어 함수를 호출합니다.
- 현재 미들웨어 함수가 요청-응답 주기를 종료하지 않으면 next()다음 미들웨어 함수에 제어를 전달하기 위해 호출해야 합니다 . 그렇지 않으면 요청이 중단됩니다.

네스트 미들웨어는 @Injectable() 데코레이터와 함께 사용이 가능하다.
Injectable 하기에 모듈내에서 의존성 주입이 가능하다. 그리고 미들웨어를 생성할 때는 다음과 같이 @nestjs/common 에 있는 NestMiddleware 인터페이스를 구현해야 한다.

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();
  }
}

위 미들웨어는 단순히 로그를 찍는 함수이다. 자신의 역할을 다 한후에는 next() 를 호출해야 한다.

미들웨어 주입

모듈 내에서 미들웨어를 주입하는 방법은 @Module() 데코레이터의 인자로 넘겨주는 것이 아닌 모듈 클래스 내의 configure() 함수를 통해 가능하다. 이 때 모듈 클래스는 NestModule 인터페이스를 구현해야 한다.

모듈을 만들어 미들웨어를 주입한 예시는 다음과 같다.

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './common/middleware/logger.middleware';
import { CatsModule } from './cats/cats.module';

@Module({
  imports: [CatsModule],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes('cats');
  }
}

이 예시는 AppModule/cats route에 대해 미들웨어를 적용한 모습이다.

추가적으로 특정한 요청에 대해서만 미들웨어를 적용하는 규칙을 적용할 수도 있다.

configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes({ path: 'cats', method: RequestMethod.GET });
  }

이렇게하면 /cats 경로의 GET 메소드에 대해서만 미들웨어가 적용된다.

코드를 보면 consumer라는게 눈에 보인다.
MiddlewareConsumer 는 네스트에서 제공하는 helper class로 미들웨어를 관리하기 위한 메소드를 제공한다.

위와 같이 특정 경로에 대해서 미들웨어를 적용할 수 있지만, 일반적으로는 컨트롤러를 넘겨준다.

configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes(CatsController);
  }

컴마로 구분하여 컨트롤러를 여러개 넘겨주는 것도 가능하다.

특정 Route에 대해 미들웨어를 적용하지 않는 exclude() 함수도 존재하며 하나의 모듈에 여러개의 미들웨어를 적용하는 것도 가능하다. 이렇게 하면 된다.

consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);

만약, 전역 미들웨러를 적용하고 싶다면 main.ts 파일에서 app.use(middleware) 로 적용하면 된다.

더 자세한 설명은 nest.js 공식문서 를 참고하면 좋을 것 같다.

'Nest.js' 카테고리의 다른 글

[Nest.js] 커스텀 데코레이터 만들기(Custom Decorators)  (0) 2022.01.06
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함