스터디📖/Node.js

[nodejs] Node.Js 활용하기 - 섹션 10. 정리정돈의 기술 3 - 라우트 분리하기

호프 2022. 2. 16. 00:12

Routes separate 1

https://expressjs.com/ko/guide/using-middleware.html

지금까지 사용한 라우터 app.get.. 는 application-level middleware

-> Router-level middleware 사용

var express = require('express');
var app = express();
var router = express.Router();

router.get('/r1', function(req, res){
    res.send('Hello /p1/r1');
})
router.get('/r2', function(req, res){
    res.send('Hello /p1/r2');
})
app.use('/p1', router); // /p1으로 들어오는 모든 점속은 router에게 위임.

app.listen(3003, function(){
    console.log('connected');
})

'/p1/r1' 주소에 접근하면 Hello /p1/r1 이 출력되고, '/p1/r2' 주소에 접근하면 Hello /p1/r2 가 출력된다.

Routes separate 2

rouoter 코드를 외부의 파일로 옮겨, 모듈로 사용하도록 코드를 정리한다.

//app_route.js
var express = require('express');
var app = express();

var p1 = require('./routes/p1');
app.use('/p1', p1); // /p1으로 들어오는 모든 점속은 router에게 위임.

var p2 = require('./routes/p2');
app.use('/p2', p2);

app.listen(3003, function(){
    console.log('connected');
})
//----------------------------------------------------------------------
// p1.js
var express= require('express');
var router = express.Router();

router.get('/r1', function(req, res){
    res.send('Hello /p1/r1');
})
router.get('/r2', function(req, res){
    res.send('Hello /p1/r2');
})
module.exports = router;
//-----------------------------------------------------------------------
// p2.js
var express = require('express');
var router = express.Router();

router.get('/r1', function(req, res){
    res.send('Hello /p2/r1');
})
router.get('/r2', function(req, res){
    res.send('Hello /p2/r2');
})
module.exports = router;

Routes separate 3

위와 같이 모듈을 사용하여 빼면, p1.js는 완전히 고립되어 있기 때문에 발생 가능한 문제를 줄일 수도 있다.

그렇다면 p1.js에서 app_route.js의 객체나 변수를 이용하고 싶을 때는 어떻게 해야할까?

// p1.js
module.exports = function(app){
    var express= require('express');
    var router = express.Router();

    router.get('/r1', function(req, res){
        res.send('Hello /p1/r1');
    })
    router.get('/r2', function(req, res){
        res.send('Hello /p1/r2');
    })
    app.get('/p3/r1', function(req, res){
        res.send('Hello /p3/r1'); // app 객체 이용 가능.
    })
    return router;
};

그럴 때는 위와 같이 module.exports의 값으로 함수를 만들어서 매개변수를 받아올 수 있도록 한다. 이러면 함수 안에서 매개변수로 받은 app 객체를 이용할 수 있다. 마지막에 라우터를 리턴하도록 하면 기존과 동일하게 동작하게 된다.

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

var p1 = require('./routes/p1')(app); // app이라는 객체를 전달.
app.use('/p1', p1); // /p1으로 들어오는 모든 점속은 router에게 위임.

var p2 = require('./routes/p2')(app);
app.use('/p2', p2);

app.listen(3003, function(){
    console.log('connected');
})

호출하는 쪽에서는 위와 같이 매개변수를 함께 주면서 함수를 호출한다.