Sequelize.js 다루기

Sequelize.js란 Node.js 기반의 ORM(Object-Releation-Mapping)이다. SQL Query문을 사용하지 않고 자바스크립트만을 이용하여 SQL을 사용할 수 있도록 도와주는 라이브러리이다.

공식문서에 따르면 PostgreSQL, MySQL, MariaDB, SQLite, MS-SQL을 지원한다. 공식문서

sequlize module 설치

$ npm install sequelize

사용할 SQL module 설치

# MySQL
$ npm install mysql2

# PostgreSQL
$ npm install pg pg-hstore 

# Microsoft SQL
$ npm install tedious 

sequelize-cli 전역 설치

$ npm install -g sequelize-cli

# sequelize initialize
$ sequelize init

sequelize init 명령어를 통해 초기화를 하게 되면 config, migrations, models, seeders 폴더가 생성된다.

연동하기

/config/config.json

{
  "development": {
    "username": "", // 데이터베이스 사용자 명
    "password": "", // 데이터베이스 비밀번호
    "database": "", // 데이터베이스 이름
    "host": "127.0.0.1",  // 데이터베이스 호스트
    "dialect": "mysql", // 사용할 데이터베이스
    "operatorsAliases": false
  },
}

/models/index.js

const Sequelize = require("sequelize");
const env = process.env.NODE_ENV || "development";
const config = require(__dirname + "/../config/config.json")[env];
const db = {};
 
const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
);

// DB Models...

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

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

module.exports = db;

모델 만들기

모델 정의는 sequelize 내장 함수 define()을 사용한다. 데이터 타입

/models/user.js

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define(
    "User", // 테이블 명
    // 스키마 정의
    {
      email: {
        type: DataTypes.STRING(100), // 40자 이내
        allowNull: false, // 필수
        unique: true, // 중복 금지
      },
      nickname: {
        type: DataTypes.STRING(100),
        allowNull: false, // 필수
      },
      password: {
        type: DataTypes.STRING(100),
        allowNull: false,
      },
      // id, createdAt, updatedAt => 필드 자동 생성
    },
    // 테이블 옵션
    {
      charset: 'utf8',
      collate: "utf8_general_ci", // 한글 저장되도록
    }
  );

  return User;
};

관계 정의하기

  • BelongsTo
  • HasOne
  • HasMany
  • BelongsToMany

1:1 관계 => hasOne(), belongsTo()
1:N 관계 => hasMany(), belongsTo()
N:M 관계 => belongsToMany() => N:M 관계에 있어 교차 테이블을 생성해야 하며, 교차 테이블은 { through: '교차 테이블명' }와 같이 through 프로퍼티로 정의해줄 수 있다.

1:N 관계

“한 User는 여러개의 Post를 가지고 있을 수 있다.” (1:N의 관계)

관계 정의를 위해 Post 모델 정의,

/modes/post.js

module.exports = (sequelize, DataTypes) => {
  const Post = sequelize.define(
    "Post",
    {
      content: {
        type: DataTypes.TEXT, // 매우 긴 글
        allowNull: false,
      },
    }
    {
      chartset: "utf8mb4", // mb4 => 이모티콘 허용하기 위해
      collate: "utf8mb4_general_ci",
    }
  );

  return Post;
}

/models/user.js

module.exports = (sequelize, DataTypes) => {
  ...

  // 관계 정의
  User.associate = db => {
    db.User.hasMany(db.Post);
  }

  return User;
}

/modes/post.js

module.exports = (sequelize, DataTypes) => {
  ...

  Post.associate = db => {
    db.Post.belongsTo(db.User);
  }

  return Post;
}

N:M 관계

관계 정의를 위해 Hashtag 모델 정의,

/models/hashtag.js

module.exports = (sequelize, DataTypes) => {
  const Hashtag = sequelize.define(
    "Hashtag",
    {
      name: {
        type: DataTypes.STRING(20),
        allowNull: false,
      },
    },
    {
      charset: "utf8mb4",
      collate: "utf8mb4_general_ci",
    }
  );

  Hashtag.associate = (db) => {
    db.Hashtag.belongsToMany(db.Post, {
      through: "PostHashtag",
    });
  };

  return Hashtag;
};

/modes/post.js

module.exports = (sequelize, DataTypes) => {
  ...

  Post.associate = db => {
    db.Post.belongsTo(db.User);
    db.Post.blongsToMany(db.Hashtag, {
      through: "PostHashtag",
    });
  }

  return Post;
};

Written by@Jkun
...

GitHub