테크 경제

Cloudflare Workers KV 무료 티어 한도 초과와 실제 과금 시나리오 트러블슈팅

Cloudflare Workers KV 무료 티어 한도 초과와 실제 과금 시나리오 트러블슈팅

무료로 쓰던 서비스에서 청구서가 날아오면 당황스럽죠. Cloudflare Workers KV를 쓰다가 예상치 못한 과금을 받은 개발자들이 꽤 늘었어요. 특히 사이드 프로젝트나 스타트업 초기에 트래픽이 갑자기 튀는 순간, 무료 티어 한도를 넘어 과금이 시작되는데 — 얼마나 나오는지, 어떻게 막는지 모르는 경우가 많거든요.

핵심 요약

  • Workers KV 무료 티어는 읽기 10만 회/일, 쓰기 1,000회/일, 삭제 1,000회/일, 목록 조회 1,000회/일이 기본 한도예요.
  • 한도를 넘으면 읽기는 100만 회당 $0.50, 쓰기는 100만 회당 $5.00 — 단가가 열 배 차이 나요.
  • 과금의 주요 원인은 캐시 미스로 인한 KV 반복 읽기, 무한 루프 Worker 버그, list() 남발이에요.
  • 읽기 빈도가 높고 쓰기가 적은 워크로드엔 KV가 유리하지만, 반대 패턴이면 Durable Objects나 D1이 더 나은 선택이에요.

1. Workers KV 무료 티어, 정확히 어디까지 무료인가요?

Cloudflare Workers KV는 엣지 네트워크 위에서 동작하는 키-값 저장소예요. 서울, 도쿄, 프랑크푸르트 — 전 세계 300개 이상 데이터센터에서 낮은 지연 시간으로 데이터를 읽어오는 게 핵심이죠.

무료 티어 기준 일일 한도는 아래와 같아요.

작업 유형무료 한도초과 단가
읽기 (get)100,000회$0.50 / 백만 회
쓰기 (put)1,000회$5.00 / 백만 회
삭제 (delete)1,000회$5.00 / 백만 회
목록 (list)1,000회$5.00 / 백만 회
저장 용량1GB$0.50 / GB/월

숫자만 보면 넉넉해 보여요. 하루 읽기 10만 번이면 많잖아요? 그런데 실제 운영 환경에서 이 한도가 얼마나 빠르게 소진되는지 보면 생각이 달라질 수 있어요.

Workers는 요청 하나당 KV 읽기를 여러 번 호출하는 패턴을 자주 써요. 인증 토큰 검증 + 사용자 설정 조회 + 기능 플래그 확인을 각각 kv.get()으로 부르면, 요청 하나에 읽기가 3회 발생해요. 하루 요청이 3만 4천 건만 돼도 10만 회 한도에 걸리는 거죠.

쓰기는 더 민감해요. 1,000회는 1분당 0.69회 수준이에요. 사용자 세션 업데이트나 이벤트 로깅을 KV로 바로 쓰는 구조라면, 사용자 수십 명 선에서도 한도를 넘을 수 있어요.


2. 실제 과금이 발생하는 시나리오 3가지

시나리오 1: 캐시 없는 KV 읽기 반복

가장 흔한 실수는 동일 요청 내에서 같은 키를 여러 번 읽는 것이에요.

// ❌ 이렇게 하면 읽기 3회 발생
const userPlan = await env.KV.get(`user:${userId}:plan`);
const userPref = await env.KV.get(`user:${userId}:prefs`);
const userFlag = await env.KV.get(`user:${userId}:flags`);

Workers KV는 get() 호출 자체가 읽기 횟수로 카운트돼요. 엣지 캐시 히트가 나더라도 과금 카운터는 올라가요. 해결책은 단순해요 — 한 요청 안에서 같은 KV 데이터를 여러 번 쓴다면, Worker 메모리에 변수로 저장하고 재사용하면 돼요.

시나리오 2: list() 남발

list()는 쓰기·삭제와 동일하게 무료 1,000회/일이에요. 루프 안에서 list()를 호출하거나 페이지네이션을 잘못 짰을 때 문제가 생겨요. cursor 기반 페이지네이션에서 while(cursor) 루프를 잘못 짜면 끝없는 루프가 돌면서 list() 호출이 폭발적으로 늘어나요. 과금 트러블슈팅 사례 중 상당수가 이 패턴에서 비롯돼요.

시나리오 3: Worker 무한 루프 또는 재시도 폭풍

