# 05. 저장소 × 과금 파이프라인

> 이 문서는 Fricle의 **저장 구조(3종 분리)와 과금 체계(플랜 + 계측)**를 하나로 정리한다. 저장 구조가 곧 과금 구조이기 때문에 분리하지 않는다.
>
> **사업 본질 정합** = **상태 손실 해소** = 워크스페이스 데이터 영속 + **도구 부족 해소** = 마켓플레이스 앱 결제 / 라이선스 / AI 크레딧 인프라 (= 사업 본질 출처 = [../README.md](../README.md)).
>
> **시장 정합 / 반례** = 이 영역 잘 해소: Notion (= 데이터 영속) / App Store / Adobe Marketplace (= 마켓 인프라) / Apple iCloud (= 클라우드 영속). 부재로 문제: 외부 결제 분리 SaaS (= Slack 마켓 = 외부 PG 위임) = 사용자 = 따로 결제 / 통합 X = 작업 흐름 끊김. 상세 = [MARKET_REFERENCES.md §4](./MARKET_REFERENCES.md).

---

## 개요

Fricle의 저장소는 **3종으로 분리** (Personal / Workspace / External). 각 저장소의 귀속/비용/용도가 다르기 때문에 **파일 저장 전에 반드시 태깅**. 그렇지 않으면 과금/복구/삭제 정책에서 다 꼬인다.

과금은 **결제보다 계측이 먼저**. 대부분 서비스가 결제 붙이고 나중에 usage 붙이다가 망가짐. Fricle은 반대로 감.

> ⚠️ **본문 대부분은 V2 흡수 제안 기반.** 저장소 3종, 4플랜, Pro 애드온, 퇴장 정책 등의 구조는 **비즈니스 논의 후 확정**될 사항. 아래 본문은 "이 방향으로 갈 경우" 기술. 상태는 하단 "논의 중" 섹션 참조.

---

## 파이프라인 흐름

### 저장 파이프라인

```
데이터 생성
→ 데이터 성격 판별
   ├─ 개인 자산 → Personal Drive
   ├─ 협업/앱 데이터 → Workspace AppData
   └─ 외부 연동 → External Drive
→ 메타데이터 기록
→ 권한 태깅
→ 용량 계측
→ 백업/버전 관리
```

### 과금 파이프라인

```
행동 발생
→ usage event 기록     (계측 먼저)
→ 과금 대상 분류
→ 플랜 제한 검사
→ quota 반영
→ 경고 / 업셀 노출
→ 월말 정산 / 청구
```

---

## 저장소 3종 분리

### 1) Personal Drive (개인 귀속)

- 사용자 개인 소유
- 개인 파일 / 개인 export / 개인 설정
- **기본 비공개** — 오너/멤버도 기본 접근 불가 (사용자가 공유한 범위만 예외)
- 지불 주체: 사용자 개인. 기본 **5GB/유저**

### 2) Workspace AppData (워크스페이스 귀속)

- **앱이 서버로 업로드/생성한 파일 저장소**
- 이미지 / 영상 / 문서 업로드, 다른 장치에서 보여주기 위한 서버 업로드
- **워크스페이스에 종속** — 공간에 남음
- 지불 주체: 워크스페이스 오너. 플랜별 한도
- **차감 시점**: 파일 업로드/생성 시에만 (LiveDoc 편집은 영향 없음)
- 누가 앱을 소유했든(개인 라이선스든) 업로드가 해당 워크스페이스에서 발생하면 그 워크스페이스의 AppData 사용

### 3) External Drive (외부 귀속)

- Google Drive 등 외부 스토리지
- **기본은 링크/메타 중심** — Fricle 내부 용량 최소화
- 외부 요금제로 운영 (Fricle 용량과 무관)

### 앱 설치/배치 = 용량 차감 없음

- 앱 설치 + 인스턴스 배치 = **DB 마킹만**, 용량 0
- 유저가 부담 없이 여러 앱 시도 가능

### 저장 전 태깅 (필수)

파일 저장 전에 다음 태그가 붙어야 함:

- `owner_type`: user / workspace
- `visibility`: private / shared / public_link
- `source_app`: 어느 앱에서 생성했는가
- `billing_bucket`: personal / workspace
- `retention_policy`: standard / extended / enterprise

이거 안 해두면 나중에 과금/복구/삭제 정책에서 꼬임.

---

## 요금제 플랜

### 4단계 플랜

| 구분 | Free | Basic | Pro | Enterprise |
|------|------|-------|-----|-----------|
| 워크스페이스 멤버 | 2 | 10 | 20 (기본) | 커스텀 |
| LiveDoc 동시 편집자 | 2 | 5 | 10 (기본) | 커스텀 |
| Workspace AppData | 1GB | 50GB | 1TB | 커스텀 |
| Personal Drive | 5GB/유저 | 5GB/유저 | 5GB/유저 (확장 가능) | 커스텀 |
| External Drive 연동 | 지원 | 지원 | 지원 | 지원 + 보안 |
| Operate 권한 모델 | View 기본 / Operate 제한 | View 기본 / Operate 제한 | View 기본 / Operate 확장 | 정책 기반 |
| RBAC / 감사 로그 | 최소 | 기본 | 강화 | 고급 |
| 버전 고정 | 없음 | 제한적 | 지원 | 승인형 |

