[Node.js] 라우터 분리하기

동현·2020년 12월 27일
9
post-thumbnail
post-custom-banner

라우팅 작업이 늘어나다보면, 코드 양이 너무 많이 늘어나 관리하기 힘들어질 때가 있다. 이 때 연관이 있는 라우터끼리 파일을 만들어 분리해서 관리할 필요가 있다.

예시를 들어 다음 코드에서 라우터를 분리해보자.

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

app.get('/auth/login', (req, res) => {
    res.send('This is login page');
})
app.get('/auth/logout', (req, res) => {
    res.send('This is logout page');
});
app.get('/auth/register', (req, res) => {
    res.send('This is register page');
});

app.get('/topic/view', (req, res) => {
    res.send('This is view page');
});
app.get('/topic/add', (req, res) =>{
    res.send('This is add page');
});
app.get('/topic/edit', (req, res) =>{
    res.send('This is edit page');
});
app.get('/topic/delete', (req, res) =>{
    res.send('This is delete page');
});

app.listen(80, () => {
    console.log('Connected 80 port');
});

1. 라우터를 모듈로 분할

위의 예시를 보면, 대략 auth쪽을 담당하는 라우터와 topic쪽을 담당하는 라우터로 분리할 수 있을 것이다. 따라서 이를 auth.js, topic.js라는 모듈로 만들어 분리할 것이다.

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

router.get('/login', (req, res) => {
    res.send('This is login page');
})
router.get('/logout', (req, res) => {
    res.send('This is logout page');
});
router.get('/register', (req, res) => {
    res.send('This is register page');
});

module.exports = router;

auth.js

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

router.get('/view', (req, res) => {
    res.send('This is view page');
});
router.get('/add', (req, res) =>{
    res.send('This is add page');
});
router.get('/edit', (req, res) =>{
    res.send('This is edit page');
});
router.get('/delete', (req, res) =>{
    res.send('This is delete page');
});

module.exports = router;

topic.js

express.Router 클래스를 이용해서 분리하였다. 라우터를 정의하고 그 라우터에 대한 라우팅들을 정의해주었다. 그리고 module.exports = router; 로 require를 사용했을 때 해당 라우터를 가져올수록 하였다.
자세한 내용은 공식 문서를 참고하면 된다.

2. 라우터 모듈 사용하기

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

const auth = require('./routes/auth');
app.use('/auth', auth);

const topic = require('./routes/topic');
app.use('/topic', topic);

app.listen(80, () => {
    console.log('Connected 80 port');
});

코드가 훨씬 간결해진 것을 확인할 수 있다. require('파일경로'); 로 해당 라우터 모듈을 가져오고 app.use('/경로', 라우터); 로 라우터를 사용 설정하면 된다. 이렇게 할 경우 '/경로'에 해당하는 작업을 해당 라우터가 처리하게 된다.

주의해야 될 사항
처음 예시처럼 경로를 'auth/login'으로 하고, app.use('/auth', auth); 로 해당 라우터를 사용하게 되면, 해당 라우터에서는 auth/auth/login에 대한 요청을 받게 된다. 따라서 app.use에서 사용한 경로는 지워두도록 하자.

3. 모듈에서 객체 전달받기

모듈로 만들 경우, 파일들이 완전히 서로 고립되게 된다. 이 때, 만약 auth.js에서 app 객체를 필요로 한다면 어떻게 할까?

module.exports = (app) => {
    const router = require('express').Router();
    const application = app;

    router.get('/login', (req, res) => {
        res.send('This is login page');
    })
    router.get('/logout', (req, res) => {
        res.send('This is logout page');
    });
    router.get('/register', (req, res) => {
        res.send('This is register page');
    });
    
    return router;
}

auth.js

바로 함수로 만들어서 해당 객체를 매개변수로 하도록 만들면 된다. 1번에서 했던 과정에서 결국 router를 리턴해주었으니, 해당 함수에서도 router를 리턴시켜주면 된다.

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

const auth = require('./routes/auth')(app);
app.use('/auth', auth);

const topic = require('./routes/topic');
app.use('/topic', topic);

app.listen(80, () => {
    console.log('Connected 80 port');
});

라우터 모듈을 사용할 때도, 함수를 호출할 때처럼 뒤에 매개변수를 붙여주면 된다.

4. 참조

Express - Node.js 웹 애플리케이션 프레임워크, "Express 라우팅", https://expressjs.com/ko/guide/routing.html
생활코딩, "라우트 분리하기", https://opentutorials.org/module/2026/12445

profile
https://github.com/DongChyeon
post-custom-banner

0개의 댓글