Express 라우팅 핸들러를 편하게 추가하는 방법

express를 이용하여 서버 개발을 하다 보면 요청 처리 핸들러가 많아집니다. 핸들러를 추가 할 때 마다 app.use('/path', requestHandler);와 같은 코드를 app.js에 추가하지 않고 편하게 추가하는 방법에 대해 소개합니다. 더 좋은 방법이 있거나 개선될 부분이 있다면 댓글로 알려주세요.

사용자 관련 요청을 처리하는 라우팅 핸들러를 등록하는 기본 과정을 보겠습니다. 먼저 사용자 관련 요청 처리 핸들러를 작성합니다.

// 파일 경로 /routers/users.js

const express = require('express');
const router = express.Router(); 

router.get('/', function(req, res) {
  //..비즈니스 로직
});

module.exports = router;

그리고 작성한 핸들러 users.js를 express에 미들웨어로 등록합니다.

// 파일경로 /app.js

const express = require('express');
const app = express();

const userRouter = require('./routers/users');
app.use('/users',usersRouter);

위와 같이 핸들러를 만들 때 마다 app.js에 코드를 수정하여 라우팅을 추가하는 방법은 직관적이지만 핸들러가 늘어날 때 마다 app.js 코드를 수정해야 하는 번거로움이 있습니다.

제가 사용하는 방법은, routers 디렉토리를 만들어 놓고 routers 밑에 핸들러만 추가합니다. 그리고 app.js 에서는 routers 디렉토리 하위 파일들을 모두 불러와 라우팅을 등록합니다. 이와 같은 방식을 사용하면, 핸들러를 추가 할 때마다 app.js 코드를 수정하지 않아도 됩니다.

routers 디렉토리 하위 파일들을 불러와 라우팅 등록하는 코드를 살펴보겠습니다.

// 파일경로 /app.js

const express = require('express');
const app = express();
const fs = require('fs');

const addRouters = (routerPath, currentDepth, maxDepth) => {
    if(currentDepth > maxDepth) return;

    fs.readdirSync(routerPath).forEach((file)=>{
        const filePath = routerPath + '/' + file; 
        const stat = fs.stateSync(filePath);

        if(stat.isDirectory()){
            addRouters(filePath, currentDepth + 1, maxDepth);
        }else{   
            if(file.endWith('js'){
                const route = filePath.substring(1, filePath.length-3);
                app.use(route, require(filePath));
            }
        }
    });
}
addRouters('./routers', 0, 1);

// ---- 이하 코드 생략 ----

addRouters는 ./routers 밑에 정의된 핸들러 파일을 모두 express에 미들웨어로 등록합니다. 예를 들어, 아래와 같은 구조라면 users.js와 plants.js가 각각 /users, /plants에 대한 요청 처리 핸들러로 라우팅 등록이 됩니다. 그리고 핸들러를 추가 할 때 마다 더이상 app.js에 핸들러를 별도로 등록할 필요가 없어집니다.

| -- routers
|      |-- users.js
|      |-- plants.js
|
| -- app.js

addRouters 호출 시 currentDepth와 maxDepth를 각각 0, 1로 지정하였기 때문에 routers 디렉토리의 하위 경로에 있는 디렉토리 밑의 파일들은 등록되지 않습니다.