들어가기

NodeJS를 사용할 때에 보통 mongo + mongoose 를 많이 사용하지만, RDBS 를 사용해야 할 때가 있다. 물론 데이터베이스에 직접 연결하여 쿼리문을 사용할 수도 있지만, 생산성을 위하여 ORM을 사용하는 것이 좋을 것이다.

이럴 때 사용하는 것이 NodeJS 기반의 ORM(Object-Releational-Mapping)SquelizeJS 이다. SquelizeJS는 공식적으로 MySQL, MariaDB, SQLite, MS-SQL을 지원한다.

Document : https://sequelize.org/master/manual/getting-started.html

설치

먼저 sequelize를 설치하고

$ npm install sequelize

사용하는 Database에 따른 모듈도 따로 설치해주어야한다

# One of the following:
$ npm install --save pg pg-hstore # Postgres
$ npm install --save mysql2
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # Microsoft SQL Server

연결하기

연결에는 두가지 방법이 있다

1) 파라미터 방식

const Sequelize = require('sequelize');

// Option 1: Passing parameters separately
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: /* one of 'mysql' | 'mariadb' | 'postgres' | 'mssql' */
});

2) URL 방식

const Sequelize = require('sequelize');

// Option 2 : Passing a connection URI
const sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname');

! 연결 하기 전에 기본적으로 DB 서버에 Database와 User를 만들어야한다

연결 확인

DB서버와 잘 연결 되었는지 확인해보자

sequelize
  .authenticate()
  .then(() => {
    console.log("🔵 Connected to DB successfully.");
  })
  .catch(err => {
    console.error("🔴 Unable to connect to the database:", err);
  });

사용하기

자 이제 SequelizeJS를 이용하여 DB를 제어해보자

모델 생성

sequelize.define() 함수를 사용할 것인데, 인자로
1.모델명, 2.파라미터 속성, 3.config 옵션이 들어간다

const Memo = sequelize.define(
  "Memo",
  {
    id: {
      type: Sequelize.INTEGER,
      primaryKey: true,
      autoIncrement: true
    },
    title: {
      type: Sequelize.STRING,
      allowNull: true
    },
    body: {
      type: Sequelize.STRING,
      allowNull: true
    }
  },
  {
    freezeTableName: true,
    underscored: true,
    tableName: "memo"
  }
);

파라미터 속성

  • type : Data type
  • primaryKey : 기본키 인지 아닌지 설정 (default: false)
  • autoIncrement : SERIAL(auto increment)인지 아닌지 (default: false)
  • allowNull : NOT NULL 조건인지 아닌지 (default: true)
  • unique : Unique조건인지 아닌지에 대한 옵션. column하나로만 이루어진 unique라면 true/false로 지정한다. 복수개의 column이라면 동일한 문자열을 각 column의 unique속성에 넣어준다.
  • comment : column에 대한 comment
  • validate : 각 column에 대한 validation check옵션을 넣어준다.

config 옵션

  • timestamps : Sequelize는 테이블을 생성한 후 자동적으로 createdAt, updatedAt column을 생성한다. Database에 해당 테이블이 언제 생성되었고 가장 최근에 수정된 시간이 언제인지 추적할 수 있도록 해준다. 기능을 끄려면 false로 설정한다.
  • paranoid : paranoid가 true이면 deletedAt column이 table에 추가된다. 해당 row를 삭제시 실제로 데이터가 삭제되지 않고 deletedAt에 삭제된 날짜가 추가되며 deletedAt에 날짜가 표기된 row는 find작업시 제외된다. 즉 데이터는 삭제되지 않지만 삭제된 효과를 준다. timestamps 옵션이 true여야만 사용할 수 있다.
  • underscored : true이면 column이름을 camalCase가 아닌 underscore방식으로 사용한다.
  • freezeTableName : Sequelize는 define method의 첫번째 파라미터 값으로 tablename을 자동변환하는데 true이면 이작업을 하지 않도록 한다.
  • tableName : 실제 Table name
  • comment : table 에 대한 comment

모델 동기화

Sequelize에는 DML문 뿐만 아니라 DDL문도 지원하는데, model을 이용하여 DDL을 적용하고 싶다면 따로 동기화를 시켜야한다. 이때 sync()메서드를 사용한다

const Memo = sequelize.define(
  "Memo",
  {
    id: {
      type: Sequelize.INTEGER,
      primaryKey: true,
      autoIncrement: true
    }
  },
  {
    freezeTableName: true,
    underscored: true,
    tableName: "memo"
  }
);
Memo.sync();

이렇게 Memo.sync()를 작성해야 실제 데이터베이스에 테이블이 생성된다.

default로 해당 이름의 테이블이 존재하면 생성하지않고, 존재하지 않아야만 생성한다

CREATE - 생성

model.create({
  title: 'hello',
  body: 'test data'
})

SELECT - 조회

model.findAll({
  //options
})
.then(results => console.log(results))
.catch(err => console.log(err));

// 이외에도 아래와 같은 메서드들이 있다
model.find()  // findOne과 같음
model.findOne()
model.count()  // 검색된 수를 반환
model.findAndCount() // 결과와 수를 함께 반환

options

  • where : 조건 ex. { id : 1 }
  • attributes : 검색할 속성 (이 속성들만 결과에 포함된다) ex. ['id', 'title']
  • order : 정렬 ex. 'pub_id DESC' | [['pub_id', 'DESC']]
  • limit, offset : 갯수제한, 시작 포인트

    ex)
    SELECT * FROM table LIMIT 10 OFFSET 20;
    { limit : 10, offset : 20 } >> 결과의 20번째부터 10개의 목록