R2
개요
R2는 Cloudflare의 객체 스토리지로, 이미지, 동영상, 백업, 사용자 업로드, 빌드 산출물 같은 파일을 저장하는 공간입니다. Amazon S3와 동일한 API를 사용하기 때문에 대부분의 S3 도구와 SDK가 수정 없이 그대로 작동합니다. 가장 큰 차이점은 가격입니다. R2는 스토리지와 작업(operation)에 대해 요금을 부과하지만 이그레스(egress) 요금이 없어서 데이터를 외부로 제공하는 것은 무료입니다.
강점
- 이그레스 요금 없음 — 미디어가 많거나 다운로드가 많은 앱에서 상당한 비용 절감 효과.
- S3 호환 API라서 기존 도구와 라이브러리가 그대로 작동.
- Worker에 직접 바인딩하면 코드에 자격 증명 없이 읽기/쓰기 가능.
- Cloudflare의 CDN 뒤에 두어 빠르고 캐싱된 전송 가능.
- 프로비저닝 없이 대용량 객체와 대용량 버킷까지 확장.
트레이드오프
- 파일시스템이나 데이터베이스가 아닌 객체 스토리지 — 파일 내부를 쿼리할 수 없음.
- 작업(PUT/GET/LIST)에 요금이 부과되므로 잦은 접근 패턴은 비용이 쌓임.
- 강한 일관성과 기능이 S3와 세부적으로 다르므로 엣지 케이스를 확인해야 함.
- 작고 자주 변경되는 값에는 KV나 D1이 더 적합.
언제 쓰면 좋은가
사용자 업로드, 생성된 파일, 대용량 정적 자산, 데이터 내보내기, 백업에 R2를 사용하세요. 특히 S3의 대역폭 비용이 부담스러운 모든 경우에 적합합니다.
바이브 코딩 적합성
R2는 바인딩 덕분에 평소의 자격 증명 처리 과정을 없애주기 때문에 AI 주도 빌드와 잘 어울립니다. 에이전트가 env.BUCKET에 직접 씁니다. 파일이 공개(Worker나 커스텀 도메인으로 제공)인지 비공개(서명된 접근)인지 에이전트에게 알려주면 전송 방식을 올바르게 연결합니다. 아래 예시는 버킷을 바인딩하고 CLI에서 파일을 업로드합니다.
# wrangler.toml
[[r2_buckets]]
binding = "BUCKET"
bucket_name = "uploads"
npx wrangler r2 bucket create uploads
npx wrangler r2 object put uploads/logo.png --file ./logo.png