Drizzle ORM vs Sequelize
어떤 ORM을 쓸까?
기본
| Drizzle ORM | Sequelize | |
|---|---|---|
| 주간 다운로드 | 1817만 | 294만 |
| 최근 릴리스 | 44일 전 | 156일 전 |
| 유지보수 | 활발 | 둔화 |
| 열린 이슈 | 1,950 | 1,075 |
유지보수 상태는 최근 릴리스 간격만으로 판정합니다 (90일 이내 활발 · 270일 이내 둔화 · 그 이상 정체).
쓰다 보면 만나는 것
Drizzle ORM
- 거슬림
down 마이그레이션이 없어 롤백은 손으로 역방향 SQL을 쓰는 일이 된다
drizzle-kit은 up 방향 마이그레이션만 생성한다. 배포 후 스키마를 되돌리려면 역방향 SQL을 직접 작성해야 하며, 순차 번호 방식이라 여러 명이 동시에 마이그레이션을 만들면 머지 충돌이 난다. 롤백 기능 요청은 2024년부터 priority 라벨로 열려 있다.
2025-05 · 미해결
- 거슬림
서버리스·HTTP 계열 드라이버에서는 인터랙티브 트랜잭션이 제한되거나 지원되지 않는다
Cloudflare D1 드라이버는 트랜잭션을 지원하지 않고, Neon HTTP 드라이버도 인터랙티브 트랜잭션을 잡을 수 없어 우회 설계(멱등키 등)가 필요하다. sqlite 계열도 5개 구현 중 4개가 async 트랜잭션 콜백을 지원하지 않는다. 엣지 배포가 세일즈 포인트인 만큼 뒤늦게 발견하면 아프다. TCP 드라이버(pg, postgres.js)에서는 트랜잭션이 정상 동작함을 2026-08에 직접 확인했다.
2026-03 · 미해결
- 사소
tx.rollback()은 예외를 던지는 API라서 호출자까지 에러가 전파된다
수동 롤백 시 롤백 자체는 정상 수행되지만 DrizzleError: Rollback이 transaction() 밖으로 던져진다. 문서에 한 줄 언급이 있으나, 다른 ORM에서 온 사용자가 이를 버그로 오인한 보고가 이어져 왔다. 정상 흐름으로 쓰려면 호출부에서 잡아야 한다. drizzle-orm 0.45.2에서 3개 드라이버로 직접 재현·확인했다.
2026-08 · 미해결
Sequelize
- 거슬림
findAndCountAll에 include를 섞으면 count가 부풀려져 페이지네이션이 깨진다
include(JOIN)가 있으면 부모 행이 아니라 조인된 행을 세기 때문에 count가 실제보다 커진다. count: 72에 rows: 38 같은 결과가 나와 페이지네이션 계산이 어긋난다. distinct: true 옵션이나 count·find 쿼리 분리로 우회한다. 2018년부터 같은 계열 이슈가 반복 보고돼 왔다.
2025-07 · 미해결
- 거슬림
TypeScript 지원이 JavaScript 우선 설계 위에 후행으로 얹힌 구조라, 타입 선언이 장황하고 보일러플레이트가 남는다
자바스크립트로 먼저 설계된 API 위에 타입 지원이 나중에 추가되어, 모델 필드 타입을 일일이 선언하고 InferAttributes·InferCreationAttributes 같은 유틸리티 타입을 함께 써야 하는 등 정의가 장황하다. 최근 버전에서 속성·생성 속성 인터페이스를 겹쳐 선언하던 부담은 줄었으나, 자동 추론이 제한적이라는 점은 TS 우선 설계인 최신 대안과 비교할 때 여전히 자주 언급된다.
2025-10 · 미해결
- 거슬림
복합 외래키를 지원하지 않는다
복합 외래키 지원 요청이 2012년부터 열려 있다. 복합 외래키로 연결된 기존 스키마에 붙이려 하면 뒤늦게 벽을 만나며, 연관 정의를 바꾸거나 raw 쿼리로 우회해야 한다.
2019-03 · 미해결
이럴 땐 이걸
- 엣지·서버리스 배포 (트랜잭션 제약은 확인할 것) → Drizzle ORM