MiddleWare

장현욱(Artlogy)·2022년 11월 14일
0

Nest.js

목록 보기
9/18
post-thumbnail
post-custom-banner

개념


일반적으로 미들웨어는 라우트 핸들러가 요청을 처리하기 전에 수행되는 컴포넌트를 뜻한다.
물론 응답을 클라이언트에 보내기 전에 처리 할 수도 있다.

  • 어떤 형태의 코드라도 수행할 수 있다.
  • 요청과 응답에 변형을 가할 수 있다.
  • 요청-응답 주기를 끝낼 수 있다.
  • 여러개의 미들웨어를 사용한다면 순서가 존재하며 next()를 호출하여 다음 미들웨어에게 제어권을 전달한다.

요청-주기를 끝낸다는 말은 next()를 통해 응답 또는 요청을 처리해야 한다는 뜻이다.
만약 미들웨어에서 제어권을 넘기지 않고 끝낼경우 Hanging상태가 된다.

미들웨어를 통해선 주로 다음과 같은 작업을 한다.

  • 쿠키 파싱: 쿠키를 파싱하여 사용하기 쉬운 데이터 구조로 변경한다.
  • 세션 관리: 세션 쿠키를 조회해서 세션정보를 쓰기 쉬운 상태로 추가해준다.
  • 인증/인가: 서비스 접근 권한을 확인한다. Nest에선 Guard를 권장한다.
  • 로그 : 요청/반환이 있을때마다 로그를 저장할 수 있다.

위 작업말고도 필요한게 있다면 직접구현해보면 된다.


사용하기

미들웨어는 함수로 작성하거나 NestMiddleware 인터페이스를 구현한 클래스로 작성이 가능하다.
예제

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

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log('req:', req);
    console.log('res:', req);
    next();
  }
}

정말 간단한 형태의 미들웨어이다.
이제 등록을 해보자.

적용

기본형태

app.module.ts

...
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes('account');
  }
}

/account로 시작하는 라우터에서 LoggerMiddleware를 적용했다.

method type

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    .forRoutes({ path: 'account', method: RequestMethod.GET });
  }
}

wildcards

forRoutes({ path: 'ab*cd', method: RequestMethod.ALL });

exclude

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .exclude({ path: 'cats', method: RequestMethod.GET }, { path: 'cats', method: RequestMethod.POST }, 'cats/(.*)')
      .forRoutes(CatsController)
  }
}

제외하고 싶은 경로가 있다면 위 처럼 exclude를 사용하면된다.

여러개의 미들웨어

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

전역 미들웨어

main.ts

import { logger3 } from './logger3/logger3.middleware';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(logger3);
  await app.listen(3000);
}
bootstrap();

부트스트랩단에서 app.use로 등록만해주면된다.

지금까지 만든 라우터론 미들웨어로 크게 뭐 해볼게없다
다음 챕터인 Guard에서 요청을 라우터에 보내기전에 인증/인가하는 미들웨어를 만들어볼것이다.

post-custom-banner

0개의 댓글