[Node.js] Sequelize란? Sequelize사용법

resilient

·

2021. 7. 13. 18:03

728x90
반응형

나는 처음 노드로 개발을 시작했을 때 부터 지금 까지는 MySQL쿼리를 직접 작성해서 RDBMS를 구현하였다. 하지만 요즘에는 효율적인 ORM들이 있고, 그중에 대표적인 ORM인 Sequelize가 있다. 이번시간에는 Sequelize에 대해서 알아보고, 사용법에 대해 알아보도록 하자.

 

Sequelize란?

먼저 ORM(Object-Relational Mapping)은 객체지향 패러다임을 활용하여 관계형 데이터베이스(RDB)의 데이터를 조작하게 하는 기술이다. 이를 활용하면 쿼리를 작성하지 않고도 객체의 메서드를 활용하는 것처럼 쿼리 로직을 작성할 수 있다.

Sequelize는 MySQL, PostgreSQL, MariaDB 등 많은 RDBMS를 지원하고 Promise 기반으로 구현되었기 때문에 비동기 로직을 편리하게 작성할 수 있다.

 

Sequelize사용법

먼저 Sequelize를 사용하기 위해서 아래 3가지 패키지들을 터미널에서 명령어를 이용해서 설치해준다.

npm install sequelize // 시퀄라이즈 설치
npm install mysql2 // mysql2 설치
npm install -g sequelize-cli // sequelize-cli를 전역으로 설치한다.

위에 3가지 설치가 완료되면, 아래와 같이 터미널에 sequelize init명령어를 사용해서 초기화를 시켜준다.

sequelize init

초기화를 시켜주면 config, models, migrations, seeders 와 같은 폴더들이 생긴다.

  • config : 데이터베이스 설정 파일, 사용자 이름, DB 이름, 비밀번호 등의 정보 들어있다.
  • migrations : git과 비슷하게, 데이터베이스 변화하는 과정들을 추적해나가는 정보로, 실제 데이터베이스에 반영할 수도 있고 변화를 취소할 수도 있다.
  • models : 데이터베이스 각 테이블의 정보 및 필드타입을 정의하고 하나의 객체로 모은다.
  • seeders : 테이블에 기본 데이터를 넣고 싶은 경우에 사용한다.

데이터베이스 관련 설정 파일인 config.json 이 있다. 여기선 로컬 MySQL을 사용하기로 하고 Student 란 이름의 데이터베이스를 생성해보자. 나의 경우 아이디/비밀번호 모두 root 이다.

mysql -uroot -p
create database student;
use student;

데이터베이스를 생성하고 선택하자. 이제 이 과정들에 대한 정보들을 config.json 에 적어주면 되는데 development , test , production 이 있기 때문에 모두 수정해준다.

 

모델 생성해서 데이터베이스에 반영하기

Sequelize CLI를 통해서 모델을 생성할 수 있고 마이그레이션을 통해 실제 데이터베이스에 반영할 수 있다. User 라는 모델을 생성해서 이 작업을 해보자. 아래코드는 모델을 생성하는 명령어이며 이를 통해 2가지 파일이 생성된다.

sequelize model:generate --name User --attributes user_id:integer,user_name:string
  • model/user.js
'use strict';
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    user_id: DataTypes.INTEGER,
    user_name: DataTypes.STRING
  }, {});
  User.associate = function(models) {
    // associations can be defined here
  };
  return User;
};

 

모델에 있는 필드들의 타입을 정의하고 각 모델간의 관계를 설정하는 associate 부분이 있다.

 

 

  • migration/[TIMESTAMP]-create-user.js
'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      user_id: {
        type: Sequelize.INTEGER
      },
      user_name: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Users');
  }
};

 

마이그레이션 파일이 타임스탬프 접미사와 같이 생성되고 id , createdAt , updatedAt 필드가 자동으로 생성된다. 여기서 up 프로퍼티는 실제 DB에 적용되는 부분이고 down 은 이 작업을 취소할 때이다. 여기선 user_id 를 primary key로 사용할 것이다.

 

기존에 테이블을 모두 만들어놓았을 경우에 ORM을 사용하기 위해선 이걸로부터 모델을 만들어야 했다. 하지만 Sequelize 자체에선 해당 기능을 제공하지 않았고 sequelize-auto 에서 제공하고 있었다. 따라서 이를 활용했다. 아래와 같이 명령어를 입력하고 설치를 해주고,

npm install -g sequelize-auto

 

아래와 같이 추출 명령어를 작성해서 DB를 sequelize로 추출한다.

sequelize-auto -o "./models" -d [db이름] -h [host이름] -u [사용자] -p [포트] -x [비밀번호] -e [데이터베이스종류]

 

 

  • 정리

 

지금까지 Node.js의 대표적인 ORM 패키지인 Sequelize의 기초를 살펴보았다. 기존의 일반적인 쿼리 방식에 비해 Sequelize가 갖는 장점은 객체지향 프로그래밍 방식에 익숙한 우리들에게 좀 더 효율적인 데이터 조작을 가능하게 해주는데 있다. 또한 SQL을 작성할 때 실수하는 부분들을 걱정할 염려가 없으니 굉장히 편리하다. 프로젝트의 크기가 매우 크다면 성능이슈에 대해 고려할 부분이 있겠지만 현재 시점에선 RDB를 다룰 때는 Sequelize가 필수일 정도로 반드시 익혀둬야 한다고 생각한다. 앞으로 TypeORM등 여러 ORM을 접해보려고 한다.

반응형