데브코스에서 도서 관련 프로젝트를 진행하게 되었는데 구현 선택사항에 시퀄라이즈가 있었다
Node 교재에서도 시퀄라이즈 관련 내용이 나왔었는데 이번 기회에 시퀄라이즈를 사용해 보았다
시퀄라이즈?
시퀄라이즈는 ORM(Object Relational Mapping)의 종류 중 하나이다. ORM은 RDBMS의 테이블과 객체를 Mapping을 해주어 개발자는 해당 객체를 이용하여 db와 상호작용이 가능하게 만들어주는 기술이다
NoSQL은 ODM(Object Document Mapping)를 사용한다. ex) 몽구스
테이블과 객체 맵핑
class Book extends Sequelize.Model {
static initiate(sequelize) {
Book.init(
{
id: { type: Sequelize.INTEGER.UNSIGNED, primaryKey: true, autoIncrement: true },
title: { type: Sequelize.STRING(50), allowNull: false },
author: { type: Sequelize.STRING(10), allowNull: false },
summary_info: { type: Sequelize.STRING(200) },
price: { type: Sequelize.INTEGER, allowNull: false },
description: { type: Sequelize.TEXT },
total_pages: { type: Sequelize.INTEGER },
ISBN: { type: Sequelize.STRING(20), allowNull: false },
chapters: { type: Sequelize.TEXT },
release_day: { type: Sequelize.DATE, allowNull: false },
},
{
sequelize,
timestamps: false,
modelName: 'Book',
tableName: 'books',
charset: 'utf8',
collate: 'utf8_general_ci',
}
);
}
static associate(db) {
db.Book.belongsTo(db.Genre, { foreignKey: 'genre', targetKey: 'id' });
}
}
시퀄라이즈를 사용하여 books테이블과 Book 객체를 맵핑을 해보았는데
개인적으로 SQL로 테이블을 생성하는것 보다 객체에 맵핑하는게 코드 타이핑이 더 많아서 오래걸리는것 같다..(아직 안익숙해서?)
쿼리를 날려보았다
class BookService {
#bookModel;
constructor() {
this.#bookModel = Book;
}
async getBooks(reqQuery) {
/**
SELECT books.id, title, author, summary_info, price, description, total_pages, ISBN, chapters, release_day, genres.genre
FROM books
JOIN genres ON books.genre = genres.id
WHERE ? = ? ; 해당 쿼리와 동일
*/
const rows = await this.#bookModel.findAll({
attributes: [
'id',
'title',
'author',
'summary_info',
'price',
'description',
'total_pages',
'ISBN',
'chapters',
'release_day',
],
include: [
{
model: Genre,
attributes: ['genre'],
},
],
where: reqQuery,
});
if (!rows) throw new Error('Not found');
return rows;
}
}

class UserService {
#userModel;
constructor() {
this.#userModel = User;
}
async getUser(email) {
//SELECT * FROM users WHERE email = ? 해당 쿼리와 동일
const [user] = await this.#userModel.findAll({
where: { email },
});
if (!user) throw new Error('Not found');
return user.dataValues;
}
}
직접 시퀄라이즈를 이용해서 쿼리를 날려보았는데 확실히 생산성이 높아지고 구현 로직에만 더 집중할 수 있었다!
하지만 시퀄라이즈를 이용해서 db를 조작하려면 결국 SQL 문법을 생각하면서 객체를 다뤄야 한다
나의 결론
장점
- 구현 로직에만 더 집중할 수 있다
- 간단한 프로젝트에서는 생산성이 좋다(시간은 금이니깐!)
- db를 옮기기 편하다(이런일이 있을지 모르겠다)
단점
- ORM을 쓰기위해선 결국 SQL을 생각해야 한다
- 코드와 db사이에 ORM이라는 다리가 하나 더 생긴다
- 섬세한 db조작이 어렵기 때문에 큰 프로젝트면 성능 문제가 있을 수 있을것 같다
DBA분들중 ORM을 싫어하는 분들도 있다고 한다..
개발자들이 ORM을 쓰는 이유와 DBA가 ORM을 싫어하는 이유 - RastaLion IT Blog
개발자들이 ORM(Object-Relational Mapping)을 사용하는 이유는 개발 속도 향상, 유지 보수의 편리성, 이식성 등의 이점 때문입니다. ORM은 객체 지향 프로그래밍을 사용하여 데이터베이스와 상호 작용할
rastalion.me
'database' 카테고리의 다른 글
| 테이블 2개 JOIN시 COUNT값이 곱셈이 된다? (0) | 2024.08.17 |
|---|---|
| 시퀄라이즈 모델들 비동기적으로 연결하기 (0) | 2024.04.13 |
| mariadb Node 환경에서 트랜젝션과 관리 (0) | 2024.04.02 |
| MySQL 자료형 (1) | 2024.03.14 |
| SQL 문법(DDL, DML, DCL, DQL,TCL) (0) | 2024.03.01 |