라우팅 작업이 늘어나다보면, 코드 양이 너무 많이 늘어나 관리하기 힘들어질 때가 있다. 이 때 연관이 있는 라우터끼리 파일을 만들어 분리해서 관리할 필요가 있다.
예시를 들어 다음 코드에서 라우터를 분리해보자.
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');
});
위의 예시를 보면, 대략 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를 사용했을 때 해당 라우터를 가져올수록 하였다.
자세한 내용은 공식 문서를 참고하면 된다.
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에서 사용한 경로는 지워두도록 하자.
모듈로 만들 경우, 파일들이 완전히 서로 고립되게 된다. 이 때, 만약 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');
});
라우터 모듈을 사용할 때도, 함수를 호출할 때처럼 뒤에 매개변수를 붙여주면 된다.
Express - Node.js 웹 애플리케이션 프레임워크, "Express 라우팅", https://expressjs.com/ko/guide/routing.html
생활코딩, "라우트 분리하기", https://opentutorials.org/module/2026/12445