핵심 요약
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. 성능
| 지표 | Prisma | Drizzle | SQLx |
|---|---|---|---|
| simple query | 2.4ms | 0.8ms | 0.3ms |
| cold start | 180ms (engine 부팅) | 5ms | 2ms |
| 번들 크기 | ~15MB (engine) | ~150KB | ~3MB |
Drizzle이 압도적으로 가벼움. SQLx는 Rust 네이티브로 가장 빠름.
4. Edge·Serverless 호환
| 런타임 | Prisma | Drizzle | SQLx |
|---|---|---|---|
| Node.js | O | O | X |
| Bun | O (6.20+) | O | X |
| Cloudflare Workers | Accelerate 필요 | O (네이티브) | X |
| Vercel Edge | Accelerate 필요 | O | X |
| Deno | 제한적 | O | X |
| Rust 백엔드 | X | X | O |
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·Edge | Drizzle |
| SQL 직접 쓰는 걸 선호 | Drizzle |
| Schema-first 접근 | Prisma |
| Rust 백엔드 | SQLx |
| 마이그레이션 자동화 우선 | Prisma |
| 최소 의존성·콜드 스타트 critical | Drizzle |
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 GUIPrisma Studio 대안. 무료 self-hosted.
11. 실측 — 풀스택 앱 (Next.js)
| 지표 | Prisma | Drizzle |
|---|---|---|
| cold start (Vercel) | 800ms | 200ms |
| p99 (간단 query) | 15ms | 4ms |
| 번들 크기 | +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).

댓글 0