mysql과 sequelize 연동하기 by. react-bird

김수정·2020년 1월 16일
0

mysql 설치

와우.. 처음 설치해보는 DB입니다.. 두근두근했는데 역시나 잘 깔리지 않았어요 ㅠ_ㅠ
homebrew를 이용해 설치했지만 결국 환경변수 설정도 필요했습니다.

brew install mysql@5.7
brew services start mysql

homebrew를 설치했다는 가정하에 brew 명령어로 디비를 설치합니다.
그리고 mysql을 실행합니다.

mysql_secure_installation

그리고 위와 같이 작성했는데 not found같은 오류가 나온다면 환경변수 설정이 안된 것입니다. 이 것 때문에 또 한참 찾아다닌...ㅠㅠ

처음에 mysql을 설치할 때 나온 문구들 중에서 echo로 시작하는 부분 복사해서 터미널에 실행시킨 후, 터미널을 끄고 다시 켠 다음에 해보시면 될거예요.

그 다음 다시 위 명령어를 치면 나머지는 다 n, password 부분만 비밀번호를 설정해주세요.
해석이 가능하고 보안에 신경을 쓰신다면 다 n을 하지 마시고 보구서 설정해주시면 됩니다. 개발 연습용에서는 굳이 할 필요 없어서 다 N를 적어둡니다.

mysql workbench 설치

터미널에서 복잡하고 긴 디비를 보기 힘드므로 gui환경으로 디비를 볼 수 있는 프로그램.
https://dev.mysql.com/downloads/workbench/ 로 들어가서 다운로드하면 끝.

sequelize 설정

sequelize를 할 수 있는 디렉토리 구조를 자동으로 설치해 줍니다. config, models, migrations, seeders폴더가 생성됩니다.

npm i -g sequalize-cli // 전역설치가 안되어 있을 시 설치
sequelize init

1) config

config/config.json에서 DB에 관한 정보를 저장합니다. 비밀번호 부분을 바꿔줘야겠죠.

2) models

index.js에 아래와 같이 적습니다. sequelize를 사용하기 위한 설정 같은데 별 설명이 없었어서 이 부분은 아직 이해는 못했습니다.
models에서 테이블을 만듭니다.

const Sequelize = require('sequelize');

const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];

const db = {};

const sequelize = new Sequelize(config.database, config.username, config.password, config);

// 테이블 sequelize에 연결
db.Comment = require('./comment')(sequelize, Sequelize);

Object.keys(db).forEach((modelName) => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

3) table

models 폴더 아래에 놓인 파일들이 하나의 테이블이 됩니다.
ERD를 통해 데이터의 관계를 설계할 수 있습니다.

예를 들어 User 테이블이면,

module.exports = (sequelize, DataTypes) => {
  // sequelize.define에는 대문자로 시작하게 적지만 실제 테이블명은 users
  const User = sequelize.define('User', { // column정의
    nickname: {
      type: DataTypes.STRING(20), // 문자열. 20글자 이하
      allowNull: false, // 필수항목
    },
    userId: {
      type: DataTypes.STRING(20),
      allowNull: false,
      unique: true, // 고유한 값
    },
    password: {
      type: DataTypes.STRING(100),
      allowNull: false,
    },
  }, {
    charset: 'utf8',
    collate: 'utf8_general_ci', // charset과 colate를 해줘야 한글이 저장돼요.
    // tableName: 'users' // sequalize에서 자동으로 이렇게 만들어주지만 헷갈린다면 표시.
  });
  
  // 테이블간의 관계
  User.associate = (db) => {
    db.User.hasMany(db.Post, { as: 'Posts' }); // hasMany: 여러개의 Post 테이블을 가짐.
    db.User.hasMany(db.Comment);
    db.User.belongsToMany(db.Post, { through: 'Like', as: 'Liked' });
    db.User.belongsToMany(db.User, { through: 'Follow', as: 'Followers', foreignKey: 'followingId' }); // foreignKey : db 컬럼명.
    db.User.belongsToMany(db.User, { through: 'Follow', as: 'Followings', foreignKey: 'followerId' });
  };

  return User;
};

(1) DataTypes

  • STRING: 문자열
  • TEXT: 매우 긴 글

(2) charset

  • utf8: 다국어
  • utf8mb4: 다국어+이모티콘

(3) 테이블간의 관계 표현

  • A.hasmany(B, {as: 'C'}): A는 여러 개의 B테이블을 가질 수 있다. as: javascript에서 사용하는 db별칭. 그대로 데이터 key가 됨.
  • A.belongsTo(B): A는 B에 속하는 테이블이다. B테이블에 A 테이블의 id를 저장하는 column이 생김.
  • A.belongsToMany(B, {through: 'C', foreignKey: 'D'}): 다대다관계. A, B테이블 둘 다 적어주어야 함. through: 다대다 관계 사이에 생기는 중간 테이블. 서로 간의 관게를 정리한 테이블. foreignKey: as 보다 우선하는 키 설정값 관계를 나타내는 컬럼명 정의

DB와 application 연결

root/index.js

const express = require('express');

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

const app = express();
db.sequelize.sync(); // 테이블 생성

app.listen(9000, () => {
	console.log('server is running localhost:9000');
});
profile
정리하는 개발자

0개의 댓글