R2
개요
파일이 담긴 상자를 맡겨 두었다가 나중에 찾아가는 거대한 온라인 창고를 떠올려 보세요. R2는 Cloudflare의 객체 스토리지 — 바로 그 창고 — 로, 이미지, 동영상, 백업, 사용자 업로드, 빌드 산출물 같은 파일을 저장하는 공간입니다. Amazon S3와 동일한 (애플리케이션 프로그래밍 인터페이스, 도구들이 이와 소통하는 데 쓰는 명령 모음)를 사용하기 때문에 대부분의 S3 도구와 SDK(소프트웨어 개발 키트, 미리 만들어진 코드 라이브러리)가 수정 없이 그대로 작동합니다. 가장 큰 차이점은 가격입니다. R2는 스토리지와 작업(operation)에 대해 요금을 부과하지만 이그레스(egress) 요금이 없어서(창고에서 데이터가 나가는 데 요금을 매기지 않아서) 데이터를 외부로 제공하는 것은 무료입니다.
강점
- 이그레스 요금 없음 — 미디어가 많거나 다운로드가 많은 앱에서 상당한 비용 절감 효과.
- S3 호환 API라서 기존 도구와 라이브러리가 그대로 작동.
- Worker에 직접 바인딩하면 코드에 자격 증명 없이 읽기/쓰기 가능.
- Cloudflare의 CDN(콘텐츠 전송 네트워크, 각 방문자 가까이에 파일 사본을 두는 전 세계 서버망) 뒤에 두어 빠르고 캐싱된 전송 가능.
- 프로비저닝 없이 대용량 객체와 대용량 버킷까지 확장.
트레이드오프
- 파일시스템이나 데이터베이스가 아닌 객체 스토리지 — 파일 내부를 쿼리할 수 없음.
- 작업(PUT/GET/LIST)에 요금이 부과되므로 잦은 접근 패턴은 비용이 쌓임.
- 강한 일관성과 기능이 S3와 세부적으로 다르므로 엣지 케이스를 확인해야 함.
- 작고 자주 변경되는 값에는 KV(키-값 저장소, 거대한 사전 같은 것)나 D1( 데이터베이스)이 더 적합.
언제 쓰면 좋은가
사용자 업로드, 생성된 파일, 대용량 정적 자산, 데이터 내보내기, 백업에 R2를 사용하세요. 특히 S3의 대역폭 비용이 부담스러운 모든 경우에 적합합니다.
바이브 코딩 적합성
R2는 바인딩 덕분에 평소의 자격 증명 처리 과정을 없애주기 때문에 AI 주도 빌드와 잘 어울립니다. 에이전트가 env.BUCKET에 직접 씁니다. 파일이 공개(Worker나 커스텀 도메인으로 제공)인지 비공개(서명된 접근)인지 에이전트에게 알려주면 전송 방식을 올바르게 연결합니다. 아래 예시는 버킷을 바인딩하고 에서 파일을 업로드합니다.
# 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