MySQL - 시퀄라이즈

kangdari·2020년 2월 17일
2

MySQL

RDBMS(Relational DBMS)라고 부르는 관계형 DBMS 중 하나로 가장 많이 쓰인다.

시퀄라이즈

Sequelize는 ORM(Object-relational Mapping)으로 분류된다. ORM은 자바스크립트 객체와 데이터베이스의 릴레이션을 매핑해주는 도구이다. 시퀄라이즈를 사용하면 SQL를 사용하지 않고도 자바스크립트로 MYSQL 조작이 가능하다.

express 프로젝트 설치 후 sequelize를 설치합니다.

$ npm i sequelize mysql2
$ npm i -g sequelize-cli
$ sequelize init

시퀄라이즈에 필요한 sequelize, mysql2 패키지와 sequelize-cli 패키지를 (전역)설치해줍니다. 설치 완료 후 sequelize init 명령어로 호출합니다.

명령어 호출 뒤 생성된 폴더 중 modle/index.js 파일을 수정해줍니다.

const path = require('path');
const Sequelize = require('sequelize');

const env = process.env.NODE_ENV || 'development';
const config = require(path.join(__dirname, '..', 'config', 'config.json'))[env];
const db = {};

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

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

module.exports = db;

MySQL 연결

... app.js
const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
const sequelize = require('./models/index').sequelize;

const app = express();
sequelize.sync(); // 서버 실행 시 MySQL 연동
...

모델 정의

MySQL의 테이블은 시퀄라이즈 모델과 대응된다. 시퀄라이즈는 모델과 MySQL의 테이블을 연동하는 역할을 합니다.

시퀄라이즈는 자동으로 ID를 기본 키로 연결합니다.

user 모델 작성

module.exports = (sequelize, DataTypes) => {
    return sequelize.define('user', { 
        name: {
            type: DataTypes.STRING(20), // VARCHAR
            allowNULL: false,
            unique: true,
        },
        age: {
            type: DataTypes.INTEGER.UNSIGNED,
            allowNULL: false,
        },
        married: {
            type: DataTypes.BOOLEAN, // TINYINT
            allowNULL: false,
        },
        comment: {
            type: DataTypes.TEXT, 
            allowNULL: true,
        },
        created_at: {
            type: DataTypes.DATE,
            allowNULL: false,
            defaultValue: DataTypes.NOW,
        },
    },{
        timestamps: false, // ture일 시 시퀄라이저는 createAt, updateAt 컬럼을 추가함.
    })
}

conmment 모델도 생성한 뒤 model/index.js에 연결합니다.

db.User = require('./user')(sequelize, Sequelize);
db.Comment = require('./comment')(sequelize, Sequelize);

마지막으로 config/config.json 파일을 수정합니다. MySQL의 비밀번호와 DB를 설정해줍니다.

  "development": {
    "username": "root",
    "password": "[비밀번호]",
    "database": "[database name]",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false
  },

관계 정의

사용자는 댓글을 여러 개 작성이 가능하고, 댓글은 작성자(사용자)가 한명이므로 1:N 관계입니다.

1 : N

시퀄라이즈에서는 1:N 관계를 hashMany라는 메서드로 표현합니다.

      hashMany (user 테이블의 로우 하나를 불러오면 연결된 connect 테이블의 로우들도 같이 불러옴)
      -------->
user            comment
      <--------
      belongsTo

model/index.js 에서 코드 추가

db.User = require('./user')(sequelize, Sequelize);
db.Comment = require('./comment')(sequelize, Sequelize);

db.User.hasMany(db.Comment, { foreignKey: 'commenter', sourceKey: 'id' });
db.Comment.belongsTo(db.User, { foreignKey: 'commenter', targetKey: 'id'});

시퀄라이즈는 방금 정의한 대로 테이블 간의 관계를 파악하여 commenter 컬림을 추가하고 외래키도 추가합니다. 외래키 컬럼은 commenter고, user의 id 컬럼을 가리킵니다.

npm start 서버를 실행

1 : 1

일대일 이므로 hasOne, belongsTo가 반대여도 상관없음.

       hasOne 
      -------->
user            comment
      <--------
      belongsTo
N : M

시퀄라이즈에서 N:M 관게를 표현하기 위해 belongsToMany 메서드가 있습니다.

쿼리 알아보기

  • 로우 생성 쿼리
INSERT INTO users (name, age, married, comment) VALUES ('zero, 24, 0, '소개1');

// 시퀄라이즈 쿼리문
const { User } = require('../models');
User.create({
  name: 'zero',
  age: 24,
  married: false,
  comment: '소개1',
});

데이터를 넣을 때는 시퀄라이즈 모델에 정의한 자료형대로 넣어야합니다.

  • 로우 조회
SELECT * FROM users;

User.findAll({}); // 모든 데이터 조회
SELECT * FROM users LIMIT 1;

User.findOne({}); // 하나의 데이터만 조회
SELECT name, married, FROM users;

User.findAll({
	attribute: ['name', 'married'], // 원하는 컴럼만 조회
});
SELECT name, age FROM users WHERE married = 1 AND age > 30;

const { User , Sequelize: { Op} } = require('../models');
User.findAll({
  attributes: ['name', 'age'],
  where: {
    married: 1,
    age: { [Op.gt]: 30},
  },
});

Op.gt(초과), Op.gte(이상), Op.lt(미만), Op.lie(이하), Op.ne(같지 않음), Op.or(또는), Op.in(배열 요소 중 하나), Op.notIn(배열 요소와 모두 다름) 등...

SELECT id, name FROM users ORDER BY age DESC;

User.findAll({
  attributes: ['id', 'name'],
  order: [['age', 'DESC']],
});
  • 로우 수정
UPDATE FROM users WHERE id = 2;

User.update({
   comment: '수정 내용',
},{
  where: { id: 2 },
});
``

* 로우 삭제

DELETE FROM users WHERE id = 2;

User.destory({
where: { id: 2 },
});

0개의 댓글