시퀄라이즈는 nodejs에서 데이터베이스를 쉽게 다룰 수 있도록 도와주는 라이브러리로, ORM(Object-relational Mapping)으로 분류된다.
ORM이란?
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.
Sequelize의 orm 구성방법은 아래 2가지가 있다.
sequelize-cli
데이터베이스가 구축되지않더라도, 프로젝트만 받아서 설정하고 서버실행만 하면 알아서 데이터베이스 테이블 생성해주는 라이브러리이다.
모델 코드 작성 → 자동 create문 변환 → RDB 테이블 생성sequelize-auto
데이터베이스를 이미 구축한 상태라면, 쓸모있는 라이브러리다.
이미 구축된 데이터베이스 스키마를 바탕으로 orm 모델을 자동으로 생성해준다.
이미 짜여진 테이블을 기반으로 → 자동으로 모델 코드 생성
여기서 cli란?
Command line interface의 약어이다.
터미널 명령어로 추가할때 보통 n-cli모듈을 설치한다.
$ npm i pg sequelize
$ npm i -g sequelize-cli
여기선 postgresql을 db예제로 사용한다.
이제 sequlize 명령어를 사용하여 초기화를 하자.
$ sequelize init
초기화를 진행하면 아래와 같은 폴더 및 파일들이 생긴다.
|-- config
| -- config.json
|-- migrations
|-- models
| -- index.js
|-- seeders
|-- ........
config : 데이터베이스 설정 파일, 사용자 이름, DB 이름, 비밀번호 등의 정보 들어있다.
migrations : 데이터베이스 스키마에 변경이 필요할 때마다 마이그레이션 코드를 만들어서 진행하는 것이다. 아래 명령어를 실행하면 migrations 폴더에 타임스탬프가 찍힌 파일이 하나 생성될 것이다.
models : 데이터베이스 각 테이블의 정보 및 필드타입을 정의하고 하나의 객체로 모은다.
seeders : 테이블에 기본 데이터를 넣고 싶은 경우에 사용한다.
module.exports = {
localhost: {
username: "postgres",
password: "postgres",
database: "test_db",
host: "localhost",
dialect: "postgres",
},
};
Model을 만드는 것도 아래의 예시 명령어와 같이 CLI로 가능하다.
Sequelize CLI를 통해 모델을 정의하고 마이그레이션을 통해 실제 데이터베이스에 반영이 가능
다음 예제는 name와 age를 가진 User 모델을 생성
$ sequelize model:generate --name User --attributes name:string,age:integer
이를 통해 아래와 같이 총 2개의 파일이 생성됨
models/user.js
"use strict";
const { Model } = require("sequelize");
module.exports = (sequelize, DataTypes) => {
class User extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here
}
}
User.init(
{
name: DataTypes.STRING,
age: DataTypes.INTEGER,
},
{
sequelize,
modelName: "User",
}
);
return User;
};
"use strict";
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable("Users", {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER,
},
name: {
type: Sequelize.STRING,
},
age: {
type: Sequelize.INTEGER,
},
createdAt: {
allowNull: false,
type: Sequelize.DATE,
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
},
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable("Users");
},
};
id, createdAt, updatedAt 필드는 정의하지 않아도 자동으로 생성
그리고 up과 down으로 구분
up : 마이그레이션을 진행할 때 수행할 로직
down : 적용된 마이그레이션을 되돌릴 때 수행할 로직
실제 데이터베이스에 반영하기 위해 마이그레이션 진행
$ sequelize db:migrate
마이그레이션을 진행한 후 실제 데이터베이스를 살펴보면, 앞에서 정의한 필드와 함께 Users 테이블이 생성됨
마이그레이션을 취소할 때에는 명령어 뒤에 undo 삽입
$ sequelize db:migrate:undo