MySQL

chu·2021년 3월 26일
0

전 시간에는 express를 사용한 웹 서버에 대해서 정리를 했다.
하지만, 웹 서버에서 데이터는 새로고침만 하면 사라진다.

이번엔 웹이 아닌 하드디스크, SSD 등의 저장 매체에 데이터를 저장하여, 새로고침을 해도 저장한 데이터를 그대로 사용할 수 있도록 해보자.


MySQL

MySQL은 관계형 데이터베이스 관리 시스템(RDBMS)으로, 데이터베이스를 관리하거나 자료를 관리하기 위한 GUI 관리툴은 내장되어 있지 않다. 따라서 이용자들은 명령 줄 인터페이스 도구들을 이용하거나 또는 데이터베이스를 만들고, 관리하고, 데이터를 백업하는데, 상태를 검사하고, 데이터베이스 구조를 생성하는데, 또는 데이터 레코더를 작성하는데 있어서 MySQL 프론트엔드 데스크톱 소프트웨어나 웹 애플리케이션을 사용해야 한다.

공식적인 MySQL 프론트엔드 툴인 MySQL 워크벤치는 오라클에 의해 개발되었으며, 자유롭게 사용할 수 있다.

즉, UI적으로 데이터를 볼 수 있고, 수정, 삭제 등 편리하게
사용할 수 있는 툴이다.

[위키백과]

설치에 대해서는 구글링하면 쉽게 알 수 있다.

MySQL를 사용하려면 SQL 언어를 알아야한다.

하지만, 간단한 작업이라면 이 SQL의 언어를 사용하지 않고,
javascript 사용자라면 시퀄라이즈 ORM을 사용하여,
비교적 쉽게 DB를 구축할 수 있다.

추후 이 지식으로 백을 구축하고, 리액트로 프론트를 구축하여 간단한 포트폴리오를 만들 계획이기 때문에, 시퀄라이즈 ORM으로 어떻게 DB를 구축하는지 정리할 예정이다.

그렇다 이번 시간은 MySQL에 대한 정리보단 시퀄라이즈로
어떻게 DB를 구축하고, express와 연결하여 데이터를 어떻게
CRUD를 하는지에 대해서 중점으로 정리할거다.

ORM

ORM이란?

Object Relational Mapping의 줄임말로 객체 관계 매핑이라는 뜻이다. 데이터베이스와 객체 지향 프로그래밍 언어를 호환되지 않는 데이터를 변환시키는 프로그래밍 기법이다.

그 중 sequelize(시퀄라이즈)를 사용하면, 자바스크립트 문법으로 데이터베이스를 조작할 수 있다.

sequelize

간단하게는 SQL 작업을 쉽게 할 수 있도록 도와주는 도구다.

MySQL 외에도 다른 RDB(Maria, Postgre, SQLite, MSSQL) 와도 호환된다.

다만, 유의할 점은 이 ORM이 SQL을 완벽한 작업을 진행하기 는 힘들다고 한다. 프로젝트가 어느 규모에 따라서 시퀄라이즈로도 충분하기도 하고, SQL로 진행을 해야하는 규모도 있다고 한다.

실제 개발자로써 일을 하게 된다면, SQL에 대해서 더 공부하는 것이 좋을 것 같다.

install

npm i sequelize
npm i sequlize-cli
npm i mysql2

MySQL를 설치했는데 왜 또 mysql2를 설치하죠?

mysql2는 Node.js와 MySQL를 연결시켜주는 역할을 하는 도구이다.

sequelize init

프론트엔드에서도 npm init을 해서 작업 전 설정을 하는 것 처럼 시퀄라이즈를 사용하기 전에 init을 해준다.

npx sequelize init

입력하게 되면 config, models, seeders, migrations의 폴더가 자동으로 생성이 된다.

config/config.json

