시작하기

이 튜토리얼에서 기본을 배우기 위해 Sequelize를 간단하게 설정하는 방법을 배웁니다.

설치

Sequelize는 NPM 또는 yarn을 이용하여 사용할 수 있습니다.

$ npm install --save sequelize

또한 선택한 데이터베이스를 사용하기 위해 드라이버를 설치해야 합니다.

## 다음 중 하나를 실행(사용하는 디비에 맞게 설치)
$ 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

연결 설정

데이터베이스를 생성하기 위해, 당신은 Sequelize 인스턴스를 생성해야 합니다. 생성자에게 하나의 연결 URI를 전달하거나 연결 파라미터 변수를 개별적으로 전달하여 Sequelize 인스턴스 생성이 가능합니다.

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' */
});

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

Sequelize생성자는 API 레퍼런스를 통해 사용할 수 있는 다양한 옵션을 확인 할 수 있습니다.

참고: SQLite 설정

만약 SQLite를 사용한다면 다음과 같이 사용하십시오.

const sequelize = new Sequelize({
  dialect: 'sqlite',
  storage: 'path/to/database.sqlite'
});

참고: 커넥션 풀(프로덕션)

만약 당신이 단일 프로세스로 부터 데이터베이스를 연결한다면, 당신은 오직 하나의 Sequelize 인스턴스를 생성해야 합니다. Sequelize는 초기화할 때 커넥션 풀을 설정할 수 있습니다. 커넥션 풀은 생성자의 옵션 파라미터(options.pool 사용)를 통해 설정되고, 이것은 다음과 같이 예시를 따릅니다

const sequelize = new Sequelize(/* ... */, {
  // ...
  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  }
});

API Reference for the Sequelize constructor에서 더 많이 배울 수 있습니다. 만약 당신이 다수의 프로세스로부터 데이터베이스 연결을 한다면, 프로세스당 하나의 인스턴스를 생성해야 하며, 각각의 인스턴스는 최대 연결 풀 크기는 총 최대 크기를 준수해야 합니다. 예를들어, 만약 최대 커넥션이 90이고 3개의 프로세스를 가지고 있다면, Sequelize는 각 프로세스의 인스턴스는 최대 커넥션 풀 크기가 30입니다.

연결 테스트

당신은 .authenticate() 함수를 사용하여 옳바른 연결이 됬는지 테스트 할 수 있습니다.

sequelize
  .authenticate()
  .then(() => {
    console.log('Connection has been established successfully.');
  })
  .catch(err => {
    console.error('Unable to connect to the database:', err);
  });

연결 종료

Sequelize는 기본적으로 연결이 열린 상태를 유지하며, 쿼리를 위해 같은 커넥션을 사용합니다. 커넥션 종료가 필요하다면, sequelize.close()를 호출합니다 (비동기이며 Promise 반환).

모델 테이블

한 모델은 Sequelize.Model 확장하는 클랙스입니다. 모델은 두 가지 반법으로 정의될 수 있습니다. 첫 번째 방법은 Sequelize.Model.init(attributes, options)를 이용합니다.

const Model = Sequelize.Model;
class User extends Model {}
User.init({
  // 속성
  firstName: {
    type: Sequelize.STRING,
    allowNull: false
  },
  lastName: {
    type: Sequelize.STRING
    // allowNull 기본값 true
  }
}, {
  sequelize,
  modelName: 'user'
  // 옵션들
});

두 번째 방법은 sequelize.define을 이용합니다.

const User = sequelize.define('user', {
  // 속성
  firstName: {
    type: Sequelize.STRING,
    allowNull: false
  },
  lastName: {
    type: Sequelize.STRING
    // allowNull 기본값 true
  }
}, {
  // 옵션들
});

내부적으로 sequelize.defineModel.init을 호출합니다.

위의 코드는 Sequelize에게 firstNamelastName 필드를 가진 데이터베이스에서 users 이름을 가진 테이블을 바라보도록 합니다. 테이블 이름은 자동으로 복수형 형태로 생성하는게 기본값(복수 형태로 생성하기 위해 inflection 라이브러리가 후드 아래에서 사용)입니다. freezeTableName: true 옵션을 사용하여 특정 모델은 이 행위를 중단할 수 있으며, Sequelize 생성자 옵션 define을 사용하여 모든 모델에 대해 이 행위를 중단할 수 있습니다.

