MVC 디자인 패턴과 같이, 코드를 각각 다른 부분으로 나누어 작성해야 하는 이유를 이해할 수 있다.
MODEL, VIEW, CONTROLLER가 각각 어떤 역할을 하는지 이해할 수 있다.
SQL을 Node.js 앱에서 쿼리할 수 있다.
클라이언트의 HTTP 요청에 따라 CRUD API를 구현할 수 있다.
=> 서버를 거쳐 가야 한다.
그래서 각각의 티어를 두어서
서로의 데이터를 주고받을수 있도록 데이터를 만듭니다.
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req,res) => {
res.send('Hello World!')
})
app listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
=> 코드가 너무 길어져서 효율적이지않다 !!
좀 더 구조화해서 짜는 방법 없을까 ?
=> 디자인 패턴이 등장했다.
그중 하나가 MVC패턴
이다 .
Controller는 무엇인가?
=> 풀수 있는 기능들의 로직의 집합.
프로그램을 통해서 어떤 문제를 해결할 것인가 ?
어떻게 하면 문제를 풀 수 있을까 ?
풀수 있는 기능들을 가지고 로직을 만든후,
그게 컨트롤러로 들어가게 됩니다.
ex) 데이터 베이스의 구매목록을 조회하고 싶다.
유저의 아이디가 있으면, 구매목록 리스트를 전부 조회 했으면 좋겠다.
read(유저아이디) // 기능
controller에서는 이기능을 가장 단순하게
작성해야 한다.
get:{modes.read(userId)}
클라이언트와의 커뮤니케이션은 model에서 구현해야한다.
1. 데이터베이스에서 아이템 가져오기
2. 데이터베이스에서 주문내역 저장하기
3. 데이터베이스에서 주문내역 가져오기
/controllers.index.js
const models = require("../models");
module.exports = {
items: {
get: (req, res) => {
models.items.get((err, result) => {
if(err){
return res.status(500).send("Internal Server Error");
}else{
return res.status(200).json(result);
}
});
},
},
orders: {
get: (req, res) => {
const userId = req.params.userId;
if(!userId){
return res.status(400).end();
}
models.orders.get(Number(userId), (err,result) => {
if(err){
return res.status(400).end();
}else{
return res.status(200).json(result);
}
});
},
post: (req, res) => {
const userId = req.params.userId;
const {orders, totalPrice} = req.body;
if(!orders || !totalPrice){
return res.status(400).end();
}else{
models.orders.post(Number(userId), orders, totalPrice, (err, result) => {
if(err){
return res.status(404).end();
}else{
return res.status(201).json(result);
}
)};
}
}
}
}
/models/index.js
const db = require("../db");
module.exports = {
items: {
get: (callback) => {
const sql = `SELECT * from items`
db.query(sql, (err,result)=>{
callback(err,result);
})
},
},
orders: {
get: (userId, callback) => {
const sql = `
SELECT orders.id, name, image, price, total_price, order_quantity
FROM orders
LEFT JOIN users
ON users.id = orders.user_id
LEFT JOIN order_items
ON orders.id = order_items.order_id
LEFT JOIN items
ON items.id = order_items.item_id
WHERE users.id = ?
`
const params = [userId];
db.query(sql, params, (err,result)=>{
callback(err, result);
});
},
post: (userId, orders, totalPrice, callback) => {
//orders 테이블에 먼저 데이터를 삽입한다
//그 다음에 order_items 테이블에 데이터를 삽입한다
//이유는 orders의 id를 FK로 갖는 order_items.order_id를 order_items 테이블에 데이터를 삽입할때 쓸 수 있기 때문
const sql1 = `INSERT INTO orders (user_id, total_price) VALUES (?,?)`
const params = [userId, totalPrice];
db.query(sql1, parmas, (err, result) => {
if(err) callback(err, null);
else{
const sql2 = `INSERT INTO order_items (order_id, item_id, order_quantity) VALUES ?`
const params2 = orders.map(order => {
return [result.insertId, order.itemId, order.quantity]
});
return db.query(sql2, [params2], (err,result) => {
if(err) callback(err, null);
else{
callback(null, result);
}
});
}
});
}
}
}