ORM(Object Relational Model)은 사물을 추상화시켜 이해하려는 OOP적 사고방식과 DataModel을 정형화하여 관리하려는 RDB 사이를 연결할 계층의 역할로 제시된 패러다임으로 RDB의 모델을 OOP에 Entity 형태로 투영시키는 방식을 사용한다.
즉, Object와 Database간에 연결 역할을 해주는녀석이 ORM이다.
ORM을 사용하지 않을 경우 개발자가 개발을 위하여 Database에 접근하기 위해서는 SQL Query문을 직접 만들었다.
위와같은 문제점들이 생겨나기 시작했다.
이러한 문제점을 해결하기 위해 ORM이 등장하였고 ORM이 등장함으로서
장점
단점
Raw SQL
vs TypeORM
vs Sequelize.js
vs Knex
문법의 비교
// 1. SQL
const query = "SELECT * FROM post WHERE authorId = 12 AND status = 'active'";
// Knex
knex("post").select()
.where({ authorId: 12, status: 'active'});
// Sequelize
models.Post.findAll({
where: { authorId: 12, status: 'active' }
})
// TypeORM
connection.getRepository(Post).find({ where: { authorId: 12, status: 'active' } })
// 2. SQL
const query = "select *
from category_page
where category_id = 5
and (show_at is null or show_at >= now())
and (hide_at is null or hide_at <= now())
order by updated_at desc
limit 1";
// Knex
knex("category_page")
.where({ category_id: 5 })
.where(b => b.whereNull('show_at').orWhere('show_at', '>=', moment(now).toDate()))
.where(b => b.whereNull('hide_at').orWhere('hide_at', '<=', moment(now).toDate()))
.orderBy('updated_at', 'desc')
.first()
// Sequelize
models.CategoryPage.findOne({
where: {
category_id: 5,
show_at: {
[Op.or]: [
{ [Op.eq]: null },
{ [Op.gte]: now }
]
},
hide_at: {
[Op.or]: [
{ [Op.eq]: null },
{ [Op.lte]: now }
]
}
},
order: [['updated_at', 'DESC']]
})
// 참고 EQ("="), GTE(">="), GT(">"), LT("<"), LTE("<=");
// TypeORM
connection.getRepository(CategoryPage)
.createQueryBuilder()
.where("category_id = :categoryId", { categoryId: 5 })
.andWhere("(show_at is null or show_at >= now())" )
.andWhere("(hide_at is null or hide_at <= now())" )
.orderBy("updated_at", "DESC")
.limit(1)
.getMany()
함수 실행속도 비교 (10번 실행한 결과의 평균 수치)
- | raw |
typeORM |
Sequelize.js |
Knex.js |
---|---|---|---|---|
Query 1 | 0.8 | 2.19 | 8.42 | 3.86 |
Query 2 | 1.51 | 3.58 | 4.02 | 1.59 |
Query 3 | 1.39 | 3.92 | 9.13 | 2.13 |
— Query 1 : 단순 select 쿼리
— Query 2 : 단순 select 쿼리
— Query 3 : 단순 구조의 table 2개 join 쿼리
Github
- | typeORM |
Sequelize.js |
Knex.js |
---|---|---|---|
Stars (git) | 12,541 | 18,379 | 9,409 |
Language | TypeScript | TypeScript (TS >= 3.1) |
JavaScript |
Google (English) | ++ | +++ | ++ |
Google (Korean) | ++ | +++ | ++ |
Support Databases
MySQL
/ MariaDB
/ Postgres / CockroachDB / SQLite / Microsoft SQL Server / Oracle / sql.js / MongoDB NoSQLMySQL
, MariaDB
, SQLite and Microsoft SQL Server.MySQL
and SQLite3후보 1
TypeORM, Sequelize(only TS >= 3.1 is supported.)
TypeORM, Sequelize의 차이점
후보 2
인생은 날 쿼리. node-mysql/node-mysql2 only!