타입스크립트 꽝꽝

[TypeScript] 어떤 ORM을 써야할까? (TypeORM vs MikroORM vs Sequelize)

bimppap 2022. 2. 11. 13:03

 

 

타입스크립트로 간단한 웹 서비스 만들기를 해보고 있는데 ORM을 고를 일이 생겼다. 프로덕션에서는 TypeORM을 사용하고 있으나 내가 하는 건 개인 과제 같은 거라 다른 ORM을 사용해도 무방했다. 무작정 따라가도 되겠지만... 기술을 쓸 땐 어떤 이유로 쓰게 되었다, 를 알아둬야 기술에 확신을 가지고 사용할 수 있다고 봐 좀 더 알아보기로 했다.

 

찾아보니 타입스크립트를 지원하는 ORM 중에서 유명한 건 TypeORM, Sequelize(3.1 이상), MikroORM이 있었다.

보통 기술을 선택할 땐 아래 기준으로 고르게 되는 것 같다.

  • 기술을 사용하는 풀의 크기 (다운로드수, Github Stars 등등)
  • 성능
  • 코드 스타일

 

풀의 크기

 

npm trends 를 확인하면 라이브러리, 모듈 별로 기간당 다운로드 수, Github Stars 등을 확인할 수 있다. 

앞서 말한 세 가지 ORM의 5년 간 다운로드 수를 찾아보았다. (2022년 2월 기준)

다운로드 수는 sequelize가 제일 많고, typeorm도 따라 꾸준히 상승중이다. mikro-orm은... 여기까지만 얘기하자 🥲

이것만 보고 어? sequelize를 써야 하나? 싶었지만 아래 Stats를 보고 생각이 바뀌었다.

 

보다시피 typeorm은 sequelize보다 5년 늦게 나왔음에도 Stars, Issues가 더 많다. 업데이트도 꾸준하게 되고 있는 듯 하다.

 

성능

 

성능은 감사하게도 이미 어떤 분이 sequelize와 typeorm을 비교한 자료가 있다. 링크는 여기.

결론만 얘기하자면 서버 환경과 쿼리 조건에 따라 달라지겠지만 typeorm이 sequelize에 비해 속도가 상대적으로 빨랐다.

여담이지만 다운로드수가 typeorm보다 많은 prisma도 성능 단에서는 typeorm에게 뒤쳐졌다 😏 (출처는 여기)

🐯 말에 의하면 서버 단에서 성능에 제일 큰 비중을 차지하는 건 디비라고 했으니 이는 무시할 수 없는 지표다.

 

코드 스타일

필드로 id(PK), name(문자열), age(숫자)를 가지는 User 모델을 예시로 각각의 코드를 확인해 보자.

- sequelize

const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('sqlite::memory:');

const User = sequelize.define('User', {
  id: {
    type: DataTypes.INTEGER,
    autoIncrement: true,
    primaryKey: true
  },
  name: {
    type: DataTypes.STRING,
    allowNull: false
  },
  age: {
    type: Sequelize.INTEGER
  }
}, {});

- typeorm

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @Column()
    age: number;

}

 

그럼 나이가 25명인 유저들을 이름을 기준으로 내림차순해서 3명을 가져오는 쿼리는 어떻게 보낼까?

- sequelize

User.findAll({
  where: {
    age: 25,
  },
  limit: 3,
  order: [
     ['name', 'DESC'],
  ],
});

- typeorm

connection.getRepository(User)
    .createQueryBuilder()
    .where("age = :age", { age: 25 })
    .orderBy("name", "DESC")
    .limit(3)
    .getMany();

개인 취향일 수도 있지만 JPA로 ORM을 처음 접한 나로서는 typeorm으로 모델을 짜는 방식이 더 익숙했다. 

중간 연산자가 직관적이라 코드를 이해하기에도 typeorm이 더 쉬워보인다.

 

결론

다방면으로 살펴본 바 이전에 쓰던 프레임워크와 비슷하게 생겼으며, 성능도 좋고 풀도 커지고 있는 typeorm을 사용하기로 했다.

물론 typeorm이 최고라는 뜻은 아니다. typeorm issues들을 보면 메이저 버그도 간간히 마주할 수 있다.

개인적인 선택일 뿐, 기술마다 장단점이 있고 개인마다 고르는 기준이 다를 수도 있으니 본인 프로젝트에 쓰일 ORM을 고민할 경우 참고만 하자.