유료 플랜 결제 전 고지·신청 기록·구독 설정 계약 (이슈 #1640)
게시 문안: 이용약관 v1 제5조~제5조의3(출시판, 2026-09-15 — 초안 v6의 유료 조항을 통합). 결제 전 고지문 초안: 유료 플랜 법률문서 v6 검토본 4절. 이 계약은 그 문안을 어느 화면에, 어떤 순서로, 어떤 기록을 남기며 보여 줄지를 정한다.
전제 (2026-09-15): 결제 연동(StoreKit·Google Play Billing·영수증 검증·구독 상태 표)은 아직 어느 이슈에도 없다. 이 계약은 유료 기능 구현 이슈가 그 연동을 만들 때 함께 구현한다. 오너 결정 D1: 앱 내 결제만. 오너 지시(2026-09-15) "꼭 필요한 것만": 필요한 것은 결제 버튼 위 고지 한 화면과 설정의 구독 관리 링크뿐이다 — 별도 기록 표·서버 문·알림 흐름은 만들지 않는다(3절).
1. 왜 이 계약이 필요한가
유료 플랜은 회원과 운영자 사이의 별도 유료 계약이다. 가입 약관 동의와 달리 다음이 법과 스토어 정책으로 요구된다.
| 요구 | 근거 | 이 계약에서 담당하는 곳 |
|---|---|---|
| 결제 전에 제공 내용·가격·기간·자동 갱신·해지 방법·약관 링크를 보이고, 회원이 확인한 뒤 명시적으로 신청 | 전자상거래법 13조 2항, Apple 3.1.2(c), Google Play 구독 정책 | 2-1 구독 신청 화면, 3 신청 기록 |
| 이용 개시 후 청약철회 제한을 결제 전에 알리고 확인받기 | 전자상거래법 17조 2항·6항 | 2-1 확인 체크 |
| 무료 체험 → 유료 전환·가격 인상은 30일 이내 동의 + 동의 취소 방법 고지 | 시행령 20조의2 (2025-02-14 시행) | 2-2 체험 종료 알림, 2-3 가격 인상 동의, 3 기록 |
| 계정 설정에서 해지로 바로 갈 수 있을 것 | Google Play 구독 정책 | 2-4 내 정보 › 구독 |
| 계약·청약철회·대금 기록 5년, 불만 3년 보관 | 전자상거래법 6조, 시행령 6조 | 3 보존·삭제 연쇄 |
| 만 19세 미만 결제 안내 | 민법 5조 | 2-1 문구 |
2. 화면 계약
문구는 검토본 4절을 글자 그대로 쓴다(자리표시자만 값으로 치환). 문구를 바꾸면 검토본과 이 계약을 같은 PR에서 고친다.
2-1. 구독 신청 화면 (view="subscribe", 모바일·데스크톱 공통)
- 필수 표시 항목과 순서: ① 플랜 이름·제공 기능 ② 가격(부가세 포함, "앱 마켓 결제") ③ 무료 체험 일수와 전환 조건(체험이 있을 때만) ④ 자동 갱신과 청구 시점(기간 종료 24시간 전) ⑤ 해지 방법과 해지 후 이용 기간 ⑥ 청약철회 제한과 앱 마켓 환불 ⑦ 만 19세 미만 안내 ⑧ 약관 제5조~제5조의3 링크·처리방침 링크.
- ①②④는 결제 버튼과 같은 화면, 스크롤 없이 보여야 한다(가격을 숨기고 버튼만 보이는 배치 금지 — 다크패턴 "숨은 갱신" 방지). 뷰포트 최소 높이는 뷰포트 계층의 가장 작은 단계 기준.
- 확인 체크박스
[ ] 위 내용을 확인했습니다.— 기본 해제, 체크 전에는[구독 시작]버튼 비활성(disabled+aria-disabled). "전체 동의" 같은 묶음 체크 없음(항목이 하나뿐). [구독 시작]을 누르면 컨테이너가 ① 3절의 신청 기록을 먼저 만들고(성공해야 다음으로) ② 앱 마켓 결제를 시작한다. 결제가 취소·실패하면 기록에outcome = cancelled | failed를 적는다(기록 삭제 금지).- 이미 유효한 구독이 있으면 이 화면 대신 2-4로 보낸다(같은 상품 중복 구독 방지, Apple 3.1.2(b)).
- 웹(app.barbelic.com)에서는 이 화면을 열지 않고 "iOS·Android 앱에서 구독할 수 있어요" 안내만 보인다. 앱 안에서 웹 결제로 유도하는 문구·링크 금지(Apple 3.1.1).
2-2. 무료 체험 종료 알림 — 무료 체험을 둘 때만 (전환 3일 전, 앱 안 1회)
- 앱을 열었을 때 상단 배너 또는 한 번 뜨는 안내로 검토본 4-2 문구를 보인다.
[구독 관리]는 2-4의 스토어 링크로 간다. - 시행령 20조의2의 "전환 전 30일 이내 동의"는 체험 일수가 30일 이하이면 체험 시작 시 2-1의 확인으로 충족한다. 체험이 30일을 넘는 상품은 만들지 않는다(전제).
- 스토어(Apple·Google)의 체험 종료 알림은 별도로 오지만 이 앱 안 알림을 대신하지 않는다.
2-3. 가격 인상 동의 화면 — 가격을 올릴 때만 (적용 30일 전부터)
- 검토본 4-3 문구 +
[새 가격에 동의]버튼. 누르면 3절에kind = price_change행을 남긴다. 누르지 않으면 아무것도 바꾸지 않는다(스토어가 현재 기간 종료 후 갱신을 멈춘다). - Apple·Google 자체의 가격 인상 동의 흐름을 쓰는 경우에도 앱 안에서 이 화면으로 30일 전 고지를 한다(국내 규정은 앱 마켓 알림만으로 충족된다고 확인되지 않음).
2-4. 내 정보 › 구독
- 현재 플랜·다음 갱신일·가격(또는 "무료").
[구독 관리·해지]→ iOShttps://apps.apple.com/account/subscriptions, Androidhttps://play.google.com/store/account/subscriptions(앱 안 브라우저가 아니라 시스템으로 연다). - 환불·청약철회 안내 문구와 support@ 링크, "탈퇴 전에는 구독을 먼저 해지" 문구.
- 계정 삭제 화면: 유효한 구독이 있으면 삭제 진행 전에 위 문구와
[구독 관리]를 한 번 더 보인다(삭제를 막지는 않는다).
3. 기록 — 별도 표 없음 (오너 지시 2026-09-15 "꼭 필요한 것만")
결제 연동이 어차피 남기는 구매 기록(스토어 거래 식별자·상품·시각·상태)에 두 열만 더한다: terms_version(확인한 약관 버전, 예: v1)·disclosure_confirmed_at(확인 체크 시각). 이것으로 "무엇을 보였고 언제 확인했는가"의 증거가 된다. 별도 표·별도 서버 문은 만들지 않는다. 보존은 그 구매 기록의 보존 기간(전자상거래법 5년)을 따른다.
4. user_consents에 넣지 않는 이유
user_consents는 가입 동의·재동의·공개 설정(서버 요구 목록에 있는 종류)만 담는다. 유료 신청을 넣으려면 요구 목록에 올려야 하고 요구 목록은 곧 가입 화면이라 유료 항목이 가입에 나타난다.
5. 검증 요구 (구현 이슈의 완료 조건)
- 화면 단위 테스트: 결제 버튼 위 필수 표시(제공 내용·가격·기간·자동 갱신·해지 방법·약관 링크)의 존재, 확인 체크 전 버튼 비활성, 웹에서는 화면 미노출.
- 구매 기록에
terms_version·disclosure_confirmed_at이 채워지는지 1건 확인(pgTAP 또는 단위). - 스토어 샌드박스 결제 e2e는 가능해지면 1건. 그 전까지는 미검증으로 적는다.
6. 바꾸지 않는 것
- 무료 기능 범위, 가입 동의 구조(#1625), 공개 동의 게이트.
- 유료 여부는 다른 회원에게 표시하지 않는다(처리방침 v1 제4항).