본문 바로가기
Study/WEB

[Node.js] MiddleWare 작동 과정

by Becoming a Hacker 2022. 12. 6.
반응형

Middleware란 Request와 Response의 중간에 위치하며 여러 가지 행위(Request 및 Response 조작, Request Drop)를 할 수 있습니다.

 

Node.js에서는 여러 가지 방법이 있을 수 있지만, app.use를 이용한 기본적인 방법에 대하여 포스팅 하도록 하겠습니다.

 

예제 환경 구성하기

1. 저는 NestJS(Node.js 기반)를 이용하여 예제 환경을 구성하였는데요. 아래의 명령어를 통하여 설치 가능합니다.

$ npm i -g @nestjs/cli
$ nest new project-name

2. 소스 코드 수정 후 아래의 명령어를 이용하여 애플리케이션을 실행할 수 있습니다.

$ npm run start

 

Middleware (미들웨어)

Node.js에서 Middleware는 app.use를 이용하여 매우 간편하게 구현할 수 있습니다.

(.get의 경우 다른 HTTP Method로 대체될 수 있음)

  • app.use(Middleware)
  • app.use(Path, Middleware)
  • app.get(Middleware)
  • app.get(Path, Middleware)

main.ts

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.use((req, res, next)=>{
    console.log("1");
    next();
  })
}
bootstrap();

 

 

그리고 각각의 사용 방법에 따라 Middleware가 실행되는 조건이 달라집니다.

구분 설명
app.use(Middleware) 모든 요청에 대하여 Middleware 실행
app.use(Path, Middleware) Path 경로로 전송된 모든 요청에 대하여 Middleware 실행
app.get(Middleware) GET Method로 전송된 모든 요청에 대하여 Middleware 실행
app.get(Path, Middleware) GET Method를 이용하여 Path 경로로 전송된 모든 요청에 대하여 Middleware 실행

 

만약 아래와 같이 동일한 경로 또는 방법으로 사용된 Middleware가 존재한다면, 상단에 있는 Middleware가 먼저 실행되고 하단에 있는 Middleware가 나중에 실행됩니다.

main.ts

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.use((req, res, next)=>{
    console.log("1");
    next();
  })
  
  app.use((req, res, next)=>{
    console.log("2")
    next()
  })
}
bootstrap();

/*
Request : GET /  
Console :
1
2
*/

 

그리고 next의 호출 여부에 따라 다음 Middleware 실행 여부가 결정됩니다. 아래 코드는 "/" 경로에 대한 Middleware에서 next() 함수를 호출하고 있지 않아 "GET /222"로 접근 시 Console.log에 /222가 찍히지 않습니다.

main.ts

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.use((req, res, next)=>{
    console.log("1");
    next()
  })

  app.use((req, res, next)=>{
    console.log("2")
    next()
  })

  app.use("/",(req, res, next)=>{
    console.log("/")
  })

  app.use("/123",(req, res, next)=>{
    console.log("/123")
    next()
  })

  app.use("/222",(req, res, next)=>{
    console.log("/222")
    next()
  })
  await app.listen(3000);
}
bootstrap();

/*
Request : GET /222
Console :
1
2
/
*/

댓글