Node.js/sequelize

sequelize

honey.kikiki 2021. 11. 26. 22:47
728x90

sequelize란?

sequelize란 nodeJS에서 mysql을 사용할 때 raw Query문을 사용하지 않고 더욱 쉽게 다룰 수 있도록 도와주는 라이브러리이다. sequelize는 ORM(Object-Relational Mapping)로 분류가 됩니다.
ORM이란 객체와 관계형 데이터베이스의 관계를 매핑 해주는 도구이다.
sequelize를 사용하면 raw Query문을 사용하지 않고 자바스크립트를 이용해서 mysql을 사용할 수 있다.

 

sequelize 설치

npm i sequelize // 시퀄라이즈 설치
npm i mysql2 // mysql2 설치
npm i sequelize-cli // sequelize-cli 설치

설치후 sequelize init 

시퀄라이즈 기본 세팅이 완료된다.

 

sequelize 세팅하기

 

config.json

{
  "development": {
    "username": "root",
    "password": null
    "database": "database_development",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

config.json 세팅

비밀번호와 테이터 베이스 이름을 정한후

npx sequelize db:create 

mysql에 DB를 생성해준다

 

 

 

models 폴더의 index.js 파일을 새로 커스텀 해준다.

 

models/index.js 

const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];

const User = require('./user');

const db = {};

const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config,
);

db.sequelize = sequelize;

db.User = User;

User.init(sequelize);

// User.associate(db); 관계설정

module.exports = db;

sequlize 모델 파일을 설정하고

 

테이블을 만들어준다.

 

models/user.js 

 

const Sequelize = require('sequelize');

module.exports = class User extends Sequelize.Model {
  static init(sequelize) {
    return super.init(
      {
        name: {
          type: Sequelize.STRING(20),
          allowNull: false,
        },
        temperature: {
          type: Sequelize.INTEGER.UNSIGNED,
          allowNull: false,
        },
        score: {
          type: Sequelize.INTEGER.UNSIGNED,
          allowNull: false,
          defaultValue: 100,
        },
      },
      {
        sequelize,
        timestamps: true,
        underscored: false,
        modelName: 'User',
        tableName: 'users',
        paranoid: true,
        charset: 'utf8',
        collate: 'utf8_general_ci',
      },
    );
  }

  static associations(db) {}
};

모델 옵션 정리

  Mysql 시퀄라이즈
가변길이 문자형. 문자수가 최대 n개인 문자열. 공백 X VARCHAR(100) STRING(100)
문자수가 최대 65535개인 문자열 TEXT
TEXT
약 -21억 ~ 21억의 정수 INT INTEGER
실수 사용가능
FLOAT
FLOAT
아주 작은 범위의 정수 (-128~127) TINYINT BOOLEAN
년, 월, 일, 시, 분, 초. 'YYYY-MM-DD HH:MM:SS' 형식으로 사용 DATEETIME DATE
0과 양수만 허용 INT UNSIGNED INTEGER.UNSIGNED
특정 컬럼에 NULL 값이 들어갈 수 없도록 한다.
공백(' ')이나 0 같은 값과는 다르다.
NOT NULL allowNull:false
특정 컬럼의 값은 테이블 내에서 유일해야 한다.
PRIMARY KEY와 차이점은 NULL 값을 허용한다.
UNIQUE unique: true
값을 입력하지 않았을 때, 자동으로 입력되는 기본값을 정의한다. DEFAULT now() deafaultValue: Sequelize.NOW

테이블 옵션

true면 createdAt(생성시간) , updatedAt(수정시간) 자동으로 만듬 timestamps: true
true면 deletedAt(삭제시간) 컬럼을 만듬, 로우복구를 위해 완전히 삭제하지 않는다 paranoid
옵션은 카멜케이스 로 생성되는 컬럼을 스테이크케이스로 생성 underscored
모델의 이름 modelName
테이블 이름 tavleName
한글 설정을 위해 필요(이모티콘 넣으려면 (utf8mb4) charset , collate : utf8 or utf8mb4

 

app.js 

sequelize 세팅

const { sequelize } = require('./models');

sequelize
  .sync({ force: false })
  .then(() => {
    console.log('데이터베이스 연결 성공');
  })
  .catch((err) => {
    console.error(err);
  });

 

모델 동기화

모델을 정의할 때 Sequelize에게 데이터베이스의 테이블에 대한 몇 가지 정보를 알려줍니다. 그러나 테이블이 실제로 데이터베이스에 존재하지 않는다면 어떻게 될까요? 존재하지만 열이 다르거나 열이 적거나 다른 차이점이 있으면 어떻게 합니까?

여기서 모델 동기화가 시작됩니다. model.sync(options)Promise를 반환하는 비동기 함수인 를 호출하여 모델을 데이터베이스와 동기화할 수 있습니다 . 이 호출을 통해 Sequelize는 데이터베이스에 대한 SQL 쿼리를 자동으로 수행합니다. 이것은 JavaScript 측의 모델이 아니라 데이터베이스의 테이블만 변경합니다.

  • User.sync() - 존재하지 않는 경우 테이블을 생성합니다(이미 존재하는 경우 아무 작업도 수행하지 않음).
  • User.sync({ force: true }) - 이것은 테이블을 생성하고 이미 존재하는 경우 먼저 삭제합니다.
  • User.sync({ alter: true }) - 데이터베이스에 있는 테이블의 현재 상태(열이 있는 열, 데이터 유형이 무엇인지 등)를 확인한 다음 테이블에서 필요한 변경을 수행하여 모델과 일치하도록 합니다.

 

npm start 하면 테이블이 만들어진다. (package.json을 세팅해두기)