NestJS Middleware

Gyus·2022년 8월 23일
0

Middleware


미들웨어는 클라이언트 사이드에서 요청한 Http Request 에서 Router Handler 로 가기 전에 기능을 공통화 하여 사용하거나 처리하게 할 수 있는데 그 이후 next 라는 함수를 호출해서 다음 작업이 진행 될 수 있게 합니다.

클라이언트로 부터 들어온 Request 에서 Response 과정의 전체 라이프 사이클에서 next 라는 함수를 통해 특정 함수를 실행하고 처리할 수 있습니다.

우선 Middleware를 만들기 위해 NestMiddleware 코드를 보겠습니다.

export interface NestMiddleware<TRequest = any, TResponse = any> {
    use(req: TRequest, res: TResponse, next: () => void): any;
}
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log(req.ip);
    next();
  }
}

NestMiddleware 를 implements 하여 정의된 use 함수를 LoggerMiddleware 에서 구현했습니다.
위의 미들웨어의 기능으로 단순하게 console.log 를 통해 어떤식으로 작동이 되는지 로그를 찍었고 use 함수의 첫 번째 파라미터인 any 타입으로 된 req 객체를 로깅해보는 역할이며,
req 는 HttpRequest 타입으로 정의할 수 있습니다.
로깅을 한 이후에 next() 를 하지 않는다면 Response 가 되지 않는 상태로 아마 클라이언트 쪽에서는 타임아웃이 발생할 때까지 hang이 걸릴 것입니다.
LoggerMiddleware 를 Injectable 데코레이터로 디펜던시로 사용하고 LoggerMiddleware 를 아래 AppModule 에서 NestModule 을 implement 하여 configure 를 통해 MiddlewareConsumer 객체를 통해 apply 시키도록 하겠습니다.

export class AppModule {
  configure(consumer: MiddlewareConsumer): any {
    consumer.apply(LoggerMiddleware).forRoutes('*');
  }
}

이런식으로 모든 api에 로그를 보여줄 수 있다.

export class AppModule {
  configure(consumer: MiddlewareConsumer): any {
    consumer
          **.exclude({path:'user/list', method:RequestMethod.GET})**
    .apply(LoggerMiddleware)
    .forRoutes('*');
  }
}

exclude를 사용해서 특정 api를 제외하고 로그를 남겨줄수 있다.

profile
푸로구래머

0개의 댓글