Skip to content

feat: 랜딩 요금제 섹션과 약관·개인정보처리방침·환불 정책 페이지 - #143

Merged
SwimmingRiver merged 14 commits into
developfrom
feat/landing-legal-pages
Oct 8, 2026
Merged

SwimmingRiver merged 14 commits into
developfrom
feat/landing-legal-pages

Conversation

@SwimmingRiver

Copy link
Copy Markdown
Owner

Summary

Paddle 운영 계정 도메인 심사(실결제 전환의 선행조건) 요건을 채운다 — 로그인 없이 가격·기능을 보고, 약관·개인정보처리방침·환불 정책을 사이트 내비게이션에서 열 수 있게 한다. 스펙 docs/superpowers/specs/2026-10-08-landing-legal-pages-design.md, 계획 docs/superpowers/plans/2026-10-08-landing-legal-pages.md.

  • 랜딩 요금제 섹션(#pricing): 무료(0원) / 프리미엄(월 4,900원, 부가세 포함, 카드 없는 7일 체험) 카드, 14일 환불·Paddle 결제 안내. BILLING_ENABLED와 무관하게 항상 노출하고 버튼은 /login으로만 보낸다(결제 진입점은 그대로 숨김). 헤더 "요금제" 앵커, 마감 알림 기능 카드, 부제 최신화
  • 법적 페이지 /terms·/privacy·/refund: RootGate·ProtectedRoute 밖 최상위 lazy 라우트(로그인 여부 무관). 본문은 데이터(features/legal/content), 페이지는 LegalPage 하나
    • 판매자 표기·연락처·시행일·보호책임자는 features/legal/config.ts의 LEGAL_CONFIG 토큰으로만 참조 — 지금은 빈 값이라 화면에 [판매자명 미정] 등이 보인다(심사 전 채움)
    • 약관에 Paddle = Merchant of Record 명시, 환불은 결제 후 14일 이내 전액
    • 개인정보처리방침 수집 항목·보유 기간은 코드 전수 검색 기준(Firestore 5개 컬렉션, Worker 3곳 저장소, FCM·Anthropic·Sentry 전송)
  • 링크 위치: 모든 푸터 + 모바일 드로어 하단(로그인한 모바일은 푸터 대신 하단 탭바라서). 좁은 푸터에서 구분자가 홀로 남지 않게 컨테이너 쿼리 사용
  • 번들: 약관 본문은 legalPage 청크에만 실린다(푸터 링크가 본문을 끌어와 공유 청크가 5.0KB→1.0KB gz로 줄도록 분리, 테스트로 고정). 랜딩·법적 청크에 Firestore·Paddle 없음
  • App 시작 유지보수 가드: 셸 밖 라우트(/terms)에 다녀오면 App이 재마운트돼 스윕이 다시 돌던 것을 uid별 모듈 가드로 교체(같은 탭 같은 계정 재로그인 시엔 새로고침 전까지 재실행 안 함)
  • PREMIUM_BENEFITS를 billing/config.ts 공유 상수로 옮겨 랜딩·/premium이 같은 목록 사용
  • 최종 리뷰(Important 1·Minor 7) 전부 반영: 알림 데이터 보유 기간을 실제 동작(다음 알림 처리 때 정리)대로, 약관→환불 실제 링크, 뒤로가기 시 스크롤 복원 유지 등

Test plan

  • VITE_FIREBASE_API_KEY= npx vitest run 945개 통과, tsc -b·lint(기존 경고 1건 외) 통과
  • 빌드 청크 확인: 랜딩·법적·공유 청크에 Firestore/Paddle 없음
  • 브라우저(로그아웃): 요금제 앵커·카드, /terms 직접 진입, 문서 맨 아래 → 다른 문서 링크 시 맨 위, 뒤로가기 시 원래 위치(1500px) 복원
  • 390/320px·다크 모드: 페이지 가로 스크롤 없음(표는 영역 내 스크롤), 푸터 구분자 고립 0건(260~800px)
  • 로그인 상태: 모바일 드로어 "이용약관" → 드로어 닫힘·이동, 데스크톱 앱 셸 푸터 링크 (유닛 테스트로만 확인)
  • 심사 전: LEGAL_CONFIG 채우기, 개인정보 처리방침 작성지침 대조, Sentry "Prevent Storing of IP Addresses" 확인, 본문 초안 검토

🤖 Generated with Claude Code

SwimmingRiver and others added 14 commits October 8, 2026 22:43
Paddle 도메인 심사 통과에 필요한 최소 범위(비로그인 가격 노출, 약관·개인정보·환불 페이지)를 정리한다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
모바일 드로어 링크를 스펙에 반영(로그인 모바일은 푸터가 없음).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
LEGAL_LINKS가 문서 본문에서 제목을 가져오느라 푸터를 쓰는 모든 화면(앱 셸·랜딩·게스트)의
공유 청크에 약관 전문(gzip 약 4KB)이 실렸다. 링크를 별도 모듈로 옮겨 본문은 legalPage
청크에만 남긴다. 라벨과 제목의 일치는 content 테스트가 계속 지킨다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
기기 토큰·알림 일정의 보유 기간이 빠져 있었고, 발송 기록은 7일 후 바로 삭제되는 게 아니라
다음 알림 처리 때 정리되므로(reminder-proxy alarmRunner) 문구를 실제 동작대로 고친다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 약관 7조에서 환불 정책으로 실제 링크를 건다(섹션 links 필드 추가)
- 뒤로가기·앞으로가기(POP)는 브라우저 스크롤 복원에 맡기고, 링크 이동일 때만 맨 위로 올린다
- 문서 제목·표 머리글·표 영역 이름도 판매자 표기 토큰을 치환한다
- 개인정보처리방침 의견 항목에 실제 저장하는 회원 식별자·작성 시각을 적는다

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
/terms 등 법적 페이지가 앱 셸(App) 밖 라우트라서 다녀오면 App이 재마운트되고, useRef 가드가
초기화돼 유지보수 스윕이 다시 실행됐다. 사용자별 모듈 수준 가드로 바꿔 페이지 수명 동안 1회만
실행한다. 같은 탭에서 같은 계정으로 재로그인하면 새로고침 전까지는 다시 돌지 않는다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
푸터 폭 270~490px에서 "|"가 윗줄 끝에 남던 것을 실측으로 확인했다. 화면 폭(480px 기준)으로는
481~490px이 남으므로, 푸터 폭 기준 컨테이너 쿼리로 500px 이하에서 구분자를 숨기고 법적 링크를
다음 줄 가운데로 내린다. 수정 후 260~800px 전 구간에서 홀로 남는 구분자 0건.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@SwimmingRiver
SwimmingRiver merged commit 78723ed into develop Oct 8, 2026
11 checks passed
@SwimmingRiver
SwimmingRiver deleted the feat/landing-legal-pages branch October 8, 2026 15:01
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