Cloudflare D1은 SQLite 기반의 서버리스 데이터베이스로, 전 세계 어디서나 빠른 데이터 접근이 가능한 현대적인 클라우드 솔루션입니다. 복잡한 인프라 관리 없이 Workers와 결합하여 엣지에서 직접 데이터베이스를 운영할 수 있으며, 행 단위 과금으로 비용도 예측 가능합니다. 이 문서에서는 D1의 핵심 개념부터 실전 활용법, 요금제, 제한사항까지 상세히 다룹니다.
D1의 핵심 개념 Cloudflare D1은 SQLite의 SQL 문법을 그대로 사용하면서도 서버리스 환경에 최적화된 데이터베이스 서비스입니다. 기존 SQLite 데이터베이스를 클라우드로 옮기면서도 익숙한 SQL 쿼리와 ORM을 그대로 활용할 수 있습니다. D1은 Cloudflare의 글로벌 네트워크 위에서 동작하며, 사용자와 가장 가까운 위치에서 데이터를 제공하여 지연 시간을 최소화합니다. 데이터베이스 서버를 직접 관리할 필요 없이 쿼리만 작성하면 되므로, 개발자는 비즈니스 로직에만 집중할 수 있습니다.
서버리스 아키텍처의 장점 D1은 "스케일 투 제로(Scale-to-zero)" 모델을 채택하여, 쿼리를 실행하지 않는 동안에는 비용이 발생하지 않습니다. 트래픽이 급증해도 자동으로 확장되며, 사용량이 줄어들면 자동으로 축소됩니다. 이러한 탄력적인 확장 방식 덕분에 스타트업부터 대규모 서비스까지 동일한 인프라로 운영할 수 있습니다. 또한 읽기 복제본이 자동으로 생성되어 읽기 성능과 가용성이 자동으로 향상됩니다.
SQLite와의 관계 D1은 SQLite를 기반으로 구축되어 JSON 파싱, 전체 텍스트 검색, 트리거 등 SQLite의 강력한 기능을 모두 지원합니다. SQLite의 단순함과 안정성을 유지하면서도, 클라우드 환경에서 필요한 분산 처리와 복제 기능을 추가했습니다. 로컬 개발 환경에서 SQLite로 작업한 후 D1으로 마이그레이션하는 것도 매우 간단합니다.
글로벌 분산 데이터베이스 D1은 Cloudflare의 전 세계 데이터센터에 분산되어 있어, 사용자가 어디에 있든 가장 가까운 위치에서 데이터를 제공합니다. 이를 통해 지연 시간이 크게 줄어들고, 글로벌 서비스에서도 일관된 성능을 유지할 수 있습니다. Smart Placement 기능이 자동으로 최적의 위치를 선택하므로, 개발자가 직접 리전을 관리할 필요가 없습니다. 데이터는 여러 위치에 자동으로 복제되어 재해 복구 능력도 뛰어납니다.
Time Travel 기능 Time Travel은 D1의 독특한 백업 및 복구 기능으로, 최근 30일 이내의 모든 시점으로 데이터베이스를 롤백할 수 있습니다. 실수로 데이터를 삭제하거나 잘못된 업데이트를 실행했을 때, 정확한 시점으로 되돌릴 수 있어 데이터 손실 위험이 크게 줄어듭니다. 이 기능은 별도 비용 없이 모든 D1 데이터베이스에 기본 제공되며, 10분마다 최대 10회까지 복원 작업을 수행할 수 있습니다.
Workers와의 긴밀한 통합 D1은 Cloudflare Workers와 완벽하게 통합되어, 엣지에서 직접 데이터베이스 쿼리를 실행할 수 있습니다. 별도의 API 서버 없이 Workers 함수 내에서 바로 SQL 쿼리를 작성하고 실행할 수 있어, 아키텍처가 단순해지고 응답 속도가 빨라집니다. Workers의 각 요청마다 최대 6개의 동시 연결을 열 수 있으며, 배치 쿼리를 통해 여러 작업을 한 번에 처리할 수도 있습니다.
데이터베이스 크기와 개수 각 D1 데이터베이스는 최대 10GB까지 저장할 수 있으며, 이 제한은 증가시킬 수 없습니다. 대신 D1은 여러 개의 작은 데이터베이스를 사용하는 수평 확장 방식을 권장합니다. Workers 유료 요금제에서는 계정당 최대 50,000개의 데이터베이스를 생성할 수 있으며, 무료 요금제에서는 10개까지 가능합니다. 이러한 설계는 사용자별, 테넌트별, 엔티티별로 데이터베이스를 분리하는 마이크로서비스 아키텍처에 최적화되어 있습니다.

