[TIL] NestJS 공부 6일차

정인교·2021년 6월 9일
0

TIL(Today I Learned)

목록 보기
17/67
post-thumbnail

MiddleWare

MiddleWareController바로 전에 동작하는 함수다.
responserequest개체와 next()를 이용할 수 있다.
이 기능들은 응용프로그램의 요청 및 응답과 다음 미들웨어 함수를 next()에 담아 손쉽게 사용할 수 있게해준다.

자세하게 설명하진 않겠지만, express의 MiddleWare와 같기때문에 이해가 안간다면 express를 공부하는 것도 추천한다.

MiddleWare 생성

우선, src안에 MiddleWare라는 폴더를 만든 후, logger.middleware.ts를 생성하여 아래 코드를 작성하자.

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

위 코드를 보면 확인할 수 있는 점이, MiddleWare를 만들 때, class로 만들 경구, NestMiddlewareimplements해줘야한다.

의존성 주입

이게 가능하다면 항상 constructor를 이용하여 만들 수 있습니다.

MiddleWare 적용

@Module데코레이터에는 MiddleWare를 못넣으니, Module에서 configure메서드를 만들어서 사용할 수 있다.

import {
  Module,
  NestModule,
  RequestMethod,
  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({ path: "cats", method: RequestMethod.GET });
  }
}

forRoutes를 이용하여 path를 지정한 후, method까지 정해줄 수 있습니다. 그리고 위 코드에선 적용되지 않았지만, configure은 비동기 처리를 할 수 있습니다.

경로 와일드카드

와일드카드?라는 말을 처음 들어보고 이해를 못했지만, 계속 읽어보니 이해가됐다.
pathpath: 'ab*cd'이렇게 지정해준다면 abcd,ab_cd,abecd등 가운데가 비어있든, 특수문자, 문자 아무거나 들어가도 위 path에 들어가지는 개념입니다.

MiddleWare Consumer

헬퍼클래스로, 몇 가지 내장된 미들웨어를 관리해주는 메서드를 가지고있습니다. 이 메서드들은 간단하게 연결할 수 있습니다.
forRoutes() 메서드는 하나의 문자열, 다수의 문자열을, RouteInfo 객체는 컨트롤러 클래스, 심지어 다수의 컨트롤러 클래스들을 받을 수 있습니다. 쉼표로 구분하여 전달합니다.

함수형 MiddleWare

의존성이 없는 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();
  }
}

이런 코드를

export function logger(req, res, next) {
  console.log(`Request...`);
  next();
}

이렇게 바꿀 수 있습니다.
의존성이 없다면 이렇게 바꾸는 것이 좋습니다

다중 MiddleWare

여러 미들웨어를 바인딩할 때 콤마로 구분하여 리스트를 제공해주면된다.
아래는 apply()를 이용한 방법입니다.

consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);
profile
백엔드 개발자 정인교입니다!

0개의 댓글

관련 채용 정보