Drizzle ORM vs TypeORM
어떤 ORM을 쓸까?
기본
| Drizzle ORM | TypeORM | |
|---|---|---|
| 주간 다운로드 | 1817만 | 483만 |
| 최근 릴리스 | 44일 전 | 28일 전 |
| 유지보수 | 활발 | 활발 |
| 열린 이슈 | 1,950 | 606 |
유지보수 상태는 최근 릴리스 간격만으로 판정합니다 (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 · 미해결
TypeORM
- 거슬림
마이그레이션 생성기가 컬럼 변경을 ALTER 대신 드랍·재생성으로 만들 수 있다
특정 컬럼 변경에서 migration:generate가 DROP 후 재생성 SQL을 만들어, 검토 없이 적용하면 해당 컬럼 데이터가 사라진다. 2019년부터 열려 있는 이슈이며, 디폴트값이 매번 재생성되는 등 생성기 출력이 안정적이지 않다는 보고가 이어진다. 생성된 마이그레이션 SQL을 반드시 사람이 검토하는 절차가 필요하다.
2024-03 · 미해결
- 거슬림
one-to-many 관계 엔티티를 save()로 저장할 때 기존 행 UPDATE 대신 INSERT를 시도하는 경우가 보고돼 있다
one-to-many 관계가 걸린 엔티티를 save()로 저장하면 기존 행 갱신이 아니라 새 행 삽입으로 처리돼 중복 키 위반이 나는 사례가 보고돼 있다(typeorm/typeorm#3095, 2018-11 기준 open). save()의 upsert 의미론이 관계 저장 시 직관과 어긋나는 지점이다. 별개로 save()는 존재 확인용 SELECT 후 INSERT/UPDATE를 수행해 왕복이 늘어나는 성능 특성도 지적된다.
2022-01 · 미해결
이럴 땐 이걸
- 엣지·서버리스 배포 (트랜잭션 제약은 확인할 것) → Drizzle ORM