1. 목적
Penta 앱의 유료 구독 서비스 운영 정책을 정의합니다. 구독은 사용자에게 전체 콘텐츠 접근 권한을 부여하며, Apple App Store와 Google Play Store를 통한 인앱 결제로 처리됩니다.
2. 구독 유형 및 가격
2-1. 구독 플랜
| 유형 | 코드 | 기간 |
|---|
| 월간 구독 | 1_month | 1개월 |
| 반기 구독 | 6_month | 6개월 |
| 연간 구독 | 12_month | 12개월 |
2-2. 기본 가격
| 국가 | 월간 가격 | 비고 |
|---|
| 한국 | 9,800원/월 | 부가세 포함 |
| 일본 | 980엔/월 | 소비세 포함 |
2-3. 기간별 할인
| 플랜 | 할인율 | 한국 실질 월 가격 |
|---|
| 6개월 | 15% | 약 8,330원/월 |
| 12개월 | 25% | 약 7,350원/월 |
3. 무료 체험 (Trial)
3-1. 정책
| 항목 | 정책 |
|---|
| 체험 기간 | 3일 (SIGNUP_TRIAL_DAYS = 3) |
| 대상 | 최초 가입자 (has_subscribed_before = False) |
| 판정 | is_in_trial 속성: 가입 후 3일 이내이고 이전 구독 이력이 없는 경우 |
- 무료 체험 기간 중에는 전체 콘텐츠에 접근 가능합니다.
- 체험 기간이 종료되면 자동으로 비구독 상태로 전환됩니다.
- 이전에 한 번이라도 구독한 적이 있는 사용자는 무료 체험 대상에서 제외됩니다.
4. 구독 상태 관리
4-1. 상태 종류
구독 상태는 status 속성에 의해 실시간으로 계산됩니다.
| 상태 | 코드 | 설명 |
|---|
| 활성 | active | 유효한 구독 기간 내, 정상 상태 |
| 해지 | cancelled | 자동 갱신 중지되었으나 end_date까지 이용 가능 |
| 일시정지 | paused | pause_until 시점까지 서비스 이용 불가 |
| 만료 | expired | end_date(+ 유예기간) 경과 |
4-2. 유효성 판단 기준
end_date가 구독 유효성의 기본 기준입니다.
- 유예기간(
grace_until)이 설정된 경우, end_date와 grace_until 중 더 늦은 시점이 실효 종료일(effective_end)이 됩니다.
- 일시정지(
pause_until)가 현재 시각보다 미래인 경우 비활성 처리됩니다.
4-3. 주요 필드
| 필드 | 타입 | 설명 |
|---|
type | CharField | 구독 유형 (1_month / 6_month / 12_month) |
start_date | DateTimeField | 구독 시작일 |
end_date | DateTimeField | 구독 종료일 (유효성 기준) |
auto_renew | BooleanField | 자동 갱신 여부 |
next_billing_date | DateTimeField | 다음 결제 예정일 |
is_cancelled | BooleanField | 해지 여부 |
cancelled_at | DateTimeField | 해지 시각 |
pause_until | DateTimeField | 일시정지 종료 시각 |
grace_until | DateTimeField | 결제 실패 유예 기간 종료 시각 |
cancellation_reason | CharField | 해지 사유 (refund, chargeback, user 등) |
5. 구독 해지
5-1. 해지 처리
- 해지 시
is_cancelled = True, auto_renew = False로 설정됩니다.
- 해지 후에도
end_date까지 서비스 이용이 가능합니다 (즉시 중단되지 않음).
- 자동 갱신만 중지됩니다.
5-2. 해지 시 래퍼럴 혜택 처리
- 래퍼럴 보너스를 받은 사용자가 최소 유지 기간(
referral_minimum_period_days, 기본 14일) 이전에 해지하면:
- 래퍼럴 보너스 주수만큼
end_date가 감소됩니다.
referral_benefits_revoked = True로 설정됩니다.
- 추천인의 리워드도 함께 회수됩니다.
6. 일시정지 및 유예기간
6-1. 일시정지
pause_until 필드로 관리됩니다.
- 일시정지 기간 중에는 구독 상태가
paused로 표시되며, 콘텐츠 접근이 제한됩니다.
6-2. 유예기간 (Grace Period)
- 결제 실패 등의 사유로
grace_until이 설정됩니다.
- 유예기간 내에 결제가 재시도/완료되면 구독이 유지됩니다.
- 유예기간이 경과하면 만료 처리됩니다.
7. 래퍼럴 보너스
7-1. 관련 필드
| 필드 | 설명 |
|---|
has_referral_bonus | 래퍼럴 혜택 수령 여부 |
referral_bonus_weeks | 받은 보너스 주 수 |
referral_minimum_period_days | 최소 유지 기간 (기본 14일) |
referral_benefits_revoked | 혜택 회수 여부 |
7-2. 패널티 없는 해지 조건
can_cancel_without_penalty 속성으로 판단합니다.
- 래퍼럴 보너스가 없거나, 구독 시작 후
referral_minimum_period_days 이상 경과한 경우 패널티 없이 해지 가능합니다.
8. API
8-1. 구독 신청
- Endpoint:
POST /api/payments/subscribe/
- 새로운 구독을 생성합니다.
8-2. 구독 정보 조회 / 수정
- 조회:
GET /api/payments/subscription/
- 수정:
PATCH /api/payments/subscription/
- 현재 구독 상태, 자동 갱신 설정 등을 관리합니다.
8-3. 구독 해지
- Endpoint:
POST /api/payments/subscription/cancel/
- 자동 갱신을 중지하고 해지 처리합니다.
8-4. 구독 이력
- Endpoint:
GET /api/payments/subscription-history/
- 과거 구독 이력을 조회합니다.
8-5. 구독 오퍼
- Endpoint:
GET /api/payments/subscription-offers/
- 현재 이용 가능한 구독 플랜 및 프로모션 정보를 반환합니다.