### Pro 애드온

- **WS Seat 추가** (= 워크스페이스 멤버 / 동시 편집자 확장 = 1차 영역)
- Workspace AppData 용량 팩
- Personal Drive 용량 팩 (유저별)
- LiveDoc 보존/리플레이 확장 팩 (선택)

> **앱 라이선스 (= 마켓플레이스 앱)** = WS Seat 와 다른 본질. license owner와 사용권 대상은 account, workspace는 설치/공동 작업 맥락 = 출처 = [License & Seat](../architecture/01-license-seat.html)

### 마켓플레이스 앱 폐기 정책

Fricle 검수 받고 공식 마켓에 게시된 앱 = 그 앱을 개발한 유저가 = **본인 임의로 폐기 X**. 폐기 = Fricle 검수 / 정책 위반 / 별도 절차 통해서만.

→ 사용자 라이선스 보호 우선. 출처 = [License & Seat](../architecture/01-license-seat.html).

> 폐기 절차 / 폐기 후 사용자 데이터 운명 정밀화 = `app-marketplace-policy/` (= 신설 라운드) 영역.

### 환불 정책

라이선스 owner = N개 보유 중 = **본인 사용 분 / 할당 분 = 분리 환불 가능**.

→ 라이선스 = 1 단위 자산 = 환불도 1 단위 분리. 출처 = [License & Seat](../architecture/01-license-seat.html).

> 환불 절차 / 비례 환불 / grace 등 정밀 룰 = 결제 방식 결정 후 정밀화.

---

## 과금 — 계측 우선

### 계측 항목 (최소)

- 저장소 사용량 (Personal / AppData / External)
- 앱 실행 횟수
- 협업 참여 인원 수
- LiveDoc 동기화량
- AI 호출량 (해당 앱)
- export 횟수
- workspace별 앱 설치 수

### 과금 단위 — 5개 분리

1. **WS Seat / User** (= 워크스페이스 멤버 / 동시 편집자 = 1차 영역)
2. **앱 라이선스** (= 마켓플레이스 앱 = 본인 구매 + 다른 사람 할당 = LICENSE-MODEL 정합 = 항상 개인 단위)
3. **Workspace**
4. **Storage**
5. **AI credits / premium compute**

섞지 말고 분리해야 플랜이 깔끔. 특히 = **WS Seat ↔ 앱 라이선스 = 다른 본질** = 분리 필수.

### 결제 시스템

Stripe 계열 결제 / 법인 인프라 검토 예정.

단, Stripe Atlas / Billing / Checkout / Payments 중 어떤 조합을 쓸지는 미확정.

- 법인 설립 / 초기 회사 세팅: Stripe Atlas 검토 가능
- 결제 / 구독 / 라이선스 과금: Stripe Billing / Checkout / Payments 검토 필요
- 실제 결제 구조 = Fricle 1차 구독 / 마켓플레이스 앱 라이선스 / AI 크레딧 / 환불·갱신 정책 결정 후 확정.

---

## Export 경로 — Official / Unofficial

레드팀 정책 연계 (상세 → [04-PERMISSION_LICENSE.md](./04-PERMISSION_LICENSE.md)):

| 경로 | 예시 | 정책 |
|------|------|------|
| **Official** | 다운로드, Personal Drive 저장, External Drive 업로드 | 허용/차단/승인/감사 로그 |
| **Unofficial** | 복사/붙여넣기, 스크린샷, 화면 녹화 | 완전 차단 불가. 경고/워터마크/가이드 |

---

## 마켓 수익 분배 (Adobe 모델)

- 개발자 **85~90%** / 플랫폼 **10~15%**
- 검수 필수 (= 게시 후 = 개발자 임의 폐기 X = [License & Seat](../architecture/01-license-seat.html) 정합) / 비독점 판매 / 써드파티 결제 대행 허용

> 정확한 수수료 비율 % = 별도 비즈니스 결정 = LICENSE-MODEL §6 영역.

---

## 유저 체감 연결

01-USER_FLOW의 아래 단계와 연결:
- **2. 개인 워크스페이스 자동 생성** — Personal Drive + AppData 기본값 자동 할당
- **5. 첫 작업 생성** — LiveDoc 편집은 용량 영향 없음 (부담 없이)
- **파일 업로드 시점** — AppData 차감 **첫 만남**. 유저가 처음 "용량"을 의식하는 지점
- **9. 팀 기능 / 유료 플랜 노출** — 플랜 한도 도달 시 상위 플랜 업셀