에러 핸들링 없이 KV 쓰기를 반복 시도하는 구조면, 단 몇 분 만에 하루 쓰기 한도를 모두 소진할 수 있어요. Queue Worker에서 메시지 처리 실패 시 자동 재시도가 설정된 상태에서 처리 중 KV 쓰기가 포함되어 있다면, 재시도마다 쓰기가 쌓여요. Cloudflare Workers Queues의 최대 재시도 횟수 기본값은 3회지만, 설정에 따라 높게 잡혀 있는 경우도 많아요.


3. Workers KV vs 대안: 어떤 걸 써야 할까요?

과금이 걱정된다면 워크로드에 맞게 저장소를 바꾸는 게 더 근본적인 해결책이에요.

기준Workers KVDurable ObjectsD1 (SQLite)
읽기 비용낮음 ($0.50/백만)상대적으로 높음낮음 ($0.001/천만)
쓰기 비용높음 ($5.00/백만)중간낮음 ($1.00/백만)
일관성최종 일관성강한 일관성강한 일관성
적합 패턴읽기 위주, 정적 설정실시간 상태 관리복잡한 쿼리, CRUD
무료 한도읽기 10만/일100만 req/월500만 행 읽기/일

쓰기 빈도가 높은 워크로드라면 Workers KV는 비용 면에서 불리해요. D1은 쓰기 단가가 Workers KV 대비 훨씬 저렴하고 무료 티어도 넉넉한 편이에요. 반면 읽기 위주의 설정 데이터나 기능 플래그 저장엔 Workers KV가 엣지 레이턴시 측면에서 여전히 강점을 가져요.


4. 지금 당장 할 수 있는 트러블슈팅 체크리스트

문제 1: 과금이 발생했는데 어디서 나오는지 모르겠어요

Cloudflare 대시보드 → Workers & Pages → 해당 Worker → Metrics 탭에서 KV 작업별 호출 수를 확인할 수 있어요. kv_reads, kv_writes 지표를 시간대별로 보면 어느 시점에 스파이크가 있었는지 바로 보여요. wrangler tail 명령어로 실시간 로그를 켜두고 KV 호출 패턴을 직접 확인하는 것도 좋아요.

문제 2: 무료 티어 한도 알림을 못 받았어요

Cloudflare는 한도 초과 알림을 이메일로 보내지만, 스팸 필터에 걸리거나 알림 설정이 꺼진 경우가 있어요. 대시보드 → Notifications에서 Workers KV Threshold 알림이 켜져 있는지 반드시 확인하세요.

문제 3: 과금을 줄이려면 코드를 어떻게 바꿔야 하나요?

세 가지 패턴을 체크하세요.

  • 요청 핸들러 최상단에서 필요한 KV 데이터를 한 번만 읽고 변수에 저장하기
  • list() 호출은 백그라운드 작업이나 캐싱 레이어로 분리하기
  • Queue Worker에 maxRetries 명시적으로 낮게 설정하기 (권장: 1-2회)

5. 앞으로 어떻게 될까요?

2026년 현재 D1과 Workers KV의 가격 구조 차이가 커지면서, 많은 팀이 KV를 “설정 데이터 전용"으로만 쓰고 나머지는 D1으로 이전하는 패턴을 보이고 있어요.

앞으로 6-12개월간 주목할 변화 두 가지예요.

  • Workers KV 쓰기 단가 조정 가능성: 읽기 대비 열 배 비싼 쓰기 단가는 Vercel KV, AWS DynamoDB와 비교했을 때 상대적으로 높아요. Cloudflare가 D1 확산을 유도하기 위해 KV 가격을 유지하거나 올릴 가능성이 있어요.
  • Workers Analytics Engine 강화: 과금 예측과 모니터링 도구가 더 정교해질 거예요. 2026년 하반기엔 빌트인 비용 알림 기능이 추가될 가능성도 있어요.

지금 당장 해야 할 것 하나 — Cloudflare 대시보드에서 Workers KV Metrics를 열어보세요. kv_readskv_writes 일별 추이가 무료 한도의 80%를 넘고 있다면, 코드 패턴 점검이 필요한 시점이에요. 사후 대응보다 사전 모니터링이 훨씬 저렴하거든요.

여러분의 Worker는 지금 KV를 얼마나 호출하고 있나요?

참고자료

  1. Cloudflare 무료 요금제 제한: 빌드/요청 실패 막는 핵심 가이드 - Sentio
  2. Cloudflare - 나무위키

Photo by Conny Schneider on Unsplash