[Node.js] 라우터 분리하기
NodeJs 라우터 분리하는 방법을 알아봅시다.
자세한 내용은 생활코딩 Javascript(nodejs) 강좌와 Express - Using middleware를 참고하세요.
라우터 분리의 필요성
라우팅 작업이 늘어남에 따라서 아래와 같이 라우팅을 애플리케이션 레벨의 미들웨어 로서 관리하기에는 어려움이 생길 수 있습니다. 이에 따라 서로 연관되어 있는 라우터끼리 쪼개서 파일로 분가 시킬 필요가 있습니다.
애플리케이션 레벨의 미들웨어
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//app.js
var express = require('express');
var app = express();
app.get('/p1/r1', function(req, res){
res.send('Hello /p1/r1');
});
app.get('/p1/r2', function(req, res){
res.send('Hello /p1/r2');
});
app.get('/p2/r1', function(req, res){
res.send('Hello /p2/r1');
});
app.get('/p2/r2', function(req, res){
res.send('Hello /p2/r2');
});
라우터 레벨의 미들웨어
기본적인 원리(파일로 분할하기 전)
p1으로 들어오는 모든 요청은 라우터에 위임하므로 아래와 같이
인자 값을 '/p1/r1' 에서 '/r1' 로 간략화할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//app.js
var express = require('express');
var app = express();
var p1 = express.Router();
p1.get('/r1', function(req, res){
res.send('Hello /p1/r1');
});
p1.get('/r2', function(req, res){
res.send('Hello /p1/r2');
});
app.use('/p1', p1);
var p2 = express.Router();
p2.get('/r1', function(req, res){
res.send('Hello /p2/r1');
});
p2.get('/r2', function(req, res){
res.send('Hello /p2/r2');
});
app.use('/p2', p2);
app.listen(3000, function(){
console.log('connected');
});
위와 같은 코드는 언뜻 보기에도 이전보다 단순해지지 않았음을 알 수 있습니다. 이것의 효용은 라우터를 파일로 분할함으로써 나타납니다.
라우터를 파일로 분할하기
라우터를 모듈로 만들어 줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
//app.js
var express = require('express');
var app = express();
var p1 = require('./routes/p1.js');
app.use('/p1', p1);
var p2 = require('./routes/p2.js');
app.use('/p2', p2);
app.listen(3000, function(){
console.log('connected');
});
1
2
3
4
5
6
7
8
9
10
11
//./routes/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;
1
2
3
4
5
6
7
8
9
10
11
//./routes/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;
확장
위의 코드에서 p1.js 와 p2.js 는 완전히 고립되어 있습니다.
물론 고립되어 있다는 것은 어떤 문제 발생의 여지를 줄여주기도 하지만
app.js 에서 생성된 데이터는 사용하지 못한다는 단점이 있습니다.
이는 아래와 같이 require에서 app이란 객체를 전달함으로써 해결 할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
//app.js
var express = require('express');
var app = express();
var p1 = require('./routes/p1.js')(app); //객체 app을 전달
app.use('/p1', p1);
var p2 = require('./routes/p2.js');
app.use('/p2', p2);
app.listen(3000, function(){
console.log('connected');
});
함수로 만들어져 객체 app 을 전달받고 라우터를 리턴합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
//./routes/p1.js
module.exports = function(app){//함수로 만들어 객체 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');
});
return router; //라우터를 리턴
};