- 이번에 MVC적용을 하는 예시로 저번에 사용한 데이터베이스 언어인 mysql을 이용해 Model에서 데이터를 가공해 컨트롤로 보내고 controller는 받아온 데이터를 처리해 송출하는 방법을 해볼것이다.
- 이때 Express를 활용해 분기를 나누어 줄것이고 나누어진 분기에따라 controller를 연결, controller는 Model에서 필요한 정보를 DataBase에서 가져오는것을 할것이다.
1.Express를 사용해 '/'를 호출할시 indexRouter를 사용하겠다고 작성
애플리케이션 레벨과 라우터 레벨은 실행단계의 차이지 기능적으론 다른 점이 없다.
따라서 이번엔 애플리케이션 분기와 라우터 분기로 더 기밀하게 URL을 분리하여 제어해 보겠다.
- app.js -
const express = require('express');
const indexRouter = require('./routes');//분기마다 구분해놓은 Router들의 집합 레포
const cors = require('cors');
const morgan = require('morgan');
const app = express();
const port = 4000;
app.use(cors());
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use('/', indexRouter); //'/'이 호출될시 indexRouter을 실행하도록 선언
//callback인자에 express.Router() 오브젝트를 생성하여 넣음으로 라우터 단계에서의 URL 제어도 가능 하도록 등록하였다.
module.exports = app.listen(port, () => {
console.log(`${prot}로 시작`}
});
- router/index.js -
const express = require('express');
const router = express.Router();
const itemsRouter = require('./items');
router.use('/items', itemsRouter);//'/items'가 호출되면 itemsRouter로 불러온 items를 실행
// use()는 모든 METHOD에서 동작한다는 것이고 METHOD()는 지정된 요청(GET, POST, PUT, DELETE 등)에서만 동작을 한다는 것
module.exports = router;
- routes/items.js -
const router = require('express').Router();
const controller = require('./../controllers');
//controllers를 불러온다.
router.get('/', controller.items.get);//get을 통해 컨트롤의 item.get을 통해 컨트롤러를 실행한다.
module.exports = router;
- controllers/index.js -
const models = require('../models'); //models를 통해 데이터를 가공하고 받아온다.
items: { //받아온 데이터를 실행한다.
get: (req, res) => {
models.items.get((error, result) => {
if (error) {
res.status(500).send('Internal Server Error');
} else {
res.status(200).json(result);
}
});
},
}
- models/index.js -
const db = require('../db'); //db변수에 연결된 DataBase 정보를 받아온다.
module.exports = {
items: {
get: (callback) => {
const queryString = `SELECT * FROM items`; //items테이블에 있는 모든 정보를 불러오는 sql문을 작성한다.
//queryString에는 slq문으로 정리된 데이터가 담기게 된다.
db.query(queryString, (error, result) => {
callback(error, result); //작성된 sql문을 이용해 콜백함수로 에러와 결과값을 보낸다.
});
},
}
컨트롤러에서는 에러값과 결과값 두개를 인자로 사용하는 콜백함수를 받아오며 이를 이용해 데이터를 전송한다.
items: { get: (req, res) => { //1. get에 대한 콜백함수가 실행이 되고 models.items.get((error, result) => {2.모델내에서 실행된 콜백함수에따라 실행을 한다. if (error) { res.status(500).send('Internal Server Error'); } else { res.status(200).json(result); } }); }, }