[nodejs] Routes-Models-Controllers 구조

✏️ sprint를 진행하면서 server 프로젝트의 디렉토리 구조를 보면서 왜 이렇게 잘게(?) 나누어 놓았는지 의문이 들었다. 구글링 해보니 이런 스타일로 구조화하여 진행하는 것에 대한 많은 포스팅들이 있었다. 구조를 이해하고 보니 sprint의 개념도 더 잘 이해되는 듯 하다. 정리해두고 프로젝트를 진행할 때 적극적으로 활용해야겠다.



Routes-Models-Controllers(-Services) 구조

  • nodejs로 서버를 구축할 때, 향후 유지보수를 위해 아래와 같이 기능별로 구조화 해두면 좋다.


경로(Routes)

API 경로를 해당하는 컨트롤러에 매핑

//    routes/index.js
const express = require('express');
const router = express.Router();
const itemsRouter = require('./items');
const usersRouter = require('./users');

router.use('/items', itemsRouter);
router.use('/users', usersRouter);

module.exports = router;
//    routes/items.js
const router = require('express').Router();
const controller = require('./../controllers');

router.get('/', controller.items.get); // API 경로에 해당하는 컨트롤러를 연결

module.exports = router;

모델(Models)

모델의 스키마 정의, DB에 접근하는 로직 처리

const db = require('../db'); // DB 모듈 require

module.exports = {
  items: {
    get: (callback) => {
      const queryString = `SELECT * FROM items`;
      db.query(queryString, (error, result) => {
        callback(error, result);
      });
    },
  }
}

Models에서 스키마 정의만 해주고, Services 모듈을 추가하여 Services에서 DB 쿼리를 처리해줄 수도 있다.

컨트롤러(Controllers)

요청 매개변수 확인, 쿼리, 적절한 상태 코드 및 응답 보내기 등의 비즈니스 로직 처리

const models = require('../models'); // models 모듈 require

module.exports = {
  items: {
    get: (req, res) => {
      models.items.get((error, result) => {
        if (error) {
          res.status(500).send('Internal Server Error');
        } else {
          res.status(200).json(result);
        }
      });
    },
  }
}

좋은 웹페이지 즐겨찾기