클라우드플래어 D1 2MB 제한이 가르쳐준 데이터베이스 설계 교훈
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
DevOps
대상자
- 대상: 웹 애플리케이션 개발자, 클라우드 인프라 설계자
- 난이도: 중급 이상 (데이터베이스 아키텍처, 클라우드 스택 이해 필요)
핵심 요약
D1의 2MB 제한
을 무시한 대규모 HTML 저장으로 인한 데이터베이스 오류 발생- 대규모 텍스트 데이터는 객체 저장소(R2)에 저장해야 하는 아키텍처 패턴
1MB 기준값
설정과D1(메타데이터) + R2(본문)
하이브리드 구조로 성능 및 확장성 개선
섹션별 세부 요약
1. 문제 발생 배경
- 2MB 제한 무시로 인한 대규모 문서 저장 실패
D1의 2MB
제한은 BLOB/문자열 최대 크기로 명시됨- 학술 논문, 장문의 튜토리얼 등 대규모 콘텐츠 처리 시 오류 발생
2. 초기 설계의 문제점
- HTML 텍스트 크기 불확실성 (스타일, 메타데이터 포함 시 2MB 초과 가능성)
- 데이터베이스 부하 증가 (대규모 텍스트 저장으로 인한 성능 저하)
- 백업/이전 시 복잡성 증가 (대규모 레코드 처리 시 오류 확률 증가)
3. 아키텍처 리팩토링
async function storeArticleContent(articleData) {
const contentSize = Buffer.byteLength(articleData.html, 'utf8');
if (contentSize > 1024 * 1024) { // 1MB threshold
// R2에 저장
const r2Key = `articles/${articleData.id}/content.html`;
await uploadToR2(r2Key, articleData.html);
await d1.prepare(`
INSERT INTO articles (id, title, url, content_location, storage_type, created_at)
VALUES (?, ?, ?, ?, 'r2', ?)
`).bind(...).run();
} else {
// D1에 직접 저장
await d1.prepare(`
INSERT INTO articles (id, title, url, content, storage_type, created_at)
VALUES (?, ?, ?, ?, 'database', ?)
`).bind(...).run();
}
}
- 1MB 기준값 설정으로 D1 제한 하위에 안전하게 저장
- R2(객체 저장소) 사용으로 대규모 콘텐츠 처리 가능
4. 핵심 교훈
- 문서 제한을 반드시 확인 (2MB 제한은 기술적 한계로 존재)
- 메타데이터와 대규모 콘텐츠 분리 (관계형 DB는 메타데이터, 객체 저장소는 본문)
- 실제 데이터로 테스트 (테스트 데이터가 대규모 콘텐츠 불포함 시 오류 유발)
결론
- D1은 메타데이터, R2는 대규모 콘텐츠로 분리하는 하이브리드 아키텍처가 필수
- 1MB 기준값 설정 및 입력 크기 검증 로직 추가 필요
- Cloudflare 스택 기반 애플리케이션 개발 시 객체 저장소 활용이 핵심 전략