미들웨어

 

  • 미들웨어는 서버의 요청 ( Request ) - 응답 ( Response ) 과정에서 중간에 위치해 특정 기능을 수행하는 함수라고 볼 수 있다.
  • 예를 들어, 모든 요청에 대해 로그를 남기거나, 특정 사용자만 API를 접근하게 하고 싶을 경우에도 미들웨어를 사용한다.

 

Express.js의 미들웨어 

// 전역으로 미들웨어 등록
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
  • urlencoded : form-urlencoded 라는 규격의 body 데이터를 손쉽게 코드에서 사용할 수 있게 도와주는 미들웨어
  • json : JSON 규격의 body 데이터를 손쉽게 코드에서 사용할 수 있게 도와주는 미들웨어

 

Express.js에서 미들웨어 작성

app.use((req, res, next) => {
  // 필요한 코드
});

위 형태에서 req, res, next는 각자 역할을 지니고 있는 인자다

  • req : 요청 ( Request )에 대한 정보가 담겨있는 객체다. ( HTTP Headers, Query Parameters, URL 등 브라우저가 서버로 보내는 정보들이 담겨 있다. )
  • res : 응답 ( Response )을 위한 기능이 제공된다. ( 어떤 HTTP Status Code로 응답 할지, 어떤 데이터 형식으로 응답 할지, 헤더는 어떤 값을 넣어 응답 할지 다양한 기능을 제공한다. )
  • next : 다음 스택으로 정의된 미들웨어를 호출한다.

 

미들웨어 작성해보기

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()를 실행하지 않으면 다음 미들웨어는 실행되지 않는다.
  • 당연히 현재 미들웨어에서 응답을 보내는 경우, 즉 res.send() 나 res.json() 등의 메서드를 호출하는 경우 next()를 호출하면 안된다. 이렇게 하지 않으면 이미 요청이 종료된 상태에서 다른 미들웨어가 응답을 보내려고 해서 중복된 요청이 전달되는 문제가 발생한다.

 

라우터와 미들웨어 차이

  • 라우터와 미들웨어는 서로 다른 방식처럼 보이지만 라우터는 미들웨어 기반으로 구현된 객체라서 미들웨어와 동일한 방식으로 작동된다.
  • 라우터는 미들웨어 함수를 특정 경로에 바인딩하는 역할을 하고, 요청이 들어온 URL 경로에 따라 서로 다른 미들웨어를 실행시킬 수 있게 도와준다.
app.use(Middleware) : 모든 요청에서 미들웨어가 실행된다.
app.use('/api', Middleware) : /api로 시작하는 모든 요청에서 미들웨어를 실행한다.
app.post('/api', Middleware, (req,res)=>{}) : /api로 시작하는 POST 요청에서 미들웨어를 실행한다.

 

+ Recent posts