본문 바로가기
nodejs

[node.js] express - 라우터, 컨트롤러 나누기

by jinbro 2017. 6. 20.
[수정된 코드]
- TDD user API server settings : https://github.com/imjinbro/tddUserAPI
(필요하다면 fork 후 remote로 가져오기)


[라우트, 컨트롤러 코드 각각 분할하기]
- 라우트 : 라우팅을 위한 전용 Router 클래스 사용해서 app.js에서 라우팅 코드 간결하게 만들기
- 컨트롤러 : api 동작(콜백함수) 부분만 모듈화시키기

1) 디렉토리 분할하기
- 총괄디렉토리(api) > 유저 api 디렉토리(user) 만들기 : mkdir 사용해서 api, user 생성


2) user 디렉토리에 소스 파일 분할하기 
- index.js : 라우팅
const express = require('express');
const router = express.Router();

const controller = require('./user.ctrl');

/* user 라우팅 로직 */
router.get('/', controller.index);
router.get('/:id', controller.read);
router.post('/', controller.create);
router.put('/:id', controller.update);
router.delete('/:id', controller.destroy);


module.exports = router;




- user.ctrl.js : api 동작 코드
/* api 로직 */
let users = [
  {id: 1, name: 'jinbro'},
  {id: 2, name: 'jinhyung'},
  {id: 3, name: 'park'}
];

let index = function(req, res){
  /* req.query.limit = req.query.limit || 10 - 요로코롬 쓸 수도 있네? */
  if(!req.query.limit){
    res.json(users);
  } else {
    const limit = parseInt(req.query.limit, 10);

    if(isNaN(limit)){
      return res.status(400).end();
    }
    res.json(users.slice(0, limit));
  }
};

let read = function(req, res){
     const id = parseInt(req.params.id, 10);

     if(isNaN(id)){
          return res.status(400).end();
     }

     const user = users.filter((user) => {
       return user.id === id;
     })[0];

     if(!user){
       return res.status(404).end();
     }

     res.json(user);
};

//.... 이하 생략


module.exports = {
  index: index,
  read: read,
  create: create,
  update: update,
  destroy: destroy

};



3) 프로젝트 루트 디렉토리(/)에 있는 app.js에서 user 로드하기
- index.js 파일만 로드하면 의존 모듈이 따라옴 : user.ctrl.js 모듈이 로드 되어있기 때문
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const port = 3000;

/* use router class */
const user = require('./api/user/index.js');

/* body-parser middleware for json */
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

/* /users 요청을 모두 /user/index.js로 */
app.use('/users', user);

app.listen(port, function(){
  console.log("server is running");
});


module.exports = app; /* use at app.spec.js */




[정리]
- 테스트 코드가 중요함 : 리팩토링하고나서 제대로 동작하는지 확인을 바로바로 할 수 있으니깐, 어디서 막히는지 바로바로 알 수 있음


- 리팩토링할 때는 1개만 작업해두고, 테스트 코드가 정상동작하는지 테스트 한 후 정상동작이라면 그때 올 리펙토링(같은 작업 범위 내)
- 모듈화를 잘해서 코드를 깔끔하게 만들자


[참고자료]
- express, express.Router() : http://expressjs.com/ko/guide/routing.html

- inflearn, 테스트주도개발(TDD)로 만드는 NodeJS API 서버 : https://goo.gl/3fEGPp




댓글