티스토리 뷰

앞에서 보니

 

Controller 파트는 : 이전에 배운 restAPI와 express 에서 배운 주된 내용이 나온다. 아래와 같이

req.parms.id, req.body, res.status 등등 <= 사용법은 EXPRESS API 공식문서에서 공부해야한다.

https://expressjs.com/en/4x/api.html#req.body

 

Express 4.x - API Reference

Express 4.x API express() Creates an Express application. The express() function is a top-level function exported by the express module. var express = require('express') var app = express() Methods express.json([options]) This middleware is available in Ex

expressjs.com

 

 

Recap 


지금 하고있는것? 

http 규악를 사용한 서버를 구축하는 연습.

 서버를 구축하는데 사용하는 언어 javascript

javascript라는 언어를 node.js라는 런타임에서 실행시키는것

서버를 쉽게 구현하기 위해 express.js라는 프레임워크를 사용중

 

Q : 그러면. req,res라는게 express고유컨셉인가? 

A : NO! 아닙니다.

 

REQ?RES는 무엇인가.

 

request와 response는 http에 있는 개념이다.

그것을 쉽게 사용하기위해 node에서는 일차적으로 request, response라는 객체를 만들어준다.

그걸 더 사용하기 쉽게 하기위해서

express에서는 2차적으로 더 고도화 시키는것 

 

 

인터넷이 돌아가는 원리로. 클라이언트에서 요청이날아오면 그것을 컨트롤러가 모델에게 전달해주고 답변을 주고 이것을 하기위해서

http개념인 request, response 를 프레임워크 express를 사용하여 자바스크립트로 코드를 짜주는것

 

 

HTTP는

굉장히 쉬운것같지만 어렵고 매우매우매우~~~중요한 개념이다.

인터넷 돌아가는 원리의 중심이라는말이다. 

그러므로 오늘은 이것을 읽어봐야한다.!!

https://developer.mozilla.org/ko/docs/Web/HTTP/Messages

 

HTTP 메시지 - HTTP | MDN

HTTP 메시지는 서버와 클라이언트 간에 데이터가 교환되는 방식입니다. 메시지 타입은 두 가지가 있습니다. 요청(request)은 클라이언트가 서버로 전달해서 서버의 액션이 일어나게끔 하는 메시지

developer.mozilla.org

 

 

 

섹션2에서 배웠지만 계속 개념이 안잡혀있음이 느껴진다.

공식문서가 진짜 중요하다.

천천히 다시 개념을 잡아가자.

 

 

 

MODEL 파트 분석


컨트롤러에서 아래와같이 함수를 실행시킬것이다. 이말인 즉. 인자들을 그부분에 전달을 해야되는것이다. 

//controller파트

