[DB] sequelize

jungeundelilahLEE·2021년 3월 1일
0

DB(DataBase)

목록 보기
8/8

goal

  • sequelize에 대해서 알아보자.

sequelize

  • Sequelize는 Postgres , MySQL , MariaDB , SQLite 및 Microsoft SQL Server를 위한 약속 기반 Node.js ORM
  • DB의 sql문을 js 객체로 대체할 수 있는 ORM (Object Relational Mapping)인 sequelize
    • Create 생성
    • Read 조회
    • Update 수정
    • Delete 삭제
  • sequelize 설치 : npm install --save sequelize
  • DB에 연결 : 사이트 참고

migration

  • Git과 같은 버전 제어 시스템을 사용해서 소스코드의 변경 사항을 관리하는 것처럼, 마이그레이션을 사용하여 데이터베이스의 변경사항을 추적할 수 있다. 마이그레이션을 통해 기존 데이터베이스를 다른 상태로 or 그 반대로 전송할 수 있다.

sequelize 설치 및 ORM 설정

  • sequelize CLI 설치 : 마이그레이션을 할 수 있도록 돕는 툴로, CLI에서 모델을 생성해주거나, 스키마 적용을 할 수 있도록 돕는다.
    : npm install --save-dev sequelize-cli

  • 다음으로는, CLI를 통해 ORM을 잘 사용할 수 있도록 bootstraping (프로젝트 초기 단계를 자동으로 설정할 수 있도록 도와주는 일)을 해줘야 한다.
    : npx sequelize-cli init (빈 프로젝트 만들기) 를 통해 실행

  • 성공적으로 bootstraping이 끝나면, 아래 폴더들이 생성된다.

    • config : 데이터베이스에 연결하는 방법을 CLI에 알려주는 구성 파일 포함
    • models : 프로젝트의 모든 모델을 포함합니다.
    • migrations : 모든 마이그레이션 파일 포함
    • seeders : 모든 시드 파일 포함

구성 (1) - config

  • 진행 전, 데이터베이스에 연결하는 방법을 CLI에 알려야 한다.
  • config/config.json 파일 예시
// like this
{
  "development": {
    "username": "root", // !!
    "password": null,
    "database": "database_development", // !!
    "host": "127.0.0.1",
    "dialect": "mysql" // 기본설정이 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"
  }
}

구성 (2) - models / index.js

  • sequelize의 핵심 파일
'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);

const env = process.env.NODE_ENV || 'development';
//! env : 환경설정 변수
// config 파일보면, sequelize 환경설정을 할 수 있다.
// "development" : 개발환경
// "test" : 테스트환경
// "production" : 배포환경
// username : DB 아이디
// password : DB 비번
// database : DB 이름
// host : local
// dialect : DB설정 (default로 mysql)
const config = require(__dirname + '/../config/config.json')[env];
//! config : 환경설정 계속
// __dirname 이 현재 실행 중인 폴더 경로 + config.json파일에서 
// 전체가 하나의 객체로 묶여 있음
// 그 중, 변수 env는 현재, "development"로 설정했으므로, 
// const config =
// "development": {
//   "username": "root",
//   "password": ,
//   "database": "database_development",
//   "host": "127.0.0.1",
//   "dialect": "mysql"
// } 이 객체를 가져온다.
// 객체에 키를 넣듯이, [env]로 추가한다.

const db = {};
// 변수 db에 빈 객체 생성

let sequelize;

if (config.use_env_variable) {
  //! 질문 : use_env_variable 이거는 뭐지?
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
  //! sequelize
  // Sequelize는 생성자, 인스턴스화(sequelize) 한다.
  // database, username, password와 나머지 정보를 가져온다.
}
  // 그 다음에 db객체에 (아래)


fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;
//! 위에서 만든 db객체( { } )에
// 인스턴스화 한 sequelize도 넣고
// Sequelize 패키지도 넣는다.
// 그 다음, 이 db객체를 exports로 내보낸다.
// db를 모듈로 사용하기 위함이다.

module.exports = db;

구성 (3) - migrations / 날짜-create-url.js

구성 (3) - models / url.js

// migration 파일

// - up은 테이블 생성, down은 테이블 삭제와 관련된 코드다.

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('urls', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      url: {
        type: Sequelize.STRING
      },
      title: {
        type: Sequelize.STRING
      },
      visits: {
        type: Sequelize.INTEGER,
        defaultValue:0 // 초기값을 0으로 설정
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('urls');
  }
};
// models/url.js 파일
const { Model } = require('sequelize');

module.exports = (sequelize, DataTypes) => {
  class url extends Model {
    
    static associate(models) {
    }
  };
  url.init({
    url: DataTypes.STRING,
    title: DataTypes.STRING,
    visits: {type:DataTypes.INTEGER, defaultValue:0}
  }, {
    sequelize,
    modelName: 'url',
  });
  return url;
};

  • 모델 생성
    : npx sequelize-cli model:generate --name Url --attributes url:string,title:string,visits:integer
    모델을 생성하는데, 테이블명은 Url, 필드는 url, title, visits 그리고 자동생성되는 createdAt, updadtedAt

  • running migration
    : npx sequelize-cli db:migrate

  • undo migration
    : npx sequelize-cli db:migrate:undo

profile
delilah's journey

0개의 댓글