Programming/NodeJS

(nodejs+express) 미들웨어를 활용한 라우터 동적 등록 방법

juhpark 2024. 10. 26. 17:15

1. 일반적인 웹서비스 

express 로 웹서비스를 작성할때, 보통은 다음과 같이 작성하게 된다. express를 정의하고 router를 정의한 뒤, app.listen을 통해서 3000번 포트로 서비스를 기동한다.

const express = require('express');
const app = express();
const port = process.env.PORT || 3000;

app.get('/', (req, res) => {
    res.json({
        success: true,
    });
});

app.listen(port, () => {
    console.log(`server is listening at localhost:${process.env.PORT}`);
});

 

2. 미들웨어와 라우터 차이

app.use 는 미들웨어로 불리고, app.get, app.post 는 라우터라고 말한다.

미들웨어 app.use로  '/' 경로를 정의하면 모든 요청을 다 실행하도록 하는 미들웨어로 만들수 있다. 즉, '/', '/a', '/a/b'  와 같은 모든 경로로 요청이 왔을때 서비스를 한다.

 라우터 app.get, app.post로 정의를 하면 정의된 경로를 정확하게 호출한 경우만 서비스가 된다. 예를들어 '/a'로 선언하면 '/a'로 호출된 경우만 서비스되고 다른 경우에는 모두 서비스를 할 수 없다. 

# 미들웨어 정의 : / 로 시작하는 모든 요청에 대해 서비스
app.use('/', (req, res) => {
    res.json({
        success: true,
    });
});

# 라우터 정의 : /a 로 요청하는 경우에만 서비스
app.get('/a', (req, res) => {
    res.json({
        success: true,
    });
});

 

3. 미들웨어에 라우터를 등록하는 방법

라우터를 활용하여 웹서비스 경로를 많이 만들게 되면 하나의 화일이 너무 복잡 해진다. 그래서 라우터의 묶음을 별도의 파일로 만들고, 라우터를 미들웨어에 등록할 수 있다.

router1.js : about, list라는 두개의 서비스를 제공하는 router작성하고, routers 폴더에 저장한다.

let express = require('express')
let router = express.Router()

router.get('/about', (req, res) => {
    res.json({
        success: true,
    });
});

router.get('/list', (req, res) => {
    res.json({
        success: true,
    });
});

module.exports = router

 

app.js : 메인 프로그램에서 router1.js 파일의 라우터를 변수에 담아 app.use의 두번째 인수로 넘긴다. 즉 /info로 시작하는 모든 요청은 infoRouter (router1.js)에서 처리하게 끔 할 수 있다.  router1에 정의된 서비스 about, list 는 각각 /info/about, /info/list 로 요청했을때 서비스 된다.

const express = require('express');
const app = express();
const port = process.env.PORT || 3000;

var infoRouter = require('./routes/router1');
app.use('/info', infoRouter);

app.listen(port, () => {
    console.log(`server is listening at localhost:${process.env.PORT}`);
});

 

4. 미들웨어에 라우터를 동적으로 등록하는 방법

프로젝트를 진행하는 과정 중에 미들웨어와 라우터가 계속 추가 되거나 변경될때마다 3번에서 처럼 별도로 추가를 해줘야 한다면 여간 번거로운 일이 아닐 수 없다. 즉, routes에 저장되어 있는 모든 js 파일들이 동적(자동)으로 미들웨어(app.use)에 등록될 수 있도록 하면 정말 편리하다. 각 미들웨어의 path는 js파일의 파일명으로 등록할 수 있다.

아래의 코드는  __dirname+'/routes' 경로 안에 있는 모든 파일을 읽어 그중 js확장자를 가진 모든  파일의 이름은 경로로 파일은 미들웨어로 등록하는 예제이다. 재시작하면 무조건 routers의 모든 파일을 다시 읽어들여 간단하게 서비스가 가능하다.

const express = require('express');
const app = express();
const port = process.env.PORT || 3000;

// routes 폴더 안 전체 모듈 로딩(경로는 파일명)
require('fs').readdirSync(__dirname+'/routes').forEach(function(file){
    if(file.match(/\.js$/) !== null){
        var name = file.replace('.js','')
        exports[name] = require(__dirname + '/routes/' + file)
        app.use('/'+name, exports[name])
    }
})

app.listen(port, () => {
    console.log(`server is listening at localhost:${process.env.PORT}`);
});