[TIL] Sequelize ORM

Alex J. Lee·2021년 11월 18일
0

TIL

목록 보기
53/58

오늘 스프린트는 정말 힘들었다. 일단 이전 스프린트들 처럼 파일에 TODO가 표시된 것이 아니라 어디에 무엇을 작성할 지 테스트케이스를 보고 유추해야 했다. ORM의 매핑이 무엇을 매핑하는 건지 정확하게 이해하지 못한 상태에서 무작정 사용하려고 하니 공식문서의 코드를 복붙은 했는데 이게 무엇을 하는건지 정확하게 몰라서 더 어려웠다. 그래도 꼼수(테스트 데이터 수동 입력)를 써가며 일단 테스트는 통과를 하게 만들었는데 내가 작성했다기보다는 짜집기한 누더기 코드에 가까워 보였고 이해를 해서 작성했다는 생각이 들지 않아 힘들었다. 그래도 스프린트 리뷰에서 엔지니어님께서 코드를 작성하는 과정을 설명과 함께 듣고 나니 이해가 됐다. models의 파일만 수정했을 때 테스트케이스가 통과가 안돼서 혹시 하고 migration 파일도 건드렸더니 통과가 되긴 했었는데 이게 맞게 하고 있는건지 의심이 들었었다. migration을 하기 전까지는 db에 테이블이 존재하지 않는 상태고 migration을 해야 테이블이 생성된다. 이 내용이 사실 공식문서에 나와있었는데 급하게 읽다보니 샘플코드만 보고 설명은 대충 훑어 넘겨서 보지 못했던 것 같다. 블로그 작성하려고 문서를 다시 쭉 읽어보니 Migration 섹션에 설명이 다 나와있다. 언제쯤 공식문서를 빠르고 정확하게 읽어낼 수 있을까...

Today I Learned

ORM

  • Object Relational Mapping

  • OOP의 객체를 구현한 클래스와 RDB의 테이블을 자동으로 매핑하는 것

  • 장점 : 쿼리문을 익힐 필요가 없이 간접적으로 DB를 조작할 수 있다. 객체지향적인 코드로 더 직관적이다. RDBMS에 대한 종속성이 줄어든다.

  • 단점 : 프로젝트가 복잡해질수록 설계가 어려워질 수 있으며 구현을 잘못하면 속도가 저하되거나 일관성이 무너질 수 있다.

Sequelize

  • Promise기반의 Node.js ORM

  • Postgres, MySQL, MariaDB, SQLite, Microsoft SQL 지원

1. Sequleize 설정

  1. sequelize 설치
npm install --save sequelize
  1. sequelize-cli 설치
  • migration(존재하는 db의 상태를 변화시키는 것)을 돕는 툴
npm install --save-dev sequelize-cli
  1. Project bootstrapping : init 커맨드로 새로은 프로젝트를 생성
npx sequelize-cli init
  • config, models, migrations, seeders 폴더가 자동 생섬됨

  • config/config.json에서 연결할 DB와 username, password 등을 설정할 수 있다.

  • 사용할 DB는 직접 생성해주어야 한다. (MySQL이라면 create database db_name;)

2. Model 생성

  • cli로 model을 만들 수 있다.

  • model은 DB의 테이블의 추상 모델로 Sequelize에서는 Model을 상속받는 클래스를 말한다.

  • model 이름은 단수로 작성해도 테이블 이름은 자동으로 복수로 바뀐다.

  1. User라는 이름의 Model 만들기
  • name : 테이블 이름
  • attributes : 테이블 컬럼
npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string
  • user.jsmodels 폴더에 생성됨
// models/user.js
'use strict';
const { Model } = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class user extends Model {
    static associate(models) {
      // define association here
    }
  };
  user.init({
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
    email: DataTypes.STRING
  }, {
    sequelize,
    modelName: 'user',
  });
  return user;
};
  • 새로운 migration 파일이 migrations 폴더에 생성됨
'use strict';
module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      firstName: {
        type: Sequelize.STRING
      },
      lastName: {
        type: Sequelize.STRING
      },
      email: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('users');
  }
};
  • model 파일만 변경해서는 실제 DB에 변경사항이 반영되지 않는다. migration 파일도 같이 변경해야 한다.

  • 빈 migration 파일에 직접 변경사항을 작성할 수 있다.

npx sequelize-cli migration:generate --name migration-name
// migration skeletion
module.exports = {
  up: (queryInterface, Sequelize) => {
    // logic for transforming into the new state
  },
  down: (queryInterface, Sequelize) => {
    // logic for reverting the changes
  }
}
// up, down returns a Promise
  1. DB에 실제로 테이블 생성하기
  • db:migrate 커맨드를 실행해 주어야 실제로 DB에 테이블이 생성된다.
npx sequelize-cli db:migrate
  1. Migration 취소하기
  • migration은 git의 commit과 비슷하다. migration으로 스키마 변경사항을 기록하고 이전 상태로 되돌릴 수도 있다.
npx sequelize-cli db:migrate:undo
  • db:migrate:undo 커맨드는 가장 최근의 migration상태로 되돌려 준다
profile
🦄✨글 잘 쓰는 개발자가 되기 위해 꾸준히 기록합니다 ✨🦄

0개의 댓글