본문 바로가기

[NestJS]

[NestJS] - 7편 (미들웨어)

반응형

NestJS - 7편 (미들웨어)

미들웨어란?

라우트 핸들러가 클라이언트의 요청을 처리하기 전에 수행되는 컴포넌트

주로 아래의 작업들을 수행한다.

  • 쿠키 파싱: 쿠키를 파싱하여 사용하기 쉬운 데이터 구조로 변경합니다. 이를 이용하면 라우터 핸들러가 매번 쿠키를 파싱할 필요가 없습니다.
  • 세션 관리: 세션 쿠키를 찾고, 해당 쿠키에 대한 세션의 상태를 조회해서 요청에 세션 정보를 추가합니다. 이를 통해 다른 핸들러가 세션 객체를 이용할 수 있도록 해 줍니다.
  • 인증/인가: 사용자가 서비스에 접근 가능한 권한이 있는지 확인합니다. 단, Nest는 인가를 구현할 때 가드(Guard)를 이용하도록 권장하고 있습니다.
  • 본문(body) 파싱: 본문은 POST/PUT 요청으로 들어오는 json 타입뿐 아니라 파일 스트림과 같은 데이터도 있습니다. 이 데이터를 유형에 따라 읽고 해석한 다음 파라미터에 넣는 작업을 합니다. 앞서 컨트롤러 장에서 보았던 본문은 이렇게 분석된 결과가 포함되어 있습니다.

모듈에서 미들웨어 사용하기

들어온 요청에 포함된 정보를 로깅하는 Logger를 미들웨어로 구현해보자

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

app.module.ts파일

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

@Module({
  imports: [UsersModule],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer): any {
    consumer
      .apply(LoggerMiddleware)
      .exclude({path:'user/list', method: RequestMethod.GET})  //이 url에 대해서는 Middleware 사용 제외
      .forRoutes('/users');
  }
}

/users로 들어오는 요청시 콘솔에 로그가 찍히는 걸 볼 수 있고
/user/list로 들어오는 요청시 콘솔에 로그가 찍히지 않는 걸 볼 수있다.
또 다른 미들웨어를 사용하려면 apply(LoggerMiddleware, AnotherMiddlerware)등으로 ,로 구분해 사용하면된다.

전역으로 미들웨어 사용하기

src/logger3/logger3.middleware 원하는곳에 해도 상관없음~

import { Request, Response, NextFunction } from 'express';

export function logger3(req: Request, res: Response, next: NextFunction) {
  console.log(`Request3...`);
  next();
};

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

참조 : NestJS로 배우는 백엔드 프로그래밍

반응형