req -> middleware -> app -> middleware -> res
미들웨어를 통해 웹 서버의 요청/응답에 대해 공통적으로 관리가 가능합니다.
예를 들어, 모든 요청에 대해서 로그를 남겨 확인하고 싶은 경우처럼 말이죠.
이 외에도 승인된 사용자만 API를 접근할 수 있게 만들고 싶을때도 해당 될 수 있습니다.
이런 기능적인 부분 외에도 아주 기본적인 미들웨어로, 브라우저가 보낸 데이터를 우리가 쉽게 사용할 수 있게 바꿔주는 미들웨어도 존재합니다.
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
form-urlencoded
라는 규격의 body 데이터를 손쉽게 코드에서 사용할 수 있게 도와주는 미들웨어에요!JSON
이라는 규격의 body 데이터를 손쉽게 코드에서 사용할 수 있게 도와주는 미들웨어에요!
req
: 요청(Request)에 대한 정보가 담겨있는 객체입니다.
- HTTP Headers, Query Parameters, URL 등 브라우저가 서버로 보내는 정보들이 담겨있습니다.
res
: 응답(Response)을 위한 기능이 제공됩니다.
- 어떤 HTTP Status Code로 응답 할지, 어떤 데이터 형식으로 응답 할지, 헤더는 어떤 값을 넣어 응답 할지 다양한 기능을 제공합니다.
next
: 다음 스택으로 정의된 미들웨어를 호출합니다.
Request 로그 남기는 미들웨어 작성
// bodyparser와 router사이에 작성
app.use((req, res, next) => {
console.log('Request URL:', req.originalUrl, ' - ', new Date());
next();
});
첫번째 미들웨어부터 순차적으로 진입하게 됩니다.
app.use((req, res, next) => {
console.log('첫번째 미들웨어');
next();
});
app.use((req, res, next) => {
console.log('두번째 미들웨어');
next();
});
app.use((req, res, next) => {
console.log('세번째 미들웨어');
next();
});
// print: 첫번째 미들웨어
// print: 두번째 미들웨어
// print: 세번째 미들웨어
- 위와같은 그림처럼 순차적으로 미들웨어를 통과하고 중간에 응답을해서 종료가 되거나 다음 미들웨어로 넘어가서 터미널에 첫번째 미들웨어라는 로그부터 차례대로 세번째 미들웨어라는 로그가 쓰여진걸 확인 할 수 있습니다.
- 하지만 중간에 미들웨어에
next()
가 실행되지 않으면 다음 미들웨어는 실행되지 않습니다.
Router와 미들웨어는 서로 다른 방식처럼 보이지만 Router는 미들웨어 기반으로 구현된 객체이므로 미들웨어와 동일한 방식으로 작동됩니다.
app.use(Middleware)
: 모든 요청에서 미들웨어가 실행된다.
app.use(’/api’, Middleware)
: api로 시작하는 요청에서 미들웨어를 실행한다.
app.post(’/api’, Middleware)
: api로 시작하는 POST 요청에서 미들웨어를 실행한다.