본문 바로가기
개발 공부/데이터베이스

스프린트 cmarket_datadase 분석/리뷰

by 크롱이크 2021. 7. 27.

1. 먼저 스키마를 확인하기

2. 스프린트 진행

테스트 항목은 3가지 였다.

  • 해당 유저가 작성한 모든 주문을 가져오는 함수를 작성
  • 해당 유저의 주문 요청을 데이터베이스에 생성하는 함수를 작성
  • Cmarket의 모든 상품을 가져오는 함수를 작성

문제를 풀기전에 흐름을 알아보려고 한다.

1) 클라이언트에서 서버로 요청을 보내면 서버의 app.js로 들어간다.

2)이 밑에 두문장을 보면, 우리가 가진 주소뒤에 /users로 왔을때랑 /items로 왔을때 어디로 가야하는지 두번째 인자로 나와 있다.

app.use('/users', router);

app.get('/items', controller.items.get);

2-1) users로 갔을 때를 보게 되면, server/routes.js로 가게되면, 또 다시 다음 행선지를 알 수 있다.

컨트롤러로 가게되면, 콜백함수로 result값을 얻기 위해 models.orders.get 또는 models.orders.post로 가라고 한다.

그럼 server/models/index.js로 가게되면,

이렇게 우리가 해야할 과제를 만나게 된다. 우리는 데이터베이스 mysql을 사용하고 있기때문에 쿼리문과 콜백함수를 작성해야한다.

 

마지막 문제부터 풀어보자.

items: {
    get: (callback) => {
      // TODO: Cmarket의 모든 상품을 가져오는 함수를 작성하세요
      callback(err, result);
    }
  }

이런식으로 콜백을 사용한다. 유어클래스에 다음과 같은 예시 코드가 있다.

var sql = "INSERT INTO customers (name, address) VALUES ?";
var params = [
  ["John", "Highway 71"],
  ["Peter", "Lowstreet 4"],
  ["Amy", "Apple st 652"],
  ["Hannah", "Mountain 21"],
  ["Michael", "Valley 345"],
  ["Sandy", "Ocean blvd 2"],
  ["Betty", "Green Grass 1"],
  ["Richard", "Sky st 331"],
  ["Susan", "One way 98"],
  ["Vicky", "Yellow Garden 2"],
  ["Ben", "Park Lane 38"],
];
con.query(sql, [params], function (err, result) {
  if (err) throw err;
  console.log("Number of records inserted: " + result.affectedRows);
});

sql 에 쿼리문을 작성하고, 아래 con.query를 이용하면 되는 것같지만 첫번째 줄에 const db = require('../db') 폴더 안으로 들어가면 con이 정의되어 있다. 그래서 db.query 문 안의 내용을 다음과 같이 진행하엿따.

if (err) {
          console.log(err)
          throw(err)
        }
        callback(err, result);

두번째 문제

이번 문제는 파라미터의 파악이 굉장히 중요했다. 위로 올라가 스키마를 다시 보게되면 고객이 구매를 하게되면, 우리는 1) orders 테이블과 2) order_items 테이블,  2개의 테이블에 데이터를 생성해야한다. 그렇기에 2번의 쿼리문을 작성해야한다.

 

각각에 들어갈 인자를 찾는 중에 order_id를 어디서 가져와야하는지 헷갈렸다. 막찾아보다. 보니 첫번째 질의문에서 result를 받아오게 되면, result.insertId 라는 값이 있었다. 정확하진 않지만, 우리가 orders.id의 속성에 auto로 해놨기 때문에 주문이 들어갈때마다 insertId로 1씩 추가된 숫자가 나오는 걸 볼 수 있었다.

 

그걸 map함수를 사용해서 파라미터에 넣어주고, 첫번째 쿼리문 안에서 두번째 쿼리 문을 작성하였다. 여기서 중요한건 이자체가 콜백함수 형태이기에 두번째 쿼리문에서 callback 함수로 한번만 보내주면 된다. 

두번 보내줘야하는 줄알고, 고생좀했다. 근데 조금만 생각해보면 한번 보내는게 맞다 한번의 요청에 한번의 응답만을 해야한다. 기본중의 기본~

let sql = `INSERT INTO ~~~`;
// 1번째 쿼리문
db.query(sql, (err, results) => {
  if (results) { // result 받아와서 있으면 다음 쿼리문 실행
    let sql = `INSERT INTO ~~ VALUES ?;`; // ? 를 사용하면
    let params = orders.map(~~블라블라) //배열안의 배열은 세개의 인자가 필요함
    // param 문이 두번째 인자에 들어가면 자동으로 들어간다.
    
    // 2번째 쿼리문
    db.query(sql, [params], (err, result) => { // [params]는 필수!
       if(err) {
       	console.log(err);
       	throw(err)
       }
       callback(err, result)
    })
  }
})

 그렇게 하면 데이터가 잘 들어가는 것을 볼 수 있다.

orders table

order_items table

 

첫번째 문제는!! 

쿼리문만 잘 작성하면 된다. 스키마 잘보기 필수!

다음과 같이 잘 들어가는 걸 볼 수 있다.

 

스프린트 리뷰

뭔가 재미있었다. 확실히 생활코딩 sql을 한번 정독해서 그런지 비교적 어렵지 않게 스프린트를 마무리 할 수 있었다.

클라이언트-서버-데이터베이스 3티어아키텍쳐가 어떻게 흘러가는지 알 수 있었다.

실무에 비하면 맛보기 형태겠지만, 문제를 풀어가며 꽤 의욕적인 시간이였다.

반응형

댓글