Etc/Node.js

[Node.js] 미들웨어란?

z.zzz 2023. 3. 27. 21:50

미들웨어란?

- 요청과 응답의 중간에 위치하며 클라이언트에게 요청이 오면 그 요청에 대한 응답을 보내기 위해 중간에서 목적에 맞게 처리를 해주는 함수들이다.

- req, res, next를 매개변수로 가지며, app.use나 app.get, app.post 등으로 장착한다.

- 에러 처리 미들웨어만 예외적으로 err, req, res, next를 가진다

미들웨어(middleware) 역할 / 출처 : simplilearn

 

미들웨어 사용법

- 특정한 주소의 요청에만 미들웨어가 실행되게 하려면 첫 번째 인수로 주소를 넣으면 된다.

- 다음 미들웨어로 넘어가려면 next 함수를 호출해야 한다.

- next를 호출하지 않는 미들웨어는 res.send나 res.sendFile 등의 메서드로 응답을 보내야 한다.

   - next도 호출하지 않고, 응답도 보내지 않으면 클라이언트는 하염없이 응답을 기다린다!

- 미들웨어 장착 순서에 따라 어떤 미들웨어는 실행되지 않을 수도 있다.

 

 

미들웨어의 next 함수

미들웨어의 next 함수에 인수를 넣으면 특수한 동작을 한다.

- next() : 다음 미들웨어로 이동한다.
- next('route') : 다음 라우터의 미들웨어로 이동한다.
- next(error) : 에러 처리 미들웨어로 이동한다.

 

 

미들웨어 간 데이터 전달 : res.locals

- 미들웨어 간에 데이터를 전달할 수도 있다.

- 요청이 끝날 때까지만 데이터를 유지하고 싶을 때, res.locals 객체에 데이터를 넣어두면 된다. (새로운 요청이 오면 객체는 초기화됨)

* req.session 객체에 데이터를 넣어도 되지만, 세션이 유지되는 동안에 데이터도 계속 유지된다는 단점이 있다.

* app.set으로도  데이터를 저장할 수 있지만 익스프레스에서 전역적으로 사용되므로 하나의 요청 안에서만 유지되어야 하는 값을 넣기에는 부적절하다.

 

 

미들웨어 확장법

- 미들웨어의 유용한 패턴으로 미들웨어 안에 미들웨어를 넣는 방식이다.

- 이 방식이 유용한 이유는 기존 미들웨어의 기능을 확장할 수 있기 때문이다.

- 아래 예제의 두 방식은 같은 기능을 하지만 두 번째 코드가 미들웨어의 기능을 확장해서 사용한 것을 확인할 수 있다.

app.use(morgan('dev'));
// 또는
app.use((req, res, next) => {
  morgan('dev')(req, res, next);
});

- 다음과 같이 분기 처리를 할 수도 있다.

app.use((req, res, next) => {
  if (process.env.NODE_ENV === 'production') {
    morgan('combined')(req, res, next);
  } else {
    morgan('dev')(req, res, next);
  }
});

 

 

더보기

해당 게시물은 Node.js 교과서를 참고하여 작성하였습니다.