Skip to content

feat: 구독을 만료 없는 풀이권 충전으로 전환 - #35

Merged
hyesngy merged 2 commits into
developfrom
feat/consumable-solve-credits
Nov 6, 2026
Merged

hyesngy merged 2 commits into
developfrom
feat/consumable-solve-credits

Conversation

@hyesngy

@hyesngy hyesngy commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

관련 이슈

Closes #34

변경사항

기존 월간·연간 구독의 신규 구매 화면을 만료 없는 풀이권 충전으로 바꿉니다. 무료 하루 2회와 한국 시간 오전 6시 초기화는 유지하며, 무료분을 먼저 사용한 뒤 정답 생성 성공 시 충전 잔량을 1회 차감합니다. 같은 풀이의 해설은 추가 차감하지 않습니다.

  • 30회 990원 · 100회 2,900원 · 500회 13,900원 · 1,000회 26,900원 소모성 상품. 결제 화면은 StoreKit의 실제 가격을 사용합니다.
  • Apple 서명 및 최신 거래 검증, 계정 연결, 중복 적립 방지, 서버 적립 후 StoreKit 거래 완료, 미완료 구매 재시도를 구현했습니다.
  • Redis 영속 잔액과 원자적 예약·차감·환불·계정 삭제를 구현했습니다. Production/Sandbox 지갑을 분리하고 계정·잔액 버전으로 늦은 응답의 덮어쓰기를 차단합니다.
  • 기존 구매 구독의 유효 기간을 보장하며, 기존 로컬 기록 100개 열람과 과목 분류의 구독 제한을 해제합니다. 새로운 Pro 멤버십·유사 문제·플래시카드 생성은 포함하지 않습니다.
  • 서비스·개인정보 안내, API 계약, 상품 등록·출시 문서를 갱신했습니다.

변경·영향 범위

담당 주 영역: StoreKit·풀이권 잔액 및 차감 정책

  • 앱 기능 (Capture / AI / Storage / UI)
  • StoreKit·사용량 정책
  • API·프록시
  • 앱 설정·권한·릴리스
  • 테스트·CI·개발 도구
  • 규칙·문서 (AGENTS.md, docs/)
  • 기타:

PR 분류

  • 일반 변경
  • Critical Path 변경

과금·프록시 변경으로 머지 전 담당자 리뷰가 필요합니다.

사전 예측

  • 예상 소요·기대 효과: 앱과 서버를 함께 변경해 소액 첫 구매와 시험 준비용 대량 충전을 지원합니다.
  • 예상 병목·리스크: 소모성 거래 재전달, 동시 마지막 잔량 사용, 환불, 결제 환경 분리.
  • 담당 영역 밖 확인 사항: App Store Connect 상품 등록·가격·심사와 서버 알림 설정, 기존 구독의 신규 판매·갱신 처리.

실제 결과·트러블슈팅

  • 실제 소요·반영 결과: 앱·서버·문서 및 회귀 테스트를 함께 구현했습니다.
  • 실제 병목·해결 과정: 계정 전환 중 늦은 응답, 충전 전 잔액 응답의 역전, 테스트 결제의 운영 잔액 혼합, 차감 확정 뒤 Redis 조회 실패를 재현·검토하여 방어했습니다. 자동 리뷰에서 확인한 로그인 복구 전 미완료 구매 오류 안내도 수정했습니다.
  • 배운 점·후속 작업: docs/credits-rollout.md에 App Store 상품과 알림 URL 등록, 서버 선배포, Sandbox 실거래 확인 절차를 기록했습니다. 이 PR 자체는 운영 상품 등록·배포를 수행하지 않습니다.

검증 결과

  • macOS Debug 빌드 및 Release 빌드 성공 (CODE_SIGNING_ALLOWED=NO).
  • xcodebuild ... test: 111개 테스트 통과.
  • npm run check: 통과.
  • 실제 Redis 7.4.7을 사용한 npm test: 71개 통과, 건너뛴 테스트 없음. 중복 적립·무료 우선 차감·동시 예약·오전 6시 경계·만료 예약·환불·계정 삭제·환경 분리·차감 후 응답을 검증했습니다.
  • swift-format lint, git diff --check: 통과. CI에서도 실제 Redis 테스트를 실행하도록 설치 단계를 추가했습니다.
  • API Contract 앱·프록시 양쪽 반영: /purchases, /store/notifications, 일일 제공량/충전 잔량/버전/환경 필드와 헤더를 동기화했습니다.
  • 시크릿 포함 여부: 커밋 대상 검사 통과. Secrets·비공개 문서·기존 프로젝트 설정 수정·별도 원가 측정 작업은 포함하지 않았습니다.
  • App Store Sandbox 실결제 및 운영 결제: 새 상품 등록과 서버 알림 설정 후 확인해야 합니다. 로컬 StoreKit 설정을 통한 서버 검증 우회는 추가하지 않았습니다.

무료 하루 2회와 오전 6시 초기화를 유지하고 4종 충전 상품을 추가한다.
서버 구매 검증, 영속 잔액, 동시 차감, 환불 및 결제 환경 분리를 적용한다.
기존 구독 기간을 보장하고 기록 열람과 과목 분류의 구독 제한을 해제한다.
@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

AI 사전 코드 리뷰 (파일럿)

검토 SHA: c6d5f850191b · 방식: 증분
상태: 미해결 0 · 해결 1 · 오탐 0 · 위험 수용 0
AI 호출: 2/20

비로그인 상태(isSignedIn == false)에서 미완료 구매(unfinished transactions)를 조회하거나 전달 시도하지 않도록 guard 구문을 추가하고, unit test를 통해 해당 동작을 검증하도록 수정되었습니다.

ID 심각도 확신·구분 위치 문제 상태
AX-35a5a66bf9b2 medium high · confirmed Paxo/Store/StoreManager\.swift:147 비로그인 상태(isSignedIn == false)에서 retryPendingPurchases()가 실행되면 결제 에러 메시지가 사용자 UI에 노출됩니다. resolved

사람의 판정: /ai-review false-positive AX-... 이유(10자 이상), /ai-review accepted-risk AX-... 이유(10자 이상), /ai-review reopen AX-...
AI 결과는 승인이나 머지 조건을 대체하지 않습니다.

로그인 복구 중 StoreKit 미완료 거래를 조회하거나 적립 오류를 표시하지 않는다.
로그인 전 조회를 건너뛰는 회귀 테스트를 추가한다.
@hyesngy hyesngy self-assigned this Nov 6, 2026
@hyesngy
hyesngy merged commit 810016f into develop Nov 6, 2026
7 checks passed
@hyesngy
hyesngy deleted the feat/consumable-solve-credits branch November 6, 2026 04:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

충전 풀이권 도입과 무료 제공 정책 유지

1 participant