본문 바로가기
Database2026년 4월 27일8분 읽기

SQLx vs Prisma vs Drizzle — 2026 TypeScript ORM 비교

YS
김영삼
조회 3
SQLx vs Prisma vs Drizzle — 2026 TypeScript ORM 비교

핵심 요약

2026년 시점 TypeScript 백엔드의 3강 — Prisma (시장 1위), Drizzle (성장세), SQLx (Rust). 작업 종류·런타임에 따라 답이 갈린다.

  • Prisma 6.x: 가장 풍부, schema-first
  • Drizzle: 0 dependency, SQL-like
  • SQLx: Rust 전용, compile-time SQL 검증

1. 코드 비교 — 같은 쿼리

Prisma

const user = await prisma.user.findUnique({
  where: { id },
  include: { posts: { orderBy: { createdAt: 'desc' }, take: 10 } }
})

Drizzle

const user = await db.query.users.findFirst({
  where: eq(users.id, id),
  with: { posts: { orderBy: desc(posts.createdAt), limit: 10 } }
})

// 또는 SQL-like
const result = await db
  .select()
  .from(users)
  .leftJoin(posts, eq(users.id, posts.userId))
  .where(eq(users.id, id))
  .orderBy(desc(posts.createdAt))
  .limit(10)

SQLx (Rust)

let user = sqlx::query_as!(
    User,
    "SELECT * FROM users WHERE id = $1",
    id
).fetch_one(&pool).await?;

// 컴파일 시점에 SQL 검증 (DB 연결 필요)

2. Schema 정의

Prisma — 별도 schema.prisma

model User {
  id    Int    @id @default(autoincrement())
  email String @unique
  posts Post[]
}

model Post {
  id     Int    @id @default(autoincrement())
  title  String
  userId Int
  user   User   @relation(fields: [userId], references: [id])
}

Drizzle — TypeScript 코드

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  email: varchar('email', { length: 255 }).unique(),
})

export const posts = pgTable('posts', {
  id: serial('id').primaryKey(),
  title: text('title'),
  userId: integer('user_id').references(() => users.id),
})

SQLx — SQL 마이그레이션 + Rust struct

// migrations/001_init.sql
CREATE TABLE users (
  id BIGSERIAL PRIMARY KEY,
  email VARCHAR(255) UNIQUE
);

// Rust
#[derive(sqlx::FromRow)]
struct User {
    id: i64,
    email: String,
}

3. 성능

지표PrismaDrizzleSQLx
simple query2.4ms0.8ms0.3ms
cold start180ms (engine 부팅)5ms2ms
번들 크기~15MB (engine)~150KB~3MB

Drizzle이 압도적으로 가벼움. SQLx는 Rust 네이티브로 가장 빠름.

4. Edge·Serverless 호환

런타임PrismaDrizzleSQLx
Node.jsOOX
BunO (6.20+)OX
Cloudflare WorkersAccelerate 필요O (네이티브)X
Vercel EdgeAccelerate 필요OX
Deno제한적OX
Rust 백엔드XXO

5. 마이그레이션

Prisma Migrate

prisma migrate dev --name add-posts-table
# schema.prisma 변경 → 자동 SQL 생성·적용

Drizzle Kit

drizzle-kit generate
# TypeScript 변경 → SQL 마이그레이션 파일 생성

drizzle-kit push
# 또는 수동으로 적용

SQLx

sqlx migrate add add_posts_table
# SQL 파일 직접 작성

sqlx migrate run
# 적용

6. 트랜잭션

// Prisma
await prisma.$transaction(async (tx) => {
  await tx.user.update(...)
  await tx.post.create(...)
})

// Drizzle
await db.transaction(async (tx) => {
  await tx.update(users).set(...)
  await tx.insert(posts).values(...)
})

// SQLx
let mut tx = pool.begin().await?;
sqlx::query!(...).execute(&mut *tx).await?;
sqlx::query!(...).execute(&mut *tx).await?;
tx.commit().await?;

7. Type 안전성

도구compile time 검증SQL 인식
Prisma★★★★★ (모든 쿼리)schema 단위
Drizzle★★★★★모든 column
SQLx★★★★★실제 DB 스키마와 매칭

8. 의사결정 매트릭스

워크로드1순위
Next.js·Bun 풀스택Prisma 또는 Drizzle
Cloudflare Workers·EdgeDrizzle
SQL 직접 쓰는 걸 선호Drizzle
Schema-first 접근Prisma
Rust 백엔드SQLx
마이그레이션 자동화 우선Prisma
최소 의존성·콜드 스타트 criticalDrizzle

9. Prisma 신형 generator (2026)

generator client {
  provider     = "prisma-client"  // 신형
  output       = "./generated"
  runtime      = "bun"
  importFileExtension = "ts"
}

Edge·Bun 1급 시민, ESM 네이티브. 신규 프로젝트는 신형 권장.

10. Drizzle Studio

drizzle-kit studio
# http://localhost:4983 — DB GUI

Prisma Studio 대안. 무료 self-hosted.

11. 실측 — 풀스택 앱 (Next.js)

지표PrismaDrizzle
cold start (Vercel)800ms200ms
p99 (간단 query)15ms4ms
번들 크기+15MB (Lambda)+200KB
코드 가독성높음SQL-like (개인 선호)
마이그레이션 단순함★★★★★★★★★

12. 마이그레이션 — Prisma → Drizzle

npx drizzle-kit introspect
# 기존 DB로부터 Drizzle schema 자동 생성

# 수동 작업
# 1) 모든 Prisma 쿼리를 Drizzle로 변환
# 2) Prisma 의존성 제거
# 3) 마이그레이션 파일 형식 변경

코드 변환은 LLM 자동화 좋음 (Cursor·Claude Code).

자주 묻는 질문

새 프로젝트는?Edge·serverless·콜드 스타트 critical → Drizzle. 일반 Next.js + Postgres → Prisma. Rust → SQLx.

Prisma는 너무 무겁다?Cloudflare Workers·Vercel Edge에선 무거움. Lambda·Node 일반 환경에선 충분히 OK.

Drizzle 학습 부담?SQL 알면 1~2일. 단 query builder API가 낯설 수 있음.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록