
AI KOREA 24 무료 강의 06 · 초보자용 · 준비물 0원
한도 초과로 서비스가 멈춘 날의 기록까지 포함된 실전 운영기입니다.
이 강의에서 배우는 것
- Cloudflare 무료 티어의 실제 한도(숫자)를 압니다.
- 한도를 넘지 않게 쓰는 운영 규칙 4가지를 익힙니다.
- 한도를 초과했을 때의 대처법을 배웁니다.
준비물
- Cloudflare 계정 (무료)
- 비용 0원 — 이 강의는 "0원으로 버티는 법"에 대한 강의입니다.
왜 이걸 배우나요
"무료"에는 한도가 있습니다. 한도를 모르고 쓰면 어느 날 갑자기 서비스가 멈춥니다. 실제로 멈춰봤습니다. D1 일일 쓰기 한도 100,000행을 넘겨서 emDash 초기화가 통째로 막힌 날이 있었습니다. 이 강의는 그날의 기록을 포함한 운영 매뉴얼입니다.
1. 무료 티어 한도 — 숫자부터 외우기
| 자원 | 무료 한도 (일) | 비고 |
|---|---|---|
| D1 읽기 | 5,000,000행 | 넉넉해 보이지만 스캔 한 번에 녹습니다 |
| D1 쓰기 | 100,000행 | 계정 단위 공유 — 프로젝트끼리 합산됩니다 |
| Workers CPU | 10ms/요청 | 짧지만 rapid-fire에 막힙니다 |
"D1 쓰기 10만 행"이 얼마나 될까요? 21,951행을 import했더니 실제로는 158,892행이 계상됐습니다. D1의 쓰기 카운트는 테이블 행뿐 아니라 인덱스 쓰기까지 포함하기 때문입니다. 인덱스가 많은 테이블은 행당 6~7배로 불어납니다. 주니어가 "약 4만 행"이라고 집계한 것과 실측(180,740행)이 4배 넘게 차이 났던 이유입니다.
실습: Cloudflare 대시보드의 계정 사용량을 열어보세요. D1 rowsWritten 그래프가 있는지 확인합니다.
2. 운영 규칙 4가지
규칙 1. 전체 테이블 스캔 금지, 인덱스 필수
고객이 보는 쿼리는 반드시 인덱스를 탑니다. SELECT * FROM news 같은 전체 스캔은 읽기 한도를 갉아먹는 주범입니다. 실제로 뉴스 풀스캔 한 번에 570만 행이 나간 적이 있습니다.
규칙 2. 대량 쓰기는 1,000행 이하로 분할
1회 작업당 쓰기는 1,000행 이하로 나눠서 실행합니다. 2만 행 import를 한 번에 돌렸다가 하루 한도를 통째로 쓴 것이 위의 실측 사건입니다.
규칙 3. Workers는 직접 D1 SQL로, API 경유 금지
Workers Free의 10ms CPU 한도는 생각보다 빡빡합니다. 무거운 처리를 API 레이어에 얹으면 1102 에러(CPU 초과)가 납니다. 가벼운 SQL은 D1에 직접 던지는 게 안전합니다.
규칙 4. 유료 전환은 최후의 수단으로
한도 초과 당일의 선택지는 두 가지였습니다. 기다리기(무료, 다음날 09:00 리셋) vs 유료 플랜(즉시). 답은 기다리기였습니다. 유료 전환은 한 번 하면 돌아오기 어렵습니다. 무료로 버틸 수 있는 구조를 먼저 만드세요.
3. 한도 사용량 직접 재는 법
대시보드만 믿지 말고 숫자를 직접 잽니다. D1 사용량은 REST가 아니라 GraphQL analytics로 조회합니다.
query($f: D1AdaptiveGroupsFilter_InputObject!, $acct: String!) {
viewer { accounts(filter:{accountTag:$acct}) {
d1AnalyticsAdaptiveGroups(limit:100, filter:$f) {
sum { rowsWritten rowsRead }
dimensions { datetimeHour }
} } } }엔드포인트는 POST https://api.cloudflare.com/client/v4/graphql/analytics 하나입니다. 다른 REST 경로(/d1/analytics 등)는 전부 404가 뜹니다. 이건 직접 다 두드려보고 알아낸 것입니다.
실습: 위 쿼리로 어제 날짜의 rowsWritten을 조회해 보세요. 한도의 몇 %를 쓰고 있는지 알 수 있습니다.
4. 이미지 용량 — R2의 조용한 킬러
이미지는 R2에 쌓입니다. 10GB 무료枠도 이미지 몇만 장이면 찹니다. 규칙은 단순합니다. 업로드 전에 WebP로 변환합니다.
- 썸네일: 1200px, 품질 80
- 본문 이미지: 1600px, 품질 85
이렇게 하면 썸네일 약 6~7만 장이 10GB 안에 들어갑니다. 원본을 그대로 올리는 순간 용량이 터집니다.
흔한 실수 Top 3
- "2만 행이니까 10만 한도에 여유 있겠지" — 인덱스까지 계상되면 7배가 됩니다. 실측이 답입니다.
- 크론잡의 쿼리를 안 봄 — 스케줄러가 매시간 전체 스캔을 돌리면 읽기 한도가 조용히 증발합니다.
- 한도 초과 = 유료 전환 — 아닙니다. 리셋은 매일 자정(UTC)에 됩니다. 기다리세요.
정리
- D1: 읽기 500만행/일, 쓰기 10만행/일, 계정 단위 공유
- 쓰기는 인덱스까지 계상 → 실측의 6~7배로 잡기
- 규칙: 스캔 금지·분할 쓰기·직접 SQL·유료 전환 보류
- 이미지는 WebP 사전 변환 (1200px/품질 80)
다음 강의이자 마지막 강의에서는 이 모든 것을 엮은 AI 뉴스 브리핑 자동화 파이프라인을 만듭니다. 수집부터 발행까지, 그리고 멈췄을 때 고치는 법까지입니다.
---
*AI KOREA 24 무료 강의 · Operated by 스타일팩토리9*


