서버리스 컴퓨팅은 애플리케이션 코드에 대해 “관리할 서버가 없다"는 문제를 해결했지만, 데이터베이스는 어색하게 남겨진 존재였습니다. Worker를 엣지에서 밀리초 단위로 실행해 놓고, 멀리 떨어진 단일 리전에 있는 데이터베이스를 기다리는 모습을 지켜봐야 했습니다. Cloudflare D1은 그 간극을 메웁니다. 이것은 SQLite 위에 구축된 진짜 SQL 데이터베이스로, Cloudflare 네트워크 위에 존재하며 여러분의 Worker에 직접 바인딩됩니다. 여러분은 평범한 SQL을 작성하고, 실제로 실행한 쿼리에 대해서만 요금이 청구됩니다.
이 가이드는 D1이 무엇인지, 비용이 얼마인지, Worker에서 어떻게 쿼리하는지, 그리고 KV나 전통적인 Postgres 데이터베이스 대신 언제 선택해야 하는지를 설명합니다.
요약
- D1은 SQLite 위에 구축된 서버리스 SQL 데이터베이스로, Cloudflare Workers에 직접 바인딩됩니다
- 무료 등급은 넉넉합니다. 하루에 500만 행 읽기와 100,000 행 쓰기, 그리고 5 GB 저장 공간
- 가동 시간이 아니라 읽기·쓰기 행에 대해 요금이 청구됩니다. 유휴 데이터베이스는 비용이 들지 않습니다
- 준비된 명령문을 사용하는 익숙한 SQL이라 학습 곡선이 거의 없습니다
- 플랫폼의 나머지 부분인 Workers AI , R2, KV와 결합해 완전한 앱을 구축합니다
- 무료 데스크톱 앱 Easy Cloudflare D1 으로 데이터베이스를 시각적으로 관리하세요
Cloudflare D1이란 무엇인가
Cloudflare D1 은 관리형 서버리스 데이터베이스입니다. 세계에서 가장 검증된 데이터베이스 엔진 중 하나인 SQLite 위에 구축된 관계형 SQL 저장소입니다. 여기서 “서버리스"는 인스턴스를 프로비저닝하거나, 크기를 고르거나, 무언가를 계속 실행해 두는 일이 결코 없다는 뜻입니다. 데이터베이스를 만들고, Worker에 바인딩하고, SQL을 실행합니다. 저장, 내구성, 확장은 Cloudflare가 처리합니다.
표준 SQL을 말하기 때문에 D1은 관계형 데이터베이스를 써본 사람이라면 누구에게나 즉시 익숙합니다. 테이블을 정의하고, SELECT, INSERT, UPDATE, DELETE 문을 작성하고, 인덱스를 만들고, 트랜잭션을 사용합니다. 차이는 운영 측면에 있습니다. 튜닝할 연결 풀도, 패치할 서버도, 유휴 비용도 없습니다.
Cloudflare D1 요금과 무료 등급
D1의 청구 모델은 가장 좋은 의미에서 특이합니다. 시간이 아니라 읽기·쓰기 행으로 측정되는 쿼리에 대해 지불합니다. 유휴 데이터베이스는 실행 중인 인스턴스가 없으므로 비용이 들지 않습니다. 2026년 D1 공식 요금 에서:
Workers 무료 요금제
| 리소스 | 일일 한도 |
|---|---|
| 읽은 행 | 하루 500만 |
| 쓴 행 | 하루 100,000 |
| 저장 공간 | 총 5 GB |
Workers 유료 요금제
| 리소스 | 포함, 이후 |
|---|---|
| 읽은 행 | 월 처음 250억, 이후 백만당 0.001달러 |
| 쓴 행 | 월 처음 5,000만, 이후 백만당 1.00달러 |
| 저장 공간 | 처음 5 GB, 이후 GB-월당 0.75달러 |
데이터 전송이나 이그레스 요금은 없습니다. 유용한 최적화 세부 사항: 인덱스는 쿼리가 더 적은 행을 스캔하게 함으로써 청구 대상 행 읽기를 극적으로 줄일 수 있으며, 그 대가는 쓰기 양의 작은 증가입니다. 읽기가 많은 워크로드에서는 좋은 인덱싱이 지연 시간과 청구액을 모두 낮게 유지합니다.
Worker에서 D1 쿼리하기
wrangler.toml에서 D1 데이터베이스를 바인딩한 다음 env.DB를 통해 접근합니다. D1은 준비된 명령문을 사용하여, 쿼리 텍스트를 값과 분리함으로써 쿼리를 SQL 인젝션으로부터 안전하게 지킵니다.
1export default {
2 async fetch(request, env) {
3 // Read with a parameterised query
4 const { results } = await env.DB
5 .prepare("SELECT id, title FROM posts WHERE published = ? ORDER BY created_at DESC LIMIT 10")
6 .bind(1)
7 .all();
8
9 return Response.json(results);
10 },
11};
데이터 삽입도 동일한 패턴을 따릅니다.
1await env.DB
2 .prepare("INSERT INTO posts (title, body, published) VALUES (?, ?, ?)")
3 .bind("Hello D1", "My first edge database post", 1)
4 .run();
여러 명령문을 일괄 처리하여 한 번의 왕복으로 효율적으로 실행할 수도 있으며, 이는 관련된 쓰기가 여러 개 있을 때 권장되는 접근법입니다.
Cloudflare D1 대 KV 대 Postgres
올바른 저장 프리미티브를 고르는 것이 중요합니다. 다음은 D1이 가장 자주 비교되는 두 가지와 어떻게 견주어지는지입니다.
| 필요 | 최선의 선택 | 이유 |
|---|---|---|
| 관계형 데이터, 쿼리, 조인 | D1 | 테이블, 인덱스, 트랜잭션을 갖춘 진짜 SQL |
| 단순한 키-값 조회, 구성, 캐싱 | KV | 엣지에서 단일 키의 빠른 읽기에 최적화 |
| 대규모 기존 관계형 워크로드, 복잡한 확장 | Postgres(예: Hyperdrive를 통해) | 무겁고 기능이 풍부한 워크로드를 위한 성숙한 엔진 |
요컨대, 가능한 한 빠르게 키로 값을 가져오기만 하면 될 때는 KV를 쓰세요. 데이터가 관계형이고 SQL로 쿼리하고 싶을 때는 D1을 쓰세요. 크고 확립된 관계형 워크로드가 있거나 SQLite가 제공하지 않는 Postgres 고유 기능이 필요할 때는 완전한 Postgres 데이터베이스(Workers가 Hyperdrive로 가속되어 연결할 수 있음)를 선택하세요.
Cloudflare D1이 올바른 선택일 때
D1은 다음과 같을 때 탁월하게 맞습니다.
- 데이터가 관계형이며 SQL 쿼리, 조인, 인덱스의 혜택을 받습니다
- Workers 위에서 구축하고 있으며 데이터베이스를 같은 플랫폼에 두고 싶습니다
- 워크로드가 급변하거나 낮음에서 중간이라, 쿼리당 지불이 항상 켜진 인스턴스를 이깁니다
- 운영 부담을 0으로 하고 싶습니다. 프로비저닝, 패치, 연결 풀링이 없습니다
- 애플리케이션 요구의 대부분을 커버하는 SQLite의 기능 집합에 만족합니다
한계를 초과하는 매우 큰 데이터셋이나, Postgres 고유 확장에 의존하는 워크로드에는 덜 적합합니다. 그런 경우에는 대신 Worker에서 전용 데이터베이스를 연결하세요.
현실적인 사용 사례
전형적인 D1 애플리케이션: Worker가 요청을 처리하고, D1에서 게시물이나 사용자 레코드를 쿼리하고, 업로드된 파일과 이미지를 R2 에 저장하고, 핫한 값을 KV에 캐시하며, 요약 같은 기능을 위해 선택적으로 Workers AI 를 호출하는 블로그나 소규모 SaaS 백엔드입니다. 모든 것이 하나의 플랫폼에서, 엣지에서, 서버 없이 실행되며, 청구액은 실제 사용량에 따라 확장됩니다. 이는 제가 구축한 Cloudflare Pages 사용자 시스템 뒤에 있는 것과 동일한 아키텍처 패턴입니다.
D1을 시각적으로 관리하기
마이그레이션 실행과 데이터 검사를 명령줄로 하는 것도 괜찮지만, 그래픽 클라이언트는 일상 작업을 더 빠르게 만듭니다. 무료 데스크톱 앱 Easy Cloudflare D1 은 데이터베이스와 테이블을 탐색하고, 쿼리를 실행하고, Windows, macOS, Linux의 깔끔한 인터페이스에서 D1 데이터를 관리하게 해 주며, 자격 증명은 여러분 자신의 기기에서 로컬로 암호화됩니다. 그리고 스택이 캐싱을 위해 D1과 KV를 결합한다면, 무료 Easy Cloudflare KV 앱이 키-값 네임스페이스에 같은 역할을 합니다.
핵심 요약
- D1은 SQLite 위에 구축된 서버리스 SQL 데이터베이스로, Cloudflare Workers에 직접 바인딩됩니다
- 무료 등급은 하루 500만 읽기와 100,000 쓰기를 5 GB 저장 공간으로 커버합니다
- 청구는 읽고 쓴 행당이며 시간당이 아닙니다. 유휴 데이터베이스는 비용이 들지 않습니다
- 안전한 준비된 명령문을 갖춘 표준 SQL을 사용하므로 학습 곡선이 최소입니다
- 키-값 조회에는 KV, 관계형 SQL에는 D1, 무겁거나 확장 고유의 워크로드에는 전용 Postgres를 사용하세요
- D1은 R2, KV, Workers AI와 결합해 완전한 엣지 애플리케이션을 구축합니다
자주 묻는 질문
Cloudflare D1이란 무엇인가요? D1은 SQLite 위에 구축된 서버리스 SQL 데이터베이스로, Cloudflare 네트워크에서 실행되며 Workers에 직접 바인딩됩니다. 표준 SQL을 작성하고 서버를 프로비저닝하거나 관리하는 일이 결코 없습니다. 저장, 내구성, 확장은 Cloudflare가 처리합니다.
Cloudflare D1은 무료인가요? Workers 무료 요금제에 무료 등급이 있습니다. 하루 500만 행 읽기와 100,000 행 쓰기, 5 GB 저장 공간입니다. 많은 소규모 애플리케이션이 이 한도 안에서 완전히 실행됩니다. Workers 유료 요금제는 포함된 양을 크게 늘립니다.
D1의 요금은 어떻게 책정되나요? 가동 시간이 아니라 읽고 쓴 행에 대해 지불합니다. 유료 요금제에서는 월 처음 250억 행 읽기와 5,000만 행 쓰기가 포함되며, 이후 백만 읽기당 0.001달러, 백만 쓰기당 1.00달러이고, 저장 공간은 처음 5 GB를 넘어 GB-월당 0.75달러입니다. 이그레스 요금은 없습니다.
D1과 KV의 차이는 무엇인가요? KV는 단일 키의 빠른 읽기에 최적화된 키-값 저장소로, 캐싱과 구성에 이상적입니다. D1은 조인, 인덱스, 트랜잭션으로 쿼리하고 싶은 구조화된 데이터를 위한 관계형 SQL 데이터베이스입니다. 키로 조회할 때는 KV, 관계형 쿼리에는 D1을 사용하세요.
D1이 Postgres를 대체할 수 있나요? 많은 소규모에서 중간 규모 애플리케이션에는 그렇습니다. SQLite가 일반적인 관계형 요구를 커버하기 때문입니다. 매우 큰 데이터셋, 무거운 동시 쓰기 워크로드, 또는 Postgres 고유 확장에는, Worker에서 연결되는(Hyperdrive로 가속된) 전용 Postgres 데이터베이스가 더 나은 선택입니다.
Worker에서 D1을 어떻게 쿼리하나요? wrangler 구성에서 데이터베이스를 바인딩하고 env.DB를 통해 접근합니다. 바인딩된 매개변수와 함께 준비된 명령문을 사용하세요. 예를 들어 env.DB.prepare(“SELECT … WHERE id = ?”).bind(id).all()처럼 하면 쿼리가 SQL 인젝션으로부터 안전하게 유지됩니다.
댓글