express, Router

1 분 소요

라우팅

주소별 분기 처리를 위한 라우팅 방식에 대해 알아보도록 하자.

express 기본 코드

app.js

...
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
...
app.use('/', indexRouter);
app.use('/users', usersRouter);
...

사용 방식에서 알 수 있듯이 라우팅 또한 미들웨어의 일종이라고 볼 수 있다.

use 대신 get, post, put, patch, delete 같은 HTTP 메서드를 사용할 수도 있다. use와는 다르게 특정 요청이 충족되는 경우에만 실행되는 미들웨어이다.

예제

app.get('/', function(req, res, next){
  console.log('get');
  next();
});
app.post('/', function(req, res, next){
  console.log('post');
  next();
});

라우터

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

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router;

res.render('index', { title: 'Express' }); 템플릿 엔진을 사용하는 경우이다.

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

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

module.exports = router;

users에서도 .get('/', ...)을 볼 수 있는데, user 자체를 /users에 연결했기 때문에 /users/로 연결했을 경우 콜백 함수가 실행된다.

자주 사용하는 패턴

라우터 또한 app.js서 처럼 use를 사용해 메서드를 붙일 수 있다. 또한, 라우터 하나에 여러 개의 미들웨어를 장착 할 수 있는데, 로직 실행 전 미들웨어에서 로그인 여부 등을 체크하는 것을 중간에 넣어놓기도 한다.

router. get('/', middleware1, middleware2, ...);

사실 라우터를 사용할 필요 없이 app.js에서 연결해도 기능은 동일하다 하지만 코드 관리를 위해 라우터를 별도로 분리하는 것이다.

라우터에서는 반드시 요청에 대한 응답을 보내거나 에러 핸들러로 요청을 넘겨야 한다. 응답을 보내지 않으면 브라우저는 계속 기다리기 때문이다.

next 함수는 라우터에서만 동작하는 특수기능이 있든데, next('route')이다. 라우터에서 연결된 나머지 미들웨어들을 건너뛰고 싶을 때 사용한다.

router.get('/', function(req, res, next)){
  next('route');
}, function(req, res, next) {
  console.log('실행되지 않습니다');
  next();
}, function(req, res, next) {
  console.log('실행되지 않습니다');
  next();
});

router.get('/', function(req, res, next)){
  console.log('실행됩니다.')
});

라우터 주소에는 특수한 패턴을 사용할 수 있는데,

router.get('/users/:id', function(req, res){
  console.log(req.params, req.query);
});

:id는 문자 그대로를 뜻하는 것이 아니며 이 부분에 다른 값을 넣을 수 있다. req.params.id로 조회 가능하다.

주소에 쿼리스트링 또한 쓸 수 있는데 쿼리스트링의 키-값 정보는 req.query 객체 안에 들어있다.

Refernce
  • 조헌영, Node.js 교과서, 길벗, 6장 express