orders: {
    get: (req, res) => {
      const userId = req.params.userId; //풀어준느거 뒷부분만
      // if (!userId) { //사용자가 잘못된 요청을 보냈을 경우
      //   return res.status(400).send("Error 400"); //return을 통해서 400에러를 보내주고 함수를 종료시켜야 한다.
      // }
      models.orders.get(userId, (error, result) => { // Model과 Controller가 대화하는 부분
        if (error) {
          res.status(500).send("Internal Server Error");
        } else {
          res.status(200).json(result); //Model과 대화를 통해 얻어낸 결과를 클라이언트의 요청에 대한 응답을 보내준다.
        }
      });
    },

 

위의 사용법과 전달받은 인자를 어떻게 사용할지 고민해봐야한다.

 

써야하는것.

 

callback 은 함수다. 

이 함수는 컨트롤러부분에있는 함수다. 보기쉽게 callback이라고 표현해준것뿐.

callback === (error, result) => { // Model과 Controller가 대화하는 부분
        if (error) {
          res.status(500).send("Internal Server Error");
        } else {
          res.status(200).json(result); //Model과 대화를 통해 얻어낸 결과를 클라이언트의 요청에 대한 응답을 보내준다.
        }

 

 

 

 

자! 채워보자.

 

수정전 MODEL

const db = require('../db');

module.exports = {
  items: {
    get: (callback) => {
      // TODO: Cmarket의 모든 상품을 가져오는 함수를 작성하세요
      const queryString = `SELECT * FROM items`;

      db.query(queryString, (error, result) => {
        callback(error, result);
      });
    },
  },
  orders: {
    get: (userId, callback) => {
      // TODO: 해당 유저가 작성한 모든 주문을 가져오는 함수를 작성하세요
      callback(/* err, result */);
    },
    post: (userId, orders, totalPrice, callback) => {
      // TODO: 해당 유저의 주문 요청을 데이터베이스에 생성하는 함수를 작성하세요
      callback(/* err, result */);
    }
  },
};

orders부분을 그럼 채워보자. : 해당유저가 작성한 모든주문

✔️유저가 필요하다!!! 

 

 

쿼리문 사용을 위해 스키마 디자인을 시각화해주기

 

1. 위와같이 sql문을 변수에담자. 안담아두됨. 그냥 코드보는사람들이 보기좋게 담아주는것. 남들도 봣을때 이해해야된다. 코드는...ㅋㅋㅋ

유어클래스에서 필요한 정보들을 확인할수있다. 

let queryString = `SELECT o.id,o.created_at,o.total_price,i.name,i.price,i.image,oi.order_quanitity

FROM orders o

INNER JOIN order_items oi ON o.id=oi.order_id

INNer JOIN items i ON i.id=oi.item_id

WHERE o.userId = ${userId}` <-const userId = req.params.userId; 컨트롤러에서 이게 필요했던 이유. 인자로 넘겨준이유.

 

db.query(queryString, (error,result)=>{

    callback(error,result)

})

 

const req = require('express/lib/request');
const db = require('../db');

module.exports = {
  items: {
    get: (callback) => {
      // TODO: Cmarket의 모든 상품을 가져오는 함수를 작성하세요
      const queryString = `SELECT * FROM items`;

      db.query(queryString, (error, result) => {
        callback(error, result);
      });
    },
  },
  orders: {
    get: (userId, callback) => {
      // 해당 유저가 작성한 모든 주문을 가져오는 함수
      const queryString = `SELECT O.id, O.created_at, O.total_price, I.name, I.price, 
                           I.image, OI.order_quantity FROM orders O
                            INNER JOIN order_items OI ON O.id = OI.order_id
                            INNER JOIN items I ON OI.item_id = I.id 
                            WHERE O.user_id = ${userId}`;
      db.query(queryString, (err, result) => {
        callback(err, result);
      });
    },

 

그다음 마지막 post에 어떻게 써야할지 찾아보자.

이렇게 응답이와야했기때문에

컨트롤러에서는

✔️✔️{orders,totalPrice}=req.body 가 들어갔던것이다.

 

 

 

시작전 유어클래스 힌트를 보니 INSERT INTO를 써야함을 알수있었다.

 

 

 

 

2중 SQL작성


다시 스키마를 확인해보자.

1.

sql이고 나발이고 클라이언트의 주문이 업데이트되면? 데이터가 업뎃되어야되는데 어디 데이터가업뎃되야하냐?

{orders,totalPrice}=req.body <- 지금 이거두개가 업뎃되야함

 

국어문제야 국어문제...ㅋㅋㅋ 

주문이 들어오면 orders가 업데이트가 되야하지않을까? total price를 올려주려면 orders의 total_price가...변함을 알수있지않낭?

주문한 인간 :  user_id,  그리고 total_price업뎃해주기. <= 이부분은 orders 컬럼이 가지고있네!

2. 그러면 그다음에 total price 해결했고 orders 안에는 배열 [{qunatity:1}, {itemId:1}] 이거 어케업뎃?

이중으로..또 무엇을 업뎃해야하니..order_items부분이 딱! 가지고있는것들을 볼수가있다.

 

이것을 합쳐보자.

 

const req = require('express/lib/request');
const db = require('../db');

module.exports = {
  items: {
    get: (callback) => {
      // TODO: Cmarket의 모든 상품을 가져오는 함수를 작성하세요
      const queryString = `SELECT * FROM items`;

      db.query(queryString, (error, result) => {
        callback(error, result);
      });
    },
  },
  orders: {
    get: (userId, callback) => {
      // 해당 유저가 작성한 모든 주문을 가져오는 함수
      const queryString = `SELECT O.id, O.created_at, O.total_price, I.name, I.price, 
                           I.image, OI.order_quantity FROM orders O
                            INNER JOIN order_items OI ON O.id = OI.order_id
                            INNER JOIN items I ON OI.item_id = I.id 
                            WHERE O.user_id = ?`;
      db.query(queryString, [userId] ,(err, result) => {
        callback(err, result);
      });
    },
    post: (userId, orders, totalPrice, callback) => {
      // 해당 유저의 주문 요청을 데이터베이스에 생성하는 함수
      const queryString = `INSERT INTO orders (user_id, total_price) VALUES (?, ?);`;
      const params = [userId, totalPrice];
      db.query(queryString, params, (err, result) => {
        if (result) {
          const queryString2 = `INSERT INTO order_items (item_id, order_quantity, order_id) VALUES ?;`;
          const values = orders.map((order) => [
            order.itemId,
            order.quantity,
            result.insertId,
          ]);
          return db.query(queryString2, [values], (err, result) => {
            callback(err, result);
          });
        }
        callback(err, result);
      });
    },
  },
};

 

1. insert into 문을 써야뎀

2. //orders 테이블에 먼저 데이터를 삽입한다
//그 다음에 order_items 테이블에 데이터를 삽입한다
 //이유는 orders의 id를 FK로 갖는 order_items.order_id를 order_items 테이블에 데이터를 삽입할때 쓸 수 있기 때문

 3.  밑에서 보면 ? 물음표와 배열이 필요한거같네!

 

 

  • 쿼리문 작성시 ?를 쓰면 두번째 인자를 넣어준다는 말이다. 두번째 인자는 무조건 배열로 받는다. ?를 만나면서 배열이 하나 벗겨지기 때문이다. => 이건 걍 외우셈 ㅜㅜ
  • 각각에 들어갈 인자를 찾는 중에 order_id를 어디서 가져와야하나 ? 첫번째 질의문에서 result를 받아오게 되면, result.insertId 라는 값이 있었다. 정확하진 않지만, 우리가 orders.id의 속성에 auto로 해놨기 때문에 주문이 들어갈때마다 insertId로 1씩 추가된 숫자가 나오는 걸 볼 수 있었다.
Bulk Insert : 여러개의 레코드를 쿼리 한번에 저장해오는 방법
const db = require(`~~`);
const sql = `INSERT INTO data(id, user, text) VALUES ?`;
const params = [/* 위 data에 상응하는 배열로 이루어진 데이터*/];
// 이런식으로 전달하는데, 다음 params에 해당하는 데이터의 형태는 아래 문에서 삼중배열이어야함
// 위에 정의할때 삼중이던지, 이중으로 한다음 밑에서 [params] 이런 식으로 감싸주던지 해야함
// 이게 쿼리문에 ?를 만나서 배열이 벗겨지면서 데이터가 들어간다.
db.query(sql, params, (err, result) => {
    if (err) {
        return callback(err, null);
    } return callback(null, result);
});

`

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함