Sequelize ORM 프레임워크

JINSUNG LEE·2021년 10월 19일
0
post-thumbnail
post-custom-banner



간혹 프론트엔드 개발자들이 SQL 쿼리문으로 코드를 구현할때 문법이 헷갈려 프로그래밍을 작업하는데 있어 불편한 점이 있다.

그러한 SQL 쿼리문을 클래스의 메서드로 묶어 데이터베이스를 조작할 수 있는 방법이 ORM이며,

이번 시간에는 ORM에 대해 알아보자




ORM은 무엇인가 ?

ORM (Object Relational Mapping)
객체와 관계 간의 설정

여기서 객체는 우리가 흔히 쓰는 OOP(Object Oriented Programming)의 개념에 해당되며,

관계는 관계형 데이터베이스의 기반인 MySQL, MariaDB를 의미한다.

ORM의 대표적 구성 요소는 아래와 같이 주어진다.

그렇다면 ORM 엑세스용 프레임 워크는 무엇을 써야할까?

JAVA에는 Hibernate ORM, PHP에는 Eloquen ORM 등등 다양히 있으며 이번 시간에는 Node.js에서 ORM 프레임워크인 Sequelize를 기준으로 설명 하겠다.




Sequelize ORM

npm i sequelize sequelize-cli

package.json이 있는 파일에 우선 sequelize를 설치한다

npm install --save mysql2

또한 사용할 관계형 데이터베이스 플랫폼을 설치한다.

npx sequelize-cli init

init 지정하면 config, models, migrations, seeders 4가지 폴더가 생성된다

  • config: 데이터베이스 연결을 위한 정보(DB이름, 사용자 이름, 비밀번호)가 있음
  • models: ORM 쿼리문이 내장된 메서드(index.js)와 테이블 데이터 타입(table.js)을 객체로 종합한다.
  • migrations: 실제 MySQL상의 데이터베이스 CRUD 작업을 기록하는 구간이며, git과 비슷한 특성을 갖고 있다.
  • seeders: 해당 테이블의 기본 데이터 삽입을 할 경우 쓰인다.

npx sequelize-cli model:generate --name user --attributes name:string,number:integer

마이그레이션을 생성하기 위해 위의 명령문을 작성해주면 기본적으로 id, createAt, updateAt 칼럼은 자동 생성되어있어 5개의 테이블이 구성되어 있는 셈이며 이는 Schema 구조를 초기 생성해주는 것이다.

sequelize db:migrate

sequelize db:migrate:undo

실제 MySQL 프로그램에 DB를 반영해주는 명령문이며 취소를 원할 경우 아래와 같은 명령문에 undo 추가 작성하면 된다.

이제 SQL 명령문과 Sequelize 명령문의 차이를 비교해보자




Schema Object 구조 차이

ex) SQL .ver


CREATE TABLE user(
	id INTEGER NOT NULL,
	name VARCHAR(100),
    number int,
    createAt datetime,
);

ex) Javascript .ver


models.user = { 
  	name: DataTypes.VARCHAR(100),
  	number: DataTypes.INTEGER
}

데이터베이스의 테이블 생성을 객체 형식으로 구성해주며 이는 ORM의 첫 시작점이라고 보면 좋다.

npx sequelize-cli model:generate --name user --attributes name:string,number:integer

즉, 위 파트에서 소개한 sequelize 설정 설명에 마이그레이션 생성 명령문이 사실상 Schema Object의 개념을 생성해주는 역할이다.




Query 명령문 차이

ex) SQL .ver


SELECT name, number, createAt FROM user
WEHRE number = 4885;

ex) Javascript .ver


user.findeAll({
	attributes: ["id", "name"],
  	where: { number: 4885 },
});

관계형 데이터베이스의 쿼리문을 findeAll 이라는 자바스크립트 메서드를 활용하여 해당 SQL 쿼리문의 조회 역할과 똑같이 수행된다.

이를 통해 DB를 sequelize 메서드로 CRUD 할 수 있다.




Migration은 어떤 역할을 수행 하는가?

ex)

20211018150221-create-user.js
20211018182507-create-user.js
module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('user', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      number: {
        type: Sequelize.INTEGER
      },
      createdAt: {
        type: Sequelize.DATE
      },
    });
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('urls');
  }
};


데이터베이스 스키마 변경 사항을 관리하고 현재 구성된 스키마 또한 어떻게 구성되어 있는지 조회 해주는 역할을 수행한다.

up은 실제 DB에 적용되는 영역이며, down은 작업을 취소한 경우이다.




ORM 장점 및 단점

장점

  1. 특정 SQL 명령문을 사용하지 않고 OOP 방식으로 데이터베이스를 관리할 수 있다.
  2. 재사용 및 유지보수 하기에 편리하다.
  3. DBMS 종속성이 줄어든다.

DBMS란?
자료의 중복을 제거하고 구조화를 보다 효율적으로 관리하기 위한 데이터 조작 소프트웨어

단점

  1. 내장된 메서드의 자동 생성 쿼리문 특징으로 인해 복잡할 수도 있다.
  2. 잘못 구현된 코드인해 경우 속도 저하의 원인이 될 수도 있다.
profile
https://californialuv.github.io/Tech_Blog 이사 갔어용 🌎 🚀
post-custom-banner

0개의 댓글