TIL_037_210409

James·2021년 4월 9일
0

TILs

목록 보기
37/40

Database 왜 필요한가?

단순히 React와 Redux만 가지고 In-memory 형식으로 데이터를 관리하면 새로고침하면 입력한 모든 데이터는 사라진다.
Database가 있으면 영속성있게 데이터를 보관할 수 있다.

File I/O 형식으로도 데이터를 보관할 수 있지 않은가?

File I/O 형식으로도 데이터를 보관할 수 있다. 하지만 데이터를 불러올 때 파일을 통째로 불러와야 해서 파일을 보관하고 있는 Server에 부하를 많이 주게 된다. 또한 파일이 손상되거나 여러 개의 파일을 동시에 다뤄야할 때 복잡해 진다.
Database를 사용하면 영속성있게 데이터를 보관할 수 있을 뿐만 아니라 파일손상에 대한 걱정없이 원하는 데이터만 불러올 수 있어 보다 신뢰성있는 데이터 관리가 가능하다.

관계형 DB와 NoSQL의 차이는 무엇인가?

관계형 DB는 데이터 구조가 고정되어 있는 상태로 데이터를 삽입하거나 불러올 수 있는 DB이다. 다시 말하면 데이터가 구조화된 테이블을 사용하는 DB가 관계형 DB이다.
반면, NoSQL은 Not Only SQL의 줄임말로 관계형 DB(SQL)이 아닌 모든 DB를 의미한다.
쉽게 말하면 Table구조가 아닌 다른 모든 구조를 가진 DB이다.
NoSQL의 데이터 구조는 대표적으로 3가지가 있다. Document Tree구조, Graph구조, Key-Value 구조.
우리가 많이 사용하고 있는 인스타그램 이란 앱은 참고로 Key-Value구조를 가진 카산드라를 사용하고 있다. 이유는 읽기, 쓰기가 매우 빠르다는 장점을 가지고 있기 때문이고 이 이유로 넷플릭스, 인스타그램, 우버 등 대용량의 데이터 처리가 필요한 곳에는 많이들 카산드라 DB를 사용한다.
참고로 페이스북이나 인스타그램 같은 대형서비스플랫폼의 경우 용도에 따라 다수의 DB를 사용하고 있다.

Node.js에서 3 Tier Architecture에 따라 관계형 DB를 구현한다면?

아주 간단한 형태의 쇼핑몰의 3 Tier Diagram(Client-Server-DB) 이다.

db.query(SQL, function(err, rows, fields)) 를 실행하면
db에 SQL문을 쿼리로 보내고 mysql서버에서 그 결과를 function의 인자로 반환하게 된다.
rows 인자에 mysql은 아래 사진과 같이 RowDataPacket 이라는 객체 형태로 SELECT query 결과를 받아올 수 있고, Server에서는 db에서 받아온 rows 결과물을 Client에게 Response하는 방식이다.
fiels 인자에는 FieldPacket 이란 객체를 DB에서 반환하게 되는데 SQL문이 어떤 database, 그리고 어떤 table을 대상으로 하고 있는 지 등을 알 수 있는 정보가 담겨있다.

let sql = `SELECT * FROM items`;
db.query(sql, (err, rows, fields) => {
  if (err) throw err;
  console.log("rows: ",rows);
  console.log("fields: ",fields);
}


만약 Client 가 GET 조회가 아니라 입력한 데이터를 저장하는 POST 기능를 원한다면
Client의 요청을 받은 Server에서는 body의 각 내용을 DB에서 INSERT 쿼리를 수행하기 위한
values 값으로 사용할 수 있게 매개변수 처리해줘야 한다.
아래 코드에서 userId, totalPrice, orders가 Server에서 넘겨 받은 매개변수이다.

INSERT 쿼리로 한번만 values를 삽입할 수 있으면 간단하지만,
종종 반복적으로 여러개의 values를 삽입해야 할 때, 번거롭게 반복문을 쓰지 않도록,
db.query 메소드에서는 values 라는 배열 값을 SQL문과 function(err,rows,fields) 사이에 인자로 넣을 수 있도록 해주었다.
SQL문에서는 VALUES ? 라고 Question Mark처리를 해주면 db.query의 인자중 SQL문 바로 뒤의 배열형태의 인자가 ? 에 대입되며 다수의 values를 하나의 쿼리로 삽입할 수 있다.

let sql1 = `INSERT INTO orders (user_id, total_price) VALUES (${userId}, ${totalPrice})`;
let sql2 = `INSERT INTO order_items (order_id, item_id, order_quantity) VALUES ?`;
db.query(sql1, (err, result) => {
  if(err) throw err;
  console.log('sql1 result:',result)
  let values = orders.map(order => {
    return [result.insertId, order.itemId, order.quantity];
  });
  db.query(sql2, [values], (err, result) => {
    if(err) console.log(err);
    console.log("sql2 result: ",result);
    callback(err, result);
  })
})
profile
웹개발자 James 입니다.

0개의 댓글