MVC 기초

Jelkov Ahn·2021년 12월 22일
0

데이터베이스 MVC

목록 보기
1/2
post-thumbnail

MVC PATTERN

  • MVC 디자인 패턴과 같이, 코드를 각각 다른 부분으로 나누어 작성해야 하는 이유를 이해할 수 있다.

  • MODEL, VIEW, CONTROLLER가 각각 어떤 역할을 하는지 이해할 수 있다.

CMARKET DATABASE

  • SQL을 Node.js 앱에서 쿼리할 수 있다.

  • 클라이언트의 HTTP 요청에 따라 CRUD API를 구현할 수 있다.

MVC가 무엇인가?

클라이언트에서는 DATABASE에 직접적으로 접근할수가 없다.

=> 서버를 거쳐 가야 한다.

그래서 각각의 티어를 두어서
서로의 데이터를 주고받을수 있도록 데이터를 만듭니다.

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}`)
  })

위의 코드가 1티어 아키텍쳐라면?

=> 코드가 너무 길어져서 효율적이지않다 !!

좀 더 구조화해서 짜는 방법 없을까 ?
=> 디자인 패턴이 등장했다.
그중 하나가 MVC패턴이다 .

Controller는 무엇인가?
=> 풀수 있는 기능들의 로직의 집합.

프로그램을 통해서 어떤 문제를 해결할 것인가 ?

어떻게 하면 문제를 풀 수 있을까 ?

풀수 있는 기능들을 가지고 로직을 만든후,
그게 컨트롤러로 들어가게 됩니다.

ex) 데이터 베이스의 구매목록을 조회하고 싶다.

  • 유저의 아이디가 있으면, 구매목록 리스트를 전부 조회 했으면 좋겠다.

  • read(유저아이디) // 기능

  • controller에서는 이기능을 가장 단순하게 작성해야 한다.
    get:{modes.read(userId)}
    클라이언트와의 커뮤니케이션은 model에서 구현해야한다.

Cmarket Database Sprint

프로그램을 통해서 어떤 문제를 해결할 것인가 ?

1. 데이터베이스에서 아이템 가져오기

  • GET 요청이 들어옴
  • Router를 통해 items 컨트롤러로 분기
  • 데이터베이스에서 테이블 조회 => MODEL에 해당됨
  • 성공시, 데이터를 json으로 전성

2. 데이터베이스에서 주문내역 저장하기

  • POST 요청이 들어옴
  • Router를 통해 items 컨트롤러로 분기
  • 새로운 레코드를 만듬 => MODEL에 해당됨
    • URL 파라미터
    • POST 요청의 BODY
  • 성공시, 상태코드 201 전송

3. 데이터베이스에서 주문내역 가져오기

  • GET 요청이 들어옴
  • Router를 통해 orders 컨트롤러로 분기
  • 데이터베이스에서 테이블 조회 => MODEL에 해당됨
    • URL 파라미터
  • 성공시, 데이터를 json으로 전성

/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);
            }
          });
        }
      });
    }
  }
}       
profile
끝까지 ... 가면 된다.

0개의 댓글