Sequelize는 id(primary key), createdAt 그리고 updatedAt 필드를 기본값으로 가진 모델을 정의합니다. 이 행위는 바꿀 수 있습니다 (사용 가능한 옵션을 더 배우기 위해 API 레퍼런스를 확인하세요).

모델 기본옵션 변경

Sequelize 생성자는 정의된 모든 모델의 기본 옵션을 변경하는 define 옵션을 사용합니다.

const sequelize = new Sequelize(connectionURI, {
  define: {
    // `timestamps` 필드는 createdAt, updatedAt 필드 사용을 하지않습니다.
    // 이 필드의 기본값은 true이며, 지금은 사용하지 않습니다.
    timestamps: false
  }
});

// 여기는 timestamps가 false 이며, `createdAt`과 `updatedAt`를 생성하지 않습니다. 
class Foo extends Model {}
Foo.init({ /* ... */ }, { sequelize });

// 여기는 timestamps가 false 이며, `createdAt`과 `updatedAt`를 생성하지 않습니다. 
class Bar extends Model {}
Bar.init({ /* ... */ }, { sequelize, timestamps: true });

당신은 model.init API 레퍼런스 또는 sequelize.define API 레퍼런스에서 모델생성 방법을 더 배울 수 있습니다.

데이터베이스와 모델 동기화

모델 정의에 따라 자동으로 테이블이 생성되기 원한다면, 다음과 같이 sync 메소드를 사용할 수 있습니다.

// 참고: `force: true`를 사용하는 것은 이미 테이블이 존재한다면 드랍시킵니다.
User.sync({ force: true }).then(() => {
  // 데이터베이스의 `users` 테이블은 모델 정의에 해당합니다. 
  return User.create({
    firstName: 'John',
    lastName: 'Hancock'
  });
});

한 번에 모든 모델 동기화

모든 모델을 위해 sync() 호출 대신 각 모델들마다 sync를 호출하는 함수 sequelize.sync()를 호출합니다.

프로덕션을 위함 참고사항

프로덕션 환경에서 sync() 호출 대신 마이그레이션(복제)을 사용하는 것이 좋습니다. 마이그레이션 가이드에서 더 배울 수 있습니다.

쿼리(조회)

아래는 간단한 조회 예제입니다.

// 모든 유저 조회
User.findAll().then(users => {
  console.log("All users:", JSON.stringify(users, null, 4));
});

// 새로운 유저 생성
User.create({ firstName: "Jane", lastName: "Doe" }).then(jane => {
  console.log("Jane's auto-generated ID:", jane.id);
});

// Jane 이름 모두 삭제
User.destroy({
  where: {
    firstName: "Jane"
  }
}).then(() => {
  console.log("Done");
});

// 빈 값lastName을 가진 모든 필드를 Doe로 변경
User.update({ lastName: "Doe" }, {
  where: {
    lastName: null
  }
}).then(() => {
  console.log("Done");
});

sequelize는 쿼리를 위해 많은 옵션을 가지고 있습니다. 다음 튜토리얼에서 이것들을 배울 수 있습니다. 만약 당신이 필요하다면, 이 것은 저수준의 SQL 쿼리를 만들 수 있습니다.

Promises와 async/await

Sequelize .than을 사용하여 Promise를 사용합니다. 이것은 노드 버전이 제공한다면 ES2017의 async/await 문법을 사용할 수 있습니다.

또한, 모든 Sequelize 프로미스는 Bluebird 프로미스이며, Bluebird의 다양한 API(예를들어, finally, tap, tapCatch, map, mapSeries, etc)를 사용할 수 있습니다. 만약 Bluebird의 특정 옵션을 설정하기를 원한다면, Sequelize.Promise와 함께 Sequelize에 의해 내부에서 사용된 Bluebird 생성자에 접근할 수 있습니다.