void deploy 한 줄이면 DB부터 인증까지 다 올라간다 — Vite 생태계의 풀스택 배포 플랫폼

Void: Vite 네이티브 배포 플랫폼

자바스크립트 생태계에 "Rails 모먼트"가 왔다고 말하는 사람들이 생겼어요. Evan You가 세운 VoidZero에서 Void라는 배포 플랫폼을 내놨거든요. `void deploy` 한 방이면 데이터베이스, 인증, KV 스토리지, 큐까지 통째로 Cloudflare Workers 위에 올라간다는 거예요. 솔직히 처음 들었을 때 "또 Vercel 클론 아니야?" 싶었는데, 파고 들어가 보니까 결이 좀 달랐어요.

Vite+는 개발, Void는 배포 — 둘이 한 세트

용어 정리부터 해야 할 것 같아요. VoidZero는 Vue를 만든 Evan You의 회사예요. Vite, Rolldown, Oxc, Vitest를 관리하고 있고, 여기서 두 가지 제품을 냈어요.

Vite+는 로컬 개발 도구 통합 툴체인이에요. `vp`라는 CLI 하나로 개발 서버, 빌드, 테스트, 린팅, 포맷팅을 전부 처리하죠. Void는 배포 플랫폼이자 풀스택 프레임워크예요. Vite 앱을 Cloudflare Workers 위에 풀스택으로 올려주는 게 핵심이고요. 로컬 개발은 Vite+로, 배포는 Void로. 이렇게 짝을 이루는 거예요.

잠깐 딴 얘기인데, Vue 만든 사람이 빌드 도구를 만들고, 이제 배포 플랫폼까지 만들고 있다는 게 좀 재밌지 않나요? Vercel이 Next.js로 갔던 길을 Vite 생태계에서 다시 그리고 있는 건데, 방향이 좀 다르거든요. 다시 본론으로 오면요.

import 한 줄이 인프라를 만든다

Void가 단순한 배포 도구가 아닌 이유가 여기 있어요. 풀스택 앱에 필요한 백엔드 인프라를 통째로 제공하거든요.

데이터베이스는 로컬에서는 SQLite, 프로덕션에서는 Cloudflare D1으로 매핑돼요. KV 스토리지, 오브젝트 스토리지, 인증, 큐, 크론 잡, 심지어 AI 추론까지. 이걸 다 SDK에서 import만 하면 돼요.

``` import { db } → D1 데이터베이스 import { kv } → KV 네임스페이스 import { storage } → R2 버킷 import { ai } → Workers AI import { auth } → 인증 (Better Auth 기반) ```

근데 진짜 인상적인 건 자동 프로비저닝이에요. `void/db`를 import하면 D1 데이터베이스가 알아서 생기고, `void/kv`를 import하면 KV 네임스페이스가 자동으로 생겨요. 설정 파일 없음. 대시보드 클릭 없음. Cloudflare 계정조차 필요 없음. 소스 코드를 스캔해서 어떤 리소스를 쓰는지 감지하고 알아서 인프라를 구성해주는 거예요.

Infrastructure-as-Code라고 부르기엔 좀 다르죠. Infrastructure-from-Code. 코드에서 인프라가 나오는 거예요.

Cloudflare Workers를 직접 써본 분이라면 아실 거예요. `wrangler.toml`에서 바인딩 설정하고, 대시보드에서 D1 만들고, KV 연결하는 그 과정이 꽤 번거롭잖아요. Void는 그걸 전부 추상화해버려요. Drizzle ORM이 스키마 정의부터 마이그레이션, 타입 생성까지 담당하니까 DB 레이어의 타입 안전성도 자동으로 확보되고요.

배포도 결국 한 줄

```bash void deploy ```

이 한 줄이 빌드, 마이그레이션 실행, 리소스 프로비저닝, Cloudflare Workers 배포를 순서대로 처리해요. Vercel에서 `vercel deploy` 쓰는 것과 비슷한데, 데이터베이스나 스토리지 같은 백엔드 인프라까지 한꺼번에 다뤄준다는 점이 달라요.

로컬 개발 환경에서는 Miniflare를 써서 Workers 런타임을 시뮬레이션하더라고요. 프로덕션과 동일한 런타임에서 개발하니까 "내 컴퓨터에서는 되는데" 문제가 줄어들 수밖에 없죠.

프레임워크 종속도 없어요. Vite 기반이라면 React, Vue, Svelte, Solid 뭐든 돼요. SSR, SSG, ISR은 기본이고 아일랜드 아키텍처, 부분 하이드레이션, 마크다운 기반 콘텐츠까지 지원하고요. 기존 Vite 앱에 `vite.config.ts`에 `voidPlugin()`만 추가하면 끝이니까 마이그레이션 비용이 낮아요.

Cloudflare에 올인한 대가

여기서부터 좀 진지한 얘기예요.

가장 큰 걸림돌은 Cloudflare 종속이에요. `void/db`는 Cloudflare D1이고, `void/kv`는 Workers KV고, 배포 타겟은 Cloudflare Workers뿐이에요. Vercel과 Next.js 사이에서 봤던 벤더 락인 논쟁이 여기서도 고스란히 반복될 수 있어요. Cloudflare 인프라가 마음에 안 들면? Void에서 빠져나오기 쉽지 않을 거예요.

성숙도도 문제예요. 아직 얼리 액세스 단계거든요. 새벽 2시에 프로덕션 터졌을 때 Stack Overflow에서 답을 찾을 수 있는 환경이 아니라, GitHub 이슈에 댓글이 세 개 달려있는 수준이에요. (솔직히 이 부분은 좀 무서운 얘기예요.)

Next.js와 비교하면 접근 방식이 꽤 달라요. Next.js는 React 전용이지만 Void는 프레임워크 무관하고요. Next.js는 프레임워크가 먼저고 배포가 따라오는 반면, Void는 기존 앱에 배포 레이어를 얹는 방식이에요. 또 Next.js는 Vercel 외 플랫폼에서도 돌릴 수는 있지만 최적화는 Vercel에서만 제대로 되잖아요. Void는 아예 처음부터 Cloudflare 전용으로 설계했어요. 다른 데서 돌릴 생각 자체를 안 하는 거예요.

이걸 단점으로 볼 수도 있고, 오히려 최적화에 집중할 수 있다는 장점으로 볼 수도 있어요.

"자바스크립트의 Rails"가 될 수 있을까

솔직히 처음 봤을 때 Ruby on Rails가 떠올랐어요. 라우팅, 데이터베이스, 인증, 배포까지 프레임워크 하나로 해결하는 그 올인원 철학. 자바스크립트 생태계에서 이 정도로 통합된 경험을 제대로 제공한 적이 있었나 싶을 만큼 범위가 넓거든요.

근데 Rails가 성공한 건 "올인원"이어서만이 아니에요. 커뮤니티가 성숙하고, 문서가 탄탄하고, 실전에서 검증된 시간이 있었으니까요. Void는 아직 그 시간을 거치지 않았어요.

그래도 방향성 자체는 매력적이에요. 도구 파편화에 지친 자바스크립트 개발자들에게 "Vite+로 개발하고 Void로 배포하라"는 메시지는 설득력이 있어요. Cloudflare의 글로벌 엣지 네트워크 위에서 돌아간다는 성능상 이점도 무시하기 어렵고요. 아니 이게, Vite 플러그인 하나로 풀스택이 되는 세상이 오긴 온 거잖아요. 문제는 그 풀스택이 Cloudflare라는 한 바구니에 담겨있다는 건데 — 그 바구니가 얼마나 튼튼한지는, 결국 시간이 답해줄 수밖에 없어요.