# R2 스토리지 가이드
Cloudflare R2는 의료진 사진, 블로그 이미지, 갤러리 사진 등을 클라우드에 저장하는 서비스입니다. 관리자 페이지에서 업로드하면 **자동으로 R2에 저장**되므로, 대부분의 경우 에이전트가 관리합니다.
---
## 일반 사용자
### 관리자 페이지에서 이미지 업로드
1. **관리자 로그인** → 의료진/프로그램/블로그 관리
2. **이미지 업로드** → 자동으로 Cloudflare R2에 저장
3. **저장 위치**:
- 의료진 사진 → `staff/` 폴더
- 프로그램 이미지 → `programs/` 폴더
- 블로그 이미지 → `posts/` 폴더
- 갤러리 → `gallery/` 폴더
### R2 설정이 필요한 경우
이미지 업로드가 실패하면:
```
"에이전트에게 R2 설정해줘"
```
또는:
```
"이미지 업로드 안 되는데 확인해줘"
```
에이전트가 자동으로:
1. Cloudflare 로그인 확인
2. R2 버킷 생성
3. 설정 업데이트
4. 다시 배포
---
## R2 vs 로컬 파일 저장
```
로컬 파일 (public/local/) R2 클라우드 (동적 업로드)
─────────────────────── ──────────────────────
로고, 아이콘, 정적 배너 의료진 사진, 블로그 이미지
코드에서 직접 참조 관리자 페이지에서 업로드
Git으로 버전 관리 Cloudflare가 자동 관리
```
---
## 저장 용량
| 항목 | 무료 한도 |
|------|---------|
| 저장 공간 | 10GB/월 |
| 읽기 요청 | 1,000만/월 |
| 쓰기 요청 | 100만/월 |
일반적인 한의원 홈페이지는 무료 한도로 충분합니다.
---
## 수동 설정 (개발자용)
이미지 업로드 실패 시 직접 설정할 수 있습니다:
### 1단계: Cloudflare 로그인
```bash
npx wrangler login
```
### 2단계: R2 버킷 생성
```bash
npx wrangler r2 bucket create {clinic-name}-uploads
```
### 3단계: wrangler.toml 확인
```toml
[[r2_buckets]]
binding = "BUCKET"
bucket_name = "clinic-uploads" # 위 버킷명
```
### 4단계: 배포
```bash
npm run deploy
```
---
## R2 파일 관리 (CLI)
에이전트 없이 직접 관리할 때:
```bash
# 버킷의 파일 목록 조회
npx wrangler r2 object list {bucket-name}
# 특정 파일 다운로드
npx wrangler r2 object get {bucket-name}/staff/1/profile.jpg --file ./profile.jpg
# 파일 업로드
npx wrangler r2 object put {bucket-name}/gallery/photo.jpg --file ./photo.jpg
# 파일 삭제
npx wrangler r2 object delete {bucket-name}/staff/1/old.jpg
```
---
## 문제 해결
| 상황 | 해결 |
|------|------|
| **이미지 업로드 실패** | "에이전트에게 R2 설정 확인해줘" 요청 |
| **"R2 bucket not found"** | `npx wrangler r2 bucket list` → 버킷 생성 |
| **이미지가 프로덕션에 안 보임** | `npm run deploy` 실행 |
---
## 관련 문서
- **[Cloudflare 설정](/guide#cloudflare-setup)** — R2와 D1 초기 설정
- **[배포 가이드](/guide#deployment-workflow)** — 이미지 업로드 후 배포