사용법도 비슷하고, 기능도 비슷해서 항상 헷갈렸던 미들웨어와 라우팅…

그 둘의 특징을 차이점을 기준으로 전격 해부해 보려고 한다.


왜! 이 둘은 헷갈리는가?

  • 미들웨어 코드
// 빌트인(내장) 모듈 불러오기
// 익스프레스 객체 및 웹 서버 객체 생성
// 포트 설정 및 요청 대기
...
 
// 미들웨어 설정
app.use('/test', function(req, res, next){
    console.log("test 실행");
    next();
});
  • 라우팅 코드
// 빌트인(내장) 모듈 불러오기
// 익스프레스 객체 및 웹 서버 객체 생성
// 포트 설정 및 요청 대기
...
 
// 라우팅 설정(방법1)
app.get('/test', function(req, res){
    console.log("test 실행(GET)");
});
 
// 라우팅 설정(방법2)
app.route('/test')
    .post(function(req, res){ ...(POST) })
    .put(function(req, res){ ...(PUT) })
    .delete(function(req, res){ ...(DELETE) });
 
// 라우팅 설정(방법3)
app.all('/test2', function(req, res){ ...(ALL)});

위의 두 코드는 메소드명을 제외하고는 코딩 기술에 있어서 큰 차이점이 없다. 심지어 클라이언트의 요청 경로에 매핑된 메소드에서 미리 정의해 놓은 처리를 실행한다는 점에서 기능도 거의 비슷하다

기술적으로는 이 두 기능은 큰 차이가 없다.


성격상의 차이

(1) 처리 제어를 다음 함수에게 넘기느냐? 미들웨어는 처리에 대한 제어를 다음 미들웨어(or 라우팅)에 넘기기 위한 next() 메소드가 존재한다. 라우팅 역시, next() 메소드를 지원한다. 그러나 요청에 대한 처리의 마지막에 해당하기에, 제어의 양도가 성격이 다르다.

미들웨어는 대개, 입력 데이터를 처리하고 대기열의 다음 처리 메소드로 넘겨주는 역할을 한다. (라우팅의 역할을 기술적으로는 처리할 수는 있으나.. 혼란을 방지하기 위해 굳이 하지 않는다) 라우팅은 미들웨어를 지나 다듬어진 데이터를 클라이언트의 요청에 맞게 처리하고 응답(Response)을 보내는 역할을 한다.

(2) HTTP Method 에 따른 별도 분기가 가능한가? 미들웨어는 use() 메소드만 사용하여, 해당 경로에 대한 모든 요청을 동일하게 처리하게 때문에, HTTP Method 에 따른 별도 분기가 불가능하다. 그러나, 라우팅은 HTTP Method 에 매핑되는 10종 이상의 메소드가 존재하기 때문에, 같은 경로에 대한 요청일지라도 다른 분기 처리가 가능하다.


기능상의 차이

위의 코드들의 일부를 다시 인용하겠다.

  • 미들웨어 코드
// 빌트인(내장) 모듈 불러오기
// 익스프레스 객체 및 웹 서버 객체 생성
// 포트 설정 및 요청 대기
...
 
// 미들웨어 설정
app.use('/test', function(req, res, next){
    console.log("test 실행");
    // URL 매칭 여부
    // /test            O
    // /test/cool       O
    // /test/hotsse     O
    // /test/...        O
});

미들웨어는 요청 경로로 시작하는 모든 경로에 대해서 매핑되어 처리를 실행한다.

  • 라우팅 코드
// 빌트인(내장) 모듈 불러오기
// 익스프레스 객체 및 웹 서버 객체 생성
// 포트 설정 및 요청 대기
...
 
// 라우팅 설정(방법3)
app.all('/test', function(req, res){
    console.log('test 실행');
    // URL 매칭 여부
    // /test            O
    // /test/cool       X
    // /test/hotsse     X
    // /test/...        X
});
 
app.all('/test/*', function(req, res){
    console.log('test 실행');
    // URL 매칭 여부
    // /test            X
    // /test/cool       O
    // /test/hotsse     O
    // /test/...        O
});

라우팅은 요청 경로에 따라서 좀 더 세분화된 규칙을 가지고 있다는 점에서, 미들웨어와 차이점이 있다.