1월 첫째 주 TWIL

윤슬기·2020년 1월 4일
0

TWIL

목록 보기
24/32
post-thumbnail

Immersive Course

Immersive Course(이하 IM)는 프로그래밍 교육기관 코드 스테이츠의 웹 개발 심화 코스이다. 아래 내용은 IM에서 배우고, 내가 찾아보고, 다른 수강생들이 전해 준 지식이다.


DATABASE Sprint

0. 스프린트 소회

이머시브 코스에서 스프린트란 어떤 주제를 경험해 보기 위해서 주어진 과제를 해결하는 과정이다. 이번 주에는 데이터베이스와 서버, 클라이언트 간의 관계를 이해하고 데이터베이스를 사용해 보는 과제가 주어졌다.

MVC 패턴에 맞춰 구성된 코드 뼈대가 주어졌고 그 관계를 파악하는 데 적지 않은 시간이 걸렸다. 그 후 MySQL 질의문, mysql2와 Sequelize 문법을 파악해서 코드에 적용해보았다. 어렴풋이 전체적인 그림을 그려 보았다는 느낌, 공식 문서를 보고 새로운 모듈을 사용하는 데 제법 익숙해졌다는 생각이 든다. 하지만 주제에 대해서 깊이 들여다보고 이해하지는 못했기 때문에 앞으로는 더 많은 실습과 네트워크 그 자체에 관한 공부가 필요하다.

1. 데이터베이스의 필요성

지금까지는 서버의, 노드 파일 시스템 모듈을 이용해 데이터를 저장하는 방식을 배웠다. 이번 주에는 데이터베이스를 도입했다. 파일 시스템도 데이터베이스처럼 정보를 저장할 수 있는데 데이터베이스를 사용하는 이유는 무엇인가? 파일 시스템은 정보를 우선 모두 가져온 후 서버에서 원하는 정보를 선별하는 작업을 거쳐야 하지만, 데이터베이스는 질의문을 이용해 원하는 데이터만을 서버에서 데이터베이스로 요청하여 받을 수 있으므로 효율적이다.

이번 스프린트에서는 MySQL을 사용했다.

2. 스키마, 스키마 설계

스키마는 데이터베이스에 정보들을 담는 모양새이다. 프로젝트에 필요한 데이터들을 정리한 후 데이터 사이의 관계에 따라서 어떤 모양으로 데이터들을 담을지 결정한다. 데이터를 담는 모양새에 따라서 원하는 데이터를 찾을 때 효율성이 결정된다. 데이터 사이의 관계에는 1:1, 1:N, N:M 관계가 있다.

  • 1:1 - 하나의 데이터에 하나의 데이터만 대응하는 관계. 사람과 주민등록번호 간의 관계.
  • 1:N - 하나의 데이터에 다수의 데이터가 대응하는 관계. 사람과 이름 간의 관계. 사람은 하나의 이름을 가지지만, 동명이인은 흔하다.
  • N:M - 다수의 데이터에 다수의 데이터가 대응하는 관계. 사람과 취미 간의 관계. 한 사람은 다양한 취미를 가질 수 있고, 하나의 취미를 향유하는 사람도 다양하다.

3. mysql2

[ Node MySQL 2 ]
데이터베이스 시스템 중 하나인 MySQL에 접속, 데이터 업데이트, 데이터 찾기 등 많은 일을 Node.js에서 할 수 있도록 만든 MySQL 클라이언트이다. 기본 사용법은 다음과 같다.

const mysql = require('mysql2');

// MySQL 접속을 구성한다
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  database: 'test'
});

// 쿼리를 작성할 때 사용하는 메서드 query()
connection.query(
  'SELECT * FROM `table` WHERE `name` = "Page" AND `age` > 45',
  function(err, results) {
    console.log(results);
  }
);

// 쿼리문의 '?' 자리에 두번째 인자로 넘겨주는 배열 안 요소들이 차례로 대입된다
connection.query(
  'SELECT * FROM `table` WHERE `name` = ? AND `age` > ?',
  ['Page', 45],
  function(err, results) {
    console.log(results);
  }
);

4. Sequelize

[ Sequelize ORM ]
ORM은 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다. 그로써 객체 지향 프로그래밍에서 사용하는 클래스와 관계형 데이터베이스에서 사용하는 테이블 사이의 구조 불일치를 해결한다. 대표적인 ORM으로 Sequelize가 있다.

const Sequelize = require('sequelize');

// MySQL과 연결생성
const sequelize = new Sequelize('databaseName', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql'
});

// firstName, lastName이라는 column을 가진 user라는 테이블을 모델링한다.
const User = sequelize.define('user', {
  firstName: {
    type: Sequelize.STRING,
    allowNull: false
  },
  lastName: {
    type: Sequelize.STRING
  }
});

// 테이블명.sync()를 이용해서 테이블을 생성하고, 그 후 create()로 데이터를 입력한다.
// 기본적으로 Promise 객체를 반환하므로 then(), catch() 등을 이용하여 동작을 이어갈 수 있다.
User.sync()
  .then(() => {
  return User.create({
    firstName: 'John',
    lastName: 'Hancock'
  });
});

// SQL의 SELECT문과 같은 findAll()
User.findAll()
  .then(users => {
  console.log("All users:", JSON.stringify(users));
});

스프린트 진행 중 참고한 글들

profile
👩🏻‍💻

0개의 댓글