미들웨어는 요청 오브젝트(req), 응답 오브젝트(res), 그리고 어플리케이션의 요청-응답 주기 사이에서 처리를 담당하고 있는 함수이다. 미들웨어는 자신의 처리를 마친 후, 다음 미들웨어에 처리를 위임할 수 있는데 next() 메소드를 통해 해당 처리가 가능하다.


미들웨어의 특징

미들웨어 함수는 다음과 같은 태스크를 수행할 수 있다.

  • 모든 코드를 실행 가능
  • 요청 및 응답 오브젝트에 접근 및 수정 실행
  • 요청-응답 주기를 임의 종료
  • 스택 내의 등록된 다음 미들웨어 호출(next 메소드)

미들웨어는 로깅, 통합 인증, 보안 등 공통적으로 수행되어야 하는 프로세스에 주로 적용된다. 요청 - 응답 주기에 무조건 거치는 단계가 되기 때문이다.


미들웨어 기초 코딩

미들웨어는 app.use() 메소드를 통해 정의할 수 있다.

메소드 인자로는 마운트 경로와 미들웨어로 실행될 콜백 메소드를 지정할 수 있다.

// 빌트인(내장) 모듈 불러오기
var express = require('express');
var http = require('http');
 
// 익스프레스 객체 및 웹 서버 객체 생성
var app = express();
const port = 3333;
app.set('port', port);
 
var server = http.createServer(app);
 
// 포트 설정 및 요청 대기
server.listen(app.get('port'));
 
// 미들웨어 설정
app.use(function(req, res){
    console.log("미들웨어 실행");
});

16행에서 미들웨어를 등록하는 코드를 확인할 수 있다.


next() 메소드

현재의 미들웨어 함수가 요청-응답 주기를 종료하지 않는 경우에는 next() 메소드를 호출해야 한다. next() 메소드는 요청 처리에 대한 제어를 다음 미들웨어 함수에 전달하는 역할을 한다.

만약 제어를 전달하지 않는다면, 해당 요청은 정지된 채로 방치된다.

// 빌트인(내장) 모듈 불러오기
// 익스프레스 객체 및 웹 서버 객체 생성
// 포트 설정 및 요청 대기
...
 
// 미들웨어 설정
app.use(function(req, res, next){
    console.log("첫 번째 미들웨어 실행");
    //next(); //next() 생략
});
 
app.use(function(req, res, next){
    console.log("두 번째 미들웨어 실행");
    next();
});

고의적으로 코드 내에서 next() 메소드를 생략해 보았다.(9행)

해당 서버에 요청이 들어오면, 7행, 12행의 순서대로 미들웨어가 실행될 것이다. 그러나 9행에서 next() 메소드를 생략했기에, 두 번째 미들웨어는 실행되지 않을 것이다.

순서 상 뒤에 있는 미들웨어에 제어를 넘겨주기 위해서는, 반드시 next() 메소드를 사용해야 한다. 그러나, 반대로 해당 미들웨어가 마지막 처리가 되어야 하는 경우(예로 들면 에러 검출 시..) next() 메소드를 생략할 수 있다.


마운트 경로

마운트 경로를 가지고 있지 않은 경우, 모든 요청에 대해서 등록된 순서대로 처리가 실행된다.

마운트 경로를 가지고 있는 경우, 해당 경로에 맞는 요청에 대해서만 미들웨어의 처리가 실행된다.