{
  "development": { // 개발 시
    "username": "root",
    "password": "password",
    "database": "nodebird",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": { // 테스트 시
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": { // 배포 시
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

우리는 개발을 하기 위해서 development에 대한 설정을
간단히 진행할 것이다.

username - DB 사용자 이름
password - DB 사용자 비밀번호 (진입 시 필요)
database - database 이름

정도만 설정을 해주자. 다음 app.js에 실행 코드를 넣어주자.

app.js

sequelize.sync({ force: false })
    .then(() => {
        console.log('데이터베이스 연결 성공');
    })
    .catch((err) => {
        console.error(err);
    })

app.js에서 위 코드를 발견하면 sequelize를 실행한다.
실행을 통해서 nodejs와 MySQL을 연결시켜주고,
또한 생성된 model의 데이터를 생성시켜준다.

여기서 force: false는 무엇일까?

force : true
model 수정 시 테이블이 지워지고, 다시 테이블 생성 (데이터 지워짐) (사용 X)

force : false
model 수정 시 테이블에 변경 없다. (개발용)

alter : true
안전하지만, 기존 데이터와 안맞는 경우가 있어서 문제가 생길 수 있다. (사용 X)

즉 위에서 얘기했던 것처럼 완벽하게 MySQL를 조작하기에는
부족한 점이 있다. 제작한 model을 수정할 시에는 직접
워크벤치에서 수정, 삭제 등 처리를 해줘야한다고 한다.
(이 부분을 쉽게 할 수 있는 방법이 있다면 피드백좀 ㅜ)

이 작업을 실행 전 model을 만들어보자.

models/user.js

model은 우리가 데이터를 어떤 구조로 관리를 할 것인지를
정해주는 과정이다.

// 제작한 User라는 데이터를 MySQL과 연결하기 위함
const Sequelize = require('sequelize');

// 아래처럼 생성하고자 하는 데이터를 만들어준다.
module.exports = class User extends Sequelize.Model {
  static init(sequelize) {
    return super.init({
      email: { // 이메일
        type: Sequelize.STRING(40), // 40자 이내 글자
        allowNull: true, // 필수 아님,
        unique: true, // 고유의 값
      },
      nick: { // 닉네임
        type: Sequelize.STRING(15), // 15자 이내 글자
        allowNull: false,
      },
      password: { // 비밀번호
        type: Sequelize.STRING(100), // 100자 이내 글자
        allowNull: true,
      },
      provider: {
        type: Sequelize.STRING(10), // 10자 이내 글자
        allowNull: false,
        defaultValue: 'local',
      },
      snsId: { // sns 아이디
        type: Sequelize.STRING(30), // SNS ID 처럼 저장
        allowNull: true,
      },
    }, { /*시퀄라이즈 설정부분*/ });
  }
  /*시퀄라이즈 관계 설정*/
};

시퀄라이즈 설정

{
  sequelize,
  timestamps: true, // createAt, updateAt 자동 생성
  underscored: false, // sequelize에서 _ 사용할지 말지 ex) createAt -> create_at
  paranoid: true, // deleteAt을 생성 (삭제한 날짜)
  modelName: 'User', // modelName - javascript에서 쓰인다.
  tableName: 'users', // tableName - SQL에서 쓰이며, modelName의 소문자로 하고, 복수형으로 짓는다.
  charset: 'utf8', // 한글
  collate: 'utf8_general_ci',
}

시퀄라이즈 관계 설정

static associate(db) {
  // 1:다 관계 : 하나의 유저는 여러 게시글을 쓸 수 있다.
  db.User.hasMany(db.Post);

  // 다:다 관계 : 하나의 유저는 여러 팔로우를 할 수 있지만, 같은 테이블 안에서는 다:다 관계유지
  db.User.belongsToMany(db.User, { 
    foreignKey: 'followingId',
    as: 'Followers', // 이름을 변경하고, getFollowers하면 쉽게 불러올 수 있다.
    through: 'Follow', // 다:다 관계에서는 중간 테이블이 생성되고, 그 테이블의 이름이다.
  });
  db.User.belongsToMany(db.User, { 
    foreignKey: 'followerId',
    as: 'Followings',
    through: 'Follow',
  })
}

위 처럼 관계형 데이터베이스는 데이터끼리 관계가 어떤지
설정을 해줘야하는데 실제 개인 포트폴리오 작업에는 이 부분에서 꽤나 시간을 투자할 것 같다.😭

이 부분의 설명은 설명이 잘 되어있는 블로그를 참고해보자.
복잡하기가 너무 복잡했다.

여러번 나눠서 보여줘서 많아 보이지만 실제는 60줄 밖에 안되는 코드다.

이 외에도 필요한 post, hashtag model도 만들어주면,
간단한 DB를 구축할 수 있다.

만약에 모두 만들었다면,

npx sequelize db:create

이렇게 터미널에 작성을 해주면 작동이 되면서, MySQL DB가 생성이 된다.

시퀄라이즈 쿼리

위 처럼 진행을 해서 DB를 생성했다고 하자.
그럼 생성도해보고, 조회도 해보는 방법을 알아보자.

// 위에서 만든 User model을 불러온다.
const { User } = require('../models');
// 생성 시퀄라이즈 쿼리
User.create({
  name: 'chu',
  age: 30,
  married: false,
  comment: '자기소개'
});

위의 쿼리를 SQL문으로 바꾸게되면 아래처럼 된다.

INSERT INTO nodejs.users(name, age, married, comment) VALUES ('chu',30,0,'자기소개');

추가적으로 이런 SQL문은 프롬프트 뿐만 아니라 시퀄라이즈에서도 작성할 수 있다.
VALUES에서 0은 false를 뜻하고, 1은 true를 뜻한다.

생성한 user를 찾아오자!

// 시퀄라이즈 쿼리로 모두 찾아오기.
// findAll - [{}, {}, {}] 이렇게 찾아오게 된다.
User.findAll({});

게다가 findAll, findOne 등 사용 시에는 Promise기 때문에 await을 적어줘야 한다.

try {
  const me = await User.findAll({});
} catch(err) {
  consoel.error(err);
}

원하는 데이터만 찾아올 수 있다!

User.findAll({
  attributes: ['name', 'married'],
});

조건문으로 데이터를 찾아오자!

const { OP } = require('sequelize');
const { User } = require('../models');
User.findAll({
  attributes: ['name', 'age'],
  where: {
    married: true, // 결혼 한 사람
    age: { [Op.gt]: 30}, // 30실 초과
  }
});

시퀄라이즈 쿼리에서 조건은 where을 사용하면 된다.
여기서 Op는 무엇인가? 시퀄라이즈의 연산자 기능이다.

Op.gt === > or <
즉, 부등호를 생각하면 쉽다. 물론 이 안에는 다양한 기능들이 있고, 다른 기능을 알고 싶다면 구글링을 해보자.

이 이상의 쿼리 내용이 더 많지만, 잠시 쉬는 시간을 갖고!
다음 시간에 더 다양한 내용을 정리하겠다.

추가적으로 위에 시퀄라이즈 설정만으로 데이터베이스가 생성되는건 아니다 index.js에서 생성된 모델과 관계를 마지막으로
설정을 해줘야한다.

미리 보여주지 않는 이유는 코드의 정확한 개념을 잡고,
추가적으로 작성을 하려고 해서다. 그럼 개념을 더 잡아보고!
수정을 하도록 하겠다.

profile
한 걸음 한걸음 / 현재는 알고리즘 공부 중!

0개의 댓글