간혹 프론트엔드 개발자들이 SQL 쿼리문으로 코드를 구현할때 문법이 헷갈려 프로그래밍을 작업하는데 있어 불편한 점이 있다.
그러한 SQL 쿼리문을 클래스의 메서드로 묶어 데이터베이스를 조작할 수 있는 방법이 ORM이며,
이번 시간에는 ORM에 대해 알아보자
ORM (Object Relational Mapping)
객체와 관계 간의 설정
여기서 객체는 우리가 흔히 쓰는 OOP(Object Oriented Programming)의 개념에 해당되며,
관계는 관계형 데이터베이스의 기반인 MySQL, MariaDB를 의미한다.
ORM의 대표적 구성 요소는 아래와 같이 주어진다.
그렇다면 ORM 엑세스용 프레임 워크는 무엇을 써야할까?
JAVA에는 Hibernate ORM, PHP에는 Eloquen ORM 등등 다양히 있으며 이번 시간에는 Node.js에서 ORM 프레임워크인 Sequelize를 기준으로 설명 하겠다.
npm i sequelize sequelize-cli
package.json이 있는 파일에 우선 sequelize를 설치한다
npm install --save mysql2
또한 사용할 관계형 데이터베이스 플랫폼을 설치한다.
npx sequelize-cli init
init 지정하면 config
, models
, migrations
, seeders
4가지 폴더가 생성된다
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 명령문의 차이를 비교해보자
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의 개념을 생성해주는 역할이다.
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 할 수 있다.
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
은 작업을 취소한 경우이다.
DBMS란?
자료의 중복을 제거하고 구조화를 보다 효율적으로 관리하기 위한 데이터 조작 소프트웨어