ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2023 - 06 - 24 시퀄라이즈 (Sequelize), ORM, RDBMS
    Today I Learned/TIL 06 2023. 6. 24. 01:27

    시퀄라이즈 Sequelize는 ORM으로써 자바스크립트 객체와 데이터베이스의 관계를 연결해주는 도구

    ORM = (Object Relation Mapping) 오브젝트 릴레이션 매핑, 객체관계연결도구

     

    시퀄라이즈 같은 ORM은 여러가지 관계형 데이터베이스 (RDB)를 사용할 수 있다. 예를들어 MySQL이나, Oracle, MariaDB, PostgreSQL등 다양한 데이터베이스를 사용할 수 있다.

     

    대표적인 관계형 데이터베이스는 MySQL, 비관계형 데이터베이스는 몽고DB등이 있다.

     

    시퀄라이즈와는 달리, 몽구스(Mongoose)는 ODM으로 자바스크립트 객체를 document와 연결하는 도구다.

    ODM = (Object Document Mapping) 오브젝트 다큐먼트 매핑

    NoSQ 계열 데이터베이스는 다 ODM이다.

    RDBMS = Relations Database Management system

    관계형 데이터베이스 (MySQL, Oracle 등)을 생성하고 수정하고 관리할 수 있는 소프트웨어

    시퀄라이즈가 대표적인 RDBMS이다.

     

    몽구스는 지원하는 데이터베이스가 MongoDB밖에 없지만, Sequelize의 경우 RDBMS에 해당하는 다양한 데이터베이스를 사용할 수 있다.

     

    mongoose의 경우 스키마(Schemas)의 형태컬렉션(Collection)의 속성을 정의했다면,

    sequelize의 경우 모델(Model)의 형태테이블(Table)의 속성을 설정할 수 있다.

     

    즉, 몽구스의 데이터베이스인 몽고디비의 컬렉션(Collection)과,

    시퀄라이즈의 데이터베이스인 MySQL의 테이블(Table)은 동일한 위상을 갖고있다.

     

    시퀄라이즈 라이브러리 설치

     

    npm install init -y
    
    npm install express sequelize mysql2
    
    npm install -D sequelize-cli nodemon
    
    npx sequelize init

     

    내 프로젝트 폴더 이름
    ├── models
    │   └── index.js
    ├── config
    │   └── config.json
    ├── migrations
    ├── seeders
    ├── package-lock.json
    └── package.json

     

    시퀄라이즈와 RDBMS 연결

    // config/config.json
    {
      "development": {
        "username": "root",
        "password": "4321aaaa",
        "database": "express_sequelize_init",
        "host": "express-database.clx5rpjtu59t.ap-northeast-2.rds.amazonaws.com",
        "dialect": "mysql"
      },
      "test": {
        // ...
      },
      "production": {
        // ...
      }
    }

    여기서 MySQL에서 사용하는 사용자 이름, 암호, 시퀄라이즈와 연결할 DB명, 엔드포인트(주소), DB엔진을

    연결하면 된다.  그리고 DB를 생성한다.

     

    시퀄라이즈 명령어 모음

     

    https://github.com/sequelize/cli#usage

     

    GitHub - sequelize/cli: The Sequelize CLI

    The Sequelize CLI. Contribute to sequelize/cli development by creating an account on GitHub.

    github.com

    # config/config.json의 database에 설정된 이름으로 DB를 생성
    npx sequelize db:create
    
    posts테이블 생성
    npx sequelize model:generate --name Posts --attributes title:string,content:string,password:string
    
    # migrations 폴더에 정의된 migration 파일들과 MySQL의 테이블을 맵핑시킵니다.
    npx sequelize db:migrate

     

    시퀄라이즈의 구성 2개 : migration, model

     

    migration : Sequelie CLI를 이용해 MySQL에 테이블을 생성하기 위해 사용한다.

     

    model : 특정 테이블과 컬럼의 속성값을 입력하여, MySQL과 Express 프로젝트를 연결(Mapping)해준다. 

     

    즉, migration 파일은 테이블을 '생성'하고, model파일은 MySQL과 실제 연결되어 사용될수 있도록 도와준다.

    만약 시퀄라이즈의 Model을 사용하지 않고 Posts테이블을 조회한다면, 아래와 같은 Raw Query를 사용해야 한다.

    SELECT postId, title, content, createdAt, updateAt
    FROM Posts;

    하지만 시퀄라이즈에서 Posts모델을 생성할 경우 아래 코드처럼 간단히 Posts테이블을 조회할 수 있고, 언제든지 컬럼이 추가 및 변경되어도 코드의 변화가 없다.

    const { Posts } = require("./models");
    const posts = Posts.findAll();

     

     

     

     

     

    마이그레이션 (migration)

    1. `allowNull`: `NULL` 값을 허용하는지 설정합니다.
        - `true`일 경우 `NULL`을 허용하고, `false`일 경우 `NOT NULL` 타입이 됩니다.
    2. `autoIncrement`: `[AUTO_INCREMENT](https://dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html)`로 설정합니다.
        - 데이터를 삽입할 때 해당 컬럼에 아무런 값을 입력하지 않더라도 1씩 증가하여 고유한 값을 유지합니다.
    3. `primaryKey`: 기본키로 설정합니다.
    4. `type`: 타입을 지정합니다.
        - `STRING`, `INTEGER`, `DATE` 등 다양한 타입을 지정할 수 있습니다.
        
        [→ Sequelize의 Data Types을 자세하게 알고싶다면 여기를 클릭하세요!](https://sequelize.org/docs/v7/other-topics/other-data-types/)
        
    5. `defaultValue`: 아무런 값이 입력되지 않았을 때, 기본값을 설정합니다.
        - 대표적으로 `createdAt`, `updatedAt`에서 `NOW`를 설정해, 현재 시간을 자동 삽입합니다.
    6. `unique`: 고유한 값만 들어올 수 있도록 설정합니다.
    'use strict';
    /** @type {import('sequelize-cli').Migration} */
    module.exports = {
      /**
       * @param {import("sequelize").QueryInterface} queryInterface - Sequelize Query Interface
       * @param {import("sequelize")} Sequelize - Sequelize
       * **/
      async up(queryInterface, Sequelize) {
        await queryInterface.createTable('Posts', {
          id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER
          },
          title: {
            type: Sequelize.STRING
          },
          content: {
            type: Sequelize.STRING
          },
          password: {
            type: Sequelize.STRING
          },
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE
          }
        });
      },
      async down(queryInterface, Sequelize) {
        await queryInterface.dropTable('Posts');
      }
    };

     

    - `postId`
        - 기본키, `AUTO_INCREMENT`
        - `NULL`은 허용하지 않음
        - `INTEGER` 타입
    - `title`
        - `NULL`은 허용하지 않음
        - `STRING` 타입
    - `content`
        - `NULL`은 허용하지 않음
        - `STRING` 타입
    - `password`
        - `NULL`은 허용하지 않음
        - `STRING` 타입
    - `createdAt`
        - `NULL`은 허용하지 않음
        - `DATE` 타입
        - 아무런 값을 입력하지 않았을 때, 현재 시간이 삽입됨
    - `updatedAt`
        - `NULL`은 허용하지 않음
        - `DATE` 타입
        - 아무런 값을 입력하지 않았을 때, 현재 시간이 삽입됨

     

    모델 (Model)

    model:generate로 생성된 migrations/posts.js 파일

    'use strict';
    /** @type {import('sequelize-cli').Migration} */
    module.exports = {
      /**
       * @param {import("sequelize").QueryInterface} queryInterface - Sequelize Query Interface
       * @param {import("sequelize")} Sequelize - Sequelize
       * **/
      async up(queryInterface, Sequelize) {
        await queryInterface.createTable('Posts', {
          id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER
          },
          title: {
            type: Sequelize.STRING
          },
          content: {
            type: Sequelize.STRING
          },
          password: {
            type: Sequelize.STRING
          },
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE
          }
        });
      },
      async down(queryInterface, Sequelize) {
        await queryInterface.dropTable('Posts');
      }
    };

     

    댓글

Designed by Tistory.