쿼리 성능과 동시성 각 D1 데이터베이스는 단일 스레드로 동작하며, 쿼리를 순차적으로 처리합니다. 평균 쿼리 시간이 1ms라면 초당 약 1,000개의 쿼리를 처리할 수 있고, 100ms라면 초당 10개를 처리합니다. 읽기 쿼리는 적절한 인덱스가 있을 때 1ms 미만으로 실행되며, 쓰기 쿼리는 여러 위치에 영구 저장되어야 하므로 수 밀리초가 소요됩니다. 너무 많은 동시 요청이 들어오면 큐에 쌓이고, 큐가 가득 차면 "overloaded" 오류가 반환됩니다.
쿼리 제한사항 단일 SQL 문의 최대 길이는 100KB이며, 쿼리당 최대 100개의 바인딩 파라미터를 사용할 수 있습니다. Workers 호출당 유료 요금제에서는 최대 1,000개, 무료 요금제에서는 50개의 읽기 쿼리를 실행할 수 있습니다. 각 쿼리는 최대 30초 내에 완료되어야 하며, 대규모 데이터 마이그레이션은 배치 작업으로 나누어 처리해야 합니다. 한 번에 수십만 행을 수정하는 쿼리는 실행 제한을 초과할 수 있으므로, 1,000행 단위로 나누어 처리하는 것이 권장됩니다.
무료 요금제 Workers 무료 요금제에서는 하루 최대 500만 행 읽기와 10만 행 쓰기를 무료로 제공합니다. 스토리지는 5GB까지 무료이며, 데이터베이스는 최대 10개까지 생성할 수 있습니다. 이 용량은 소규모 프로젝트나 개발 환경에 충분하며, 별도의 신용카드 등록 없이도 바로 시작할 수 있습니다. 무료 요금제에서도 Time Travel 기능을 7일간 사용할 수 있어, 기본적인 백업 및 복구가 가능합니다.
유료 요금제 (월 $5) Workers 유료 요금제는 월 250억 행 읽기와 5천만 행 쓰기를 포함합니다. 이는 매일 약 8억 행을 읽고 160만 행을 쓸 수 있는 양으로, 대부분의 프로덕션 앱에 충분합니다. 포함된 용량을 초과하면 읽기는 100만 행당 $0.001, 쓰기는 100만 행당 $1.00의 추가 비용이 발생합니다. 스토리지는 5GB까지 무료이고, 초과 시 월 $0.75/GB가 부과됩니다. Time Travel은 30일간 사용할 수 있으며, 데이터베이스는 최대 50,000개까지 생성 가능합니다.
비용 예측과 최적화 D1의 과금 방식은 행 단위로 명확하게 계산되므로, 쿼리 패턴을 분석하면 비용을 정확히 예측할 수 있습니다. 예를 들어 매일 140만 번의 쿼리를 실행하고 각 쿼리가 평균 12행을 읽는다면, 월 약 5억 행을 읽게 되어 유료 요금제 내에서 충분히 처리됩니다. 쿼리 최적화를 통해 불필요한 행 읽기를 줄이면 비용도 자연스럽게 절감됩니다. 읽기 복제본은 별도 비용 없이 자동 제공되며, 데이터 전송(이그레스) 비용도 부과되지 않습니다.
데이터베이스 생성과 스키마 설정
D1 데이터베이스는 Wrangler CLI를 통해 간단히 생성할 수 있습니다. wrangler d1 create my-database 명령으로 새 데이터베이스를 만들고, SQL 파일을 실행하여 테이블 스키마를 정의합니다. SQLite의 모든 데이터 타입과 제약 조건을 사용할 수 있으며, 인덱스를 적절히 설정하면 쿼리 성능을 크게 향상시킬 수 있습니다. 로컬 개발 환경에서는 --local 플래그를 사용하여 실제 D1 없이도 테스트할 수 있습니다.
Workers에서 D1 쿼리 실행
Workers 코드에서는 바인딩을 통해 D1 데이터베이스에 접근합니다. env.DB.prepare() 메서드로 SQL 문을 준비하고, .bind()로 파라미터를 바인딩한 후 .all(), .first(), .run() 등의 메서드로 실행합니다. 배치 쿼리는 env.DB.batch()를 사용하여 여러 쿼리를 한 번에 트랜잭션으로 처리할 수 있습니다. 에러 처리를 위해 try-catch 블록을 사용하고, 타임아웃이나 overload 오류에 대비한 재시도 로직을 구현하는 것이 좋습니다.
데이터 마이그레이션과 관리
기존 SQLite 데이터베이스를 D1으로 마이그레이션할 때는 wrangler d1 execute 명령으로 SQL 덤프 파일을 실행합니다. 대용량 데이터는 R2에 업로드한 후 가져올 수 있으며, 최대 5GB까지 한 번에 임포트 가능합니다. 스키마 변경은 마이그레이션 스크립트로 관리하고, Time Travel 기능을 활용하여 문제 발생 시 즉시 이전 상태로 복구할 수 있습니다. 프로덕션 환경에서는 스테이징 데이터베이스에서 먼저 테스트한 후 배포하는 것이 안전합니다.
기존 관계형 데이터베이스와의 차이 PostgreSQL이나 MySQL 같은 전통적인 데이터베이스는 중앙 서버에서 실행되고 연결 풀을 관리해야 하지만, D1은 서버리스로 동작하여 연결 관리가 필요 없습니다. 기존 데이터베이스는 수직 확장(더 큰 서버)에 의존하지만, D1은 수평 확장(더 많은 데이터베이스)을 권장합니다. SQLite 호환성 덕분에 기존 SQL 지식을 그대로 활용할 수 있으며, 복잡한 조인이나 트랜잭션도 지원합니다.
다른 서버리스 데이터베이스와의 비교 PlanetScale이나 Neon 같은 서버리스 데이터베이스는 MySQL이나 PostgreSQL 호환성을 제공하지만, D1은 SQLite를 기반으로 합니다. D1의 강점은 Cloudflare 생태계와의 긴밀한 통합으로, Workers에서 추가 네트워크 홉 없이 바로 쿼리를 실행할 수 있다는 점입니다. 또한 행 단위 과금 방식이 직관적이고 예측 가능하며, 무료 용량도 넉넉한 편입니다.
Cloudflare의 다른 스토리지 옵션 Cloudflare는 D1 외에도 Workers KV(키-값 저장소), Durable Objects(상태 저장 객체), R2(오브젝트 스토리지)를 제공합니다. KV는 간단한 키-값 데이터에 적합하고, Durable Objects는 실시간 협업이나 게임 같은 상태 관리가 필요한 경우에 사용됩니다. R2는 대용량 파일 저장에 최적화되어 있습니다. D1은 관계형 데이터와 복잡한 쿼리가 필요한 경우에 가장 적합하며, 필요에 따라 여러 스토리지 옵션을 조합하여 사용할 수 있습니다.
데이터베이스 설계 전략 D1은 하나의 큰 데이터베이스보다 여러 개의 작은 데이터베이스로 나누는 것을 권장합니다. 사용자별, 테넌트별, 또는 지역별로 데이터베이스를 분리하면 격리성이 높아지고 성능도 향상됩니다. 각 데이터베이스가 10GB 제한 내에서 동작하도록 설계하고, 데이터가 증가하면 새 데이터베이스를 추가하는 샤딩 전략을 고려해야 합니다. 인덱스는 자주 조회하는 컬럼에만 생성하여 쓰기 성능 저하를 최소화합니다.
쿼리 최적화 기법
읽기 쿼리는 적절한 인덱스가 있을 때 1ms 미만으로 실행되므로, EXPLAIN QUERY PLAN으로 쿼리 실행 계획을 분석하고 인덱스를 추가해야 합니다. 불필요한 컬럼을 조회하지 않도록 SELECT * 대신 필요한 컬럼만 명시합니다. 대량의 데이터를 처리할 때는 LIMIT와 OFFSET을 사용한 페이지네이션으로 나누어 처리하고, 배치 쿼리로 여러 작업을 묶어서 실행하면 네트워크 왕복을 줄일 수 있습니다.
에러 처리와 복구 전략 D1 쿼리는 타임아웃, overload, 네트워크 오류 등 다양한 이유로 실패할 수 있으므로, 적절한 에러 처리와 재시도 로직이 필요합니다. 지수 백오프(exponential backoff)를 사용하여 재시도 간격을 점진적으로 늘리고, 최대 재시도 횟수를 설정합니다. Time Travel 기능으로 데이터 손실에 대비하고, 중요한 작업은 트랜잭션으로 묶어서 원자성을 보장합니다. 프로덕션 환경에서는 모니터링과 알림을 설정하여 문제를 조기에 발견할 수 있도록 합니다.
현재 상태와 안정성 D1은 2024년 정식 출시(GA)되어 프로덕션 환경에서 사용할 수 있는 안정적인 서비스입니다. 오픈 베타 기간 동안 수많은 피드백을 반영하여 성능과 안정성을 크게 개선했으며, 현재는 수천 개의 프로덕션 앱에서 활용되고 있습니다. Cloudflare의 글로벌 인프라 위에서 동작하므로 높은 가용성과 재해 복구 능력을 자랑합니다.
개발 중인 기능 Cloudflare는 D1의 기능을 지속적으로 확장하고 있으며, 읽기 복제본 성능 향상, 더 정교한 쿼리 분석 도구, 추가 SQLite 확장 지원 등을 개발 중입니다. 커뮤니티의 요청에 따라 데이터베이스 크기 제한 증가나 더 많은 동시 연결 지원도 검토되고 있습니다. API를 통한 동적 데이터베이스 생성과 관리 기능도 계속 개선되고 있습니다.
커뮤니티와 생태계 D1은 Prisma 같은 타입 안전 ORM과 호환되어 개발 편의성이 높으며, Drizzle ORM 등 다양한 도구와도 통합됩니다. Cloudflare 개발자 커뮤니티는 Discord와 포럼에서 활발하게 활동하며, 실전 사례와 모범 사례를 공유하고 있습니다. 오픈소스 프로젝트도 증가하고 있어, D1을 활용한 다양한 템플릿과 라이브러리를 쉽게 찾을 수 있습니다.
Q: Cloudflare D1의 데이터베이스 크기 제한 10GB를 초과하면 어떻게 해야 하나요? A: D1은 개별 데이터베이스당 10GB 제한이 있으며, 이 제한은 증가시킬 수 없습니다. 데이터가 10GB에 가까워지면 새로운 데이터베이스를 생성하여 데이터를 분산하는 샤딩 전략을 사용해야 합니다. 예를 들어 사용자별, 지역별, 또는 시간대별로 데이터베이스를 나누는 방식으로 수평 확장할 수 있습니다. Workers 유료 요금제에서는 최대 50,000개의 데이터베이스를 생성할 수 있으므로, 여러 개의 작은 데이터베이스로 나누어 관리하는 것이 D1의 설계 철학에 부합합니다.
Q: D1의 요금은 어떻게 계산되나요? A: D1은 행 단위로 요금이 계산됩니다. Workers 무료 요금제에서는 하루 최대 500만 행 읽기와 10만 행 쓰기가 무료이며, 유료 요금제(월 $5)에서는 월 250억 행 읽기와 5천만 행 쓰기가 포함됩니다. 포함된 용량을 초과하면 읽기는 100만 행당 $0.001, 쓰기는 100만 행당 $1.00의 추가 비용이 발생합니다. 스토리지는 5GB까지 무료이고 초과 시 월 $0.75/GB가 부과됩니다. 쿼리를 실행하지 않는 동안에는 비용이 발생하지 않는 스케일 투 제로 모델이므로, 실제 사용량만큼만 비용을 지불하게 됩니다.
Q: D1에서 읽기 성능을 향상시키려면 어떻게 해야 하나요?
A: 읽기 성능 향상의 핵심은 적절한 인덱스 설정입니다. 자주 조회하는 컬럼에 인덱스를 생성하면 쿼리 속도가 1ms 미만으로 줄어듭니다. EXPLAIN QUERY PLAN 명령으로 쿼리 실행 계획을 분석하여 인덱스가 제대로 사용되는지 확인할 수 있습니다. 또한 D1은 자동으로 읽기 복제본을 생성하여 읽기 요청을 분산 처리하므로, 별도 설정 없이도 읽기 성능이 자동으로 향상됩니다. 불필요한 컬럼을 조회하지 않도록 SELECT * 대신 필요한 컬럼만 명시하고, 대량 데이터는 LIMIT와 OFFSET으로 페이지네이션하는 것도 성능 개선에 도움이 됩니다.
Q: D1을 로컬 개발 환경에서 테스트할 수 있나요?
A: 네, Wrangler CLI의 --local 플래그를 사용하면 실제 D1 데이터베이스 없이도 로컬에서 테스트할 수 있습니다. wrangler dev --local 명령으로 Workers를 실행하면 로컬 SQLite 데이터베이스가 자동으로 생성되어 D1과 동일한 방식으로 동작합니다. 로컬 개발 중에는 비용이 발생하지 않으며, 프로덕션 배포 전에 충분히 테스트할 수 있습니다. 로컬 데이터베이스는 .wrangler 디렉토리에 저장되며, 스키마 변경이나 데이터 마이그레이션도 로컬에서 먼저 검증한 후 프로덕션에 적용할 수 있습니다.
Q: D1에서 트랜잭션은 어떻게 처리하나요?
A: D1은 배치 쿼리를 통해 트랜잭션을 지원합니다. env.DB.batch() 메서드를 사용하면 여러 쿼리를 하나의 트랜잭션으로 묶어서 실행할 수 있습니다. 배치 내의 모든 쿼리는 원자적으로 실행되므로, 하나라도 실패하면 전체가 롤백됩니다. 이를 통해 데이터 일관성을 보장할 수 있으며, 여러 테이블을 동시에 업데이트하거나 복잡한 비즈니스 로직을 안전하게 처리할 수 있습니다. 배치 쿼리는 네트워크 왕복도 줄여주므로 성능 면에서도 유리합니다. 각 배치는 30초 내에 완료되어야 하며, 너무 많은 쿼리를 한 번에 실행하면 타임아웃이 발생할 수 있으므로 적절히 나누어 처리해야 합니다.
Q: D1과 Prisma ORM을 함께 사용할 수 있나요? A: 네, D1은 Prisma와 호환됩니다. Prisma는 타입 안전한 데이터베이스 접근을 제공하는 ORM으로, D1의 SQLite 호환성 덕분에 Prisma 스키마를 그대로 사용할 수 있습니다. Prisma Client를 Workers 환경에서 사용하려면 Prisma Data Proxy나 Accelerate를 설정해야 하며, D1 데이터베이스를 Prisma의 데이터 소스로 연결할 수 있습니다. 이를 통해 타입 안전한 쿼리 작성, 자동 마이그레이션, Prisma Studio를 통한 데이터 관리 등 Prisma의 모든 기능을 D1에서 활용할 수 있습니다. Drizzle ORM도 D1과 잘 통합되므로, 프로젝트 요구사항에 맞는 ORM을 선택하여 사용할 수 있습니다.
Cloudflare D1은 SQLite의 단순함과 서버리스의 확장성을 결합한 현대적인 데이터베이스 솔루션입니다. 글로벌 분산 아키텍처로 어디서나 빠른 성능을 제공하며, 행 단위 과금으로 비용을 예측 가능하게 관리할 수 있습니다. Workers와의 긴밀한 통합으로 엣지에서 직접 데이터베이스를 운영할 수 있어, 복잡한 인프라 관리 없이도 프로덕션급 앱을 구축할 수 있습니다.
D1을 시작하려면 Cloudflare 계정을 만들고 Wrangler CLI를 설치한 후, 첫 데이터베이스를 생성해보세요. 무료 요금제로도 충분히 테스트할 수 있으며, 필요에 따라 유료 요금제로 확장할 수 있습니다. 적절한 인덱스 설계와 쿼리 최적화를 통해 성능을 극대화하고, 여러 개의 작은 데이터베이스로 나누어 수평 확장하는 전략을 고려해보세요.
관련 문서: 자세한 내용은 클라우드 플레어 D1 공식 페이지 - Cloudflare D1
서버리스 SQL 데이터베이스 생성에서 확인할 수 있습니다....

가계부, 세무관리, 크리에이터 툴, AI 프롬프트 저장까지 로컬 앱 개발에 SQLite가 최적인 이유를 설명합니다. Flutter, Next.js, Electron 등 다양한 환경에서의 활용법과 실제 유즈 케이스를 상세히 다룹니다.
www와 non-www 도메인의 기술적 차이점을 상세히 설명하고, 검색 순위에 미치는 영향과 301 리다이렉트 설정 방법을 다양한 사례와 함께 안내합니다. SITE_CONFIG를 활용한 중앙 집중식 URL 관리까지 실무 가이드를 제공합니다.
Google Nano Banana Pro 기반 AI 이미지 생성 실무 활용법 총정리. 마케팅, 영상 기획, 패션, 건축, 게임 등 16개 분야 40가지 프롬프트 예제와 7가지 핵심 작성 원칙 수록.
구글 노트북LM은 AI 기반 문서 분석 도구로, PDF, 유튜브, 웹페이지를 통합 분석하고 오디오 요약까지 제공합니다. 무료 버전부터 Pro 업그레이드까지 모든 기능을 상세히 설명합니다.