유저 체감으로는 "용량이 뭐지? 얼마나 써도 되지? 나는 얼마 내야 하지?"의 답.

> 구체 수치(5GB, 1GB 등)와 플랜명(Basic, Pro)은 V2 제시 기반 — 비즈니스 논의 후 확정.

---

## 다른 파이프라인과의 연결

- **선행 입력**: 03-LIVEDOC_SYNC의 "파일 업로드" 경로 / 02-APP_RUNTIME의 "사용량 계측"
- **영향 받는 문서**:
  - 01-USER_FLOW (플랜 업셀 터치 포인트)
  - 04-PERMISSION_LICENSE (개인 라이선스 / 할당 + WS Seat / Export 정책)
- **사이드 이펙트**:
  - 플랜 구조 바뀌면 04의 라이선스 판정 기준 영향
  - 저장소 구분이 바뀌면 03의 데이터 경로 분기 영향
  - Stripe 계열 결제 인프라 연동 시 결제 UX가 01의 업셀 흐름에 직결

---

## External Drive 캐시 정책 [GPT 제안 — 논의 중]

외부 파일을 협업 편의(프리뷰/썸네일/오프라인)로 내부 캐시하면 **Workspace AppData가 늘어날 수 있음**. GPT 제안 정책:

1. 기본은 External 링크/메타만 (캐시 기본 OFF)
2. 캐시 생성은 Owner/Admin만 허용 or 앱별 허용
3. 캐시 예산(GB) / 파일 크기 상한 / 일일 한도
4. 캐시 생성 로그 + 사용량 가시화

> 이 방향 동의 여부 논의 필요.

---

## 결정됨

- **마켓 수익 분배**: 개발자 85~90% / 플랫폼 10~15% (Adobe 모델) — 기존 IDENTITY §8
- **결제 시스템 방향**: Stripe 계열 결제 / 법인 인프라 검토 예정 (= Atlas / Billing / Checkout / Payments 조합 미확정)
- **마켓플레이스 앱 폐기 = 개발자 임의 폐기 X** — 출처 = [License & Seat](../architecture/01-license-seat.html). Fricle 검수 / 정책 위반 / 별도 절차 통해서만 폐기 가능
- **환불 단위 = 라이선스 1 단위 분리** — 출처 = [License & Seat](../architecture/01-license-seat.html). 본인 사용 분 / 할당 분 = 분리 환불 가능

> 이 파이프라인 본문 대부분은 V2 흡수 기반이라 아직 **우리가 합의한 "결정됨"은 소수**. 저장소 구조/플랜/애드온 전부 비즈니스 논의 후 확정.

---

## 결정 필요

(비어있음)

---

## 논의 중

**V2 흡수 제안 (비즈니스 논의 시 확정 예정)**
- **저장소 3종 분리** (Personal / Workspace AppData / External) — V2 [전제]
- **앱 설치/배치 = 용량 차감 없음** (DB 마킹만) — V2 [전제]
- **AppData 차감 시점** = 파일 업로드/생성 시에만 — V2 [전제]
- **Personal Drive 기본 5GB/유저** — V2 제시
- **저장 전 태깅** (owner_type / visibility / billing_bucket 등) — V2 제시
- **4플랜 체계** (Free/Basic/Pro/Enterprise) — V2 제시
- **Pro 애드온** (WS Seat / AppData / Personal Drive / LiveDoc 보존) — V2 [결정안]
- **과금 단위 5개 분리** (WS Seat / 앱 라이선스 / Workspace / Storage / AI) — V2 제시 + LICENSE-MODEL 정합
- **계측 먼저, 결제 나중** 원칙 — V2 강조
- **Export 경로 분리** (Official / Unofficial) — V2 [결정안]

**세부 판단 필요**
- **External Drive 캐시 정책** [GPT 제안] — 동의 여부
- **가격 정책** — 각 플랜별 실제 가격대, 개인 구독 / WS Seat / 앱 라이선스 단가
- **플랜 업그레이드 UX** — Free → Basic 등 전환 시 UI 어디?
- **Personal Drive UI 위치** — 유저가 어디서 자기 드라이브 확인?
- **External Drive 설정 플로우** — 어느 설정에서 연결?

---

## 폐기됨 (= LICENSE-MODEL 결정으로 폐기)

- ~~**앱 소유자 퇴장 정책 (플랜별 Lock / 유예 / 승계 / 조직 회수)**~~ — LICENSE-MODEL §3.4 (= 마켓플레이스 앱 폐기 = 개발자 임의 폐기 X) 결정으로 = **단일 정책으로 통합** = 플랜별 차등 폐기.
- ~~**앱 소유자 퇴장 유예 기간 = 플랜별 구체 수치**~~ — 위 영역 폐기와 동일.

---

## 고려 사항

(없음)
