AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

클라우드플래어 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 스택 기반 애플리케이션 개발 시 객체 저장소 활용이 핵심 전략