royal-3

by박한호

구독형 쇼핑몰의 정기결제 기능을 만들고 싶어. - 회원이 상품을 매월 정기결제로 구독할 수 있다 - 결제일에 카드 결제가 실패하면 하루 간격으로 3회 재시도하고, 모두 실패하면 구독을 일시정지하고 알림을 보낸다 - 회원은 마이페이지에서 결제 내역과 재시도 이력을 볼 수 있다 - 해지할 때는 해지 사유를 받고, 할인 쿠폰을 한 번 제안한다 - 관리자는 실패한 결제 목록을 보고 수동으로 다시 결제할 수 있다 웹 서비스이고, 화면 · 기능 · 정책을 먼저 정리한 다음 개발해 줘.\

Landing
Landing

Comments (0)

No comments yet. Be the first!

System Requirements

System Requirements Document for royal-3

1. Introduction

royal-3은 회원이 상품을 매월 카드 정기결제로 구독하고, 결제 실패 시 정해진 재시도 정책이 작동하며, 회원과 관리자가 각자의 위치에서 결제 상태를 확인·처리하는\x20\xec\x9b\xb9 서비스다. 이 문서는 사용자가 요청한 화면·기능·정책 정리 문서로서, 개발에 앞서 화면 구성, 기능 요구사항, 결제·재시도·해지 정책을\x20\xeb\xa8\xbc저 확정하기 위해 작성되었다.

\xed\x95\xb5심 의도는 다음과 같다.

  • 회원은 상품을\x20\xea\xb3\xa8라 매월 정기결제 구독을 시작하고, 자신의 구독 상태와 결제 내역·재시도 이력을 마이페이지에서 확인한다.
  • 결제일 카드 결제가 실패하면 하루 간격으로 3회 재시도하고, 3회 모두 실패하면 구독을 일시정지하고 회원에게 \xec\x95\x8c림을 보\xeb\x82\xb8다.
  • 회원이 해지하면 해지 사유를 받고, 할인\x20\xec\xbf\xa0\xed\x8f\xb0을 한 번 제안한다.
  • 관리자는 실패한 결제 목록을 보고 수동으로 다시 결제할 수 있다.

대상 사용자는 정기결제로 상품을 구매하려는 회원과, 실패한 결제를 처리해야 하는 관리자 두 역할이다.

성공 기준 (화면·기능·정책 정리 관점)

  • 위 5개\x20\xed\x95\xb5심 요구(월 정기결제, 3회 재시도·일시정지·\xec\x95\x8c림, 마이페이지 이력, 해지 사유·1회\x20\xec\xbf\xa0\xed\x8f\xb0 제안, 관리자 실패 결제 수동 재결제)가 각각 화면과 기능, 정책으로 빠\xec\xa7\x90없이 대응된다.
  • 재시도 간격(1일)·\xed\x9a\x9f수(3회)·일시정지·\xec\x95\x8c림 조건이 정책으로 명문화되어 개발 시 해석 여지가 없다.
  • 회원 화면과 관리자 화면의 접근 범위가 분리되어, 회원은 자신의 결제 이력만, 관리자는 실패 결제 처리 화면만 사용한다.
Page 1 of 18

2. System Overview

royal-3은 React 프론트\xec\x97\x94드, 공유 FastAPI 백\xec\x97\x94드, MariaDB로 구성된\x20\xec\x9b\xb9 서비스다. 백\xec\x97\x94드는 회원 인증, 상품·구독 관리, 정기결제 실행, 재시도 스케\xec\xa4\x84링, 실패 결제 조회, 관리자 수동 재결제, 해지 처리 API를 하나의 프로세스 안의 도메인 모\xeb\x93\x88로 제공한다. MariaDB는 구독 상태, 결제 시도 이력, 재시도 일정, 해지 사유,\x20\xec\xbf\xa0\xed\x8f\xb0 제안 이력, 알림 발송 기록을 영속 저장한다.

현재 제공 행위자

  • 회원: 가입·로그인 후 상품을 선택해 매월 정기결제 구독을 시작하고, 구독 상태를 확인하며, 마이페이지에서 결제 내역과 재시도 이력을 조회하고, 해지 시 사유를 입력하고 할인\x20\xec\xbf\xa0\xed\x8f\xb0 제안을 한 번 받는다.
  • 관리자: 초대 또는 사전 권한 설정으로 계정이 준비된 뒤 로그인하여, 실패한 결제 목록을 조회하고 선택한 결제를 수동으로 다시 결제한다.
  • 시스템(비인간 행위자): 결제일과 재시도 일정을 저장하고, 결제 실패 시 하루 간격 재시도를 실행하며, 3회 실패 후 구독을 일시정지하고 알림을 발송한다.

제외 범위(\xec\xa2\x81게 유지)

  • 상품 카탈로그의 관리자용 등록·편집 화면, 재고·배송 관리, 통계 대시보드는 요구되지 않았다.
  • 회원의 자발적 구독 재개(일시정지 해제) 화면은 요구되지 않았다. 일시정지된 구독의 정상화는 관리자 수동 재결제 성공으로 처리된다.
  • 다중 결제수단 관리, 카드 정보 변경 화면은 요구되지 않았다.

Removed from scope

  • (해당 없음 — 사용자가 명시적으로 제거한 개념은 없다.)
Page 2 of 18

2a. Product Interpretation and Delivery Boundary

royal-3은 브라우저에서 사용하는\x20\xec\x9b\xb9 서비스이며, 모든 화면은 자사(application) 소유다. 회원과 관리자는 같은 서비스에 로그인하지만 서로 다른 화면과 데이터 범위를 사용한다.

  • 접근 경계: Landing, Login, Sign Up은 로그인 없이 접근 가능하다. Products, Subscription, 마이페이지, Subscription Cancellation은 로그인한 회원 전용이며, Failed Payments, Payment Retry는 로그인한 관리자 전용이다. 관리자 계정은 스스로 가입하는 것이 아니라 초대 또는 사전 권한 설정으로 준비된다.
  • 결제 실행 경계: 정기결제와 재시도는 사람이 화면을 열지 않아도 백\xec\x97\x94드에서 스케\xec\xa4\x84에 따라 실행되는 백그라운드 자동화다. 회원은 그 결과(성공/실패/재시도/일시정지)를 화면에서 관찰하고, 관리자는 실패 건에 한해 수동 재결제를 개시한다.
  • 현재/미래 경계: 본 문서의 모든 요구는 현재 범위다. 별도로 승인된 미래 요구는 없다.

2c. Page Content and Component Coverage

Landing

  • 정보/상태: 서비스가 매월 정기결제 구독\x20\xec\x87\xbc\xed\x95\x91\xeb\xaa\xb0임을 알리는 공개 진입 화면. 로그인 여부에 따라 "구독 시작" 또는 "로그인" 유도를 노출.
  • 주요 행동: 구독 시작(비로그인 시 Sign Up/Login으로 유도), 로그인 이동.
  • 보조 행동: 상품\x20\xeb\x91\x98러보기 안내.
  • 도메인\x20\xec\x97\x94티티: 없음(정적 소개).
  • \xec\xbb\xb4포\xeb\x84\x8c트 책임:\x20\xed\x9e\x88어로\x20\xed\x83\x80\xec\x9d\xb4포 블록, 구독 CTA 바, 재시도 정책을 알리는 마\xed\x80\xb4/포스터 패널.
  • 상태: 로\xeb\x94\xa9 없음(정적). 성공/오류 상태 없음.\x20\xeb\xa7\x81크 오류 시 Login/Sign Up으로 재시도 안내.
Page 3 of 18

Login

  • 정보/상태: 이메일·비밀번호 입력\x20\xed\x8f\xbc. 인증 실패 메시지 표시.
  • 주요 행동: 로그인 제출 → 역할(회원/관리자)에 따라 이동(회원: Products 또는 마이페이지, 관리자: Failed Payments).
  • 보조 행동: Sign Up 이동\x20\xeb\xa7\x81크.
  • 도메인\x20\xec\x97\x94티티: 계정(역할 포함).
  • \xec\xbb\xb4포\xeb\x84\x8c트 책임: 자격 증명\x20\xed\x8f\xbc, 오류 배너, 역할 기반 리다이\xeb\xa0\x89트.
  • 상태: 로\xeb\x94\xa9(제출 중 비활성), 오류(자격 증명 불일치), 성공(리다이\xeb\xa0\x89트). 오류 시 재입력 가능.

Sign Up

  • 정보/상태: 회원 자가 가입\x20\xed\x8f\xbc(이메일·비밀번호 등 자격 증명). 관리자 가입 경로는 없음.
  • 주요 행동: 가입 제출 → 계정 생성 후 로그인 상태로 Products로 이동.
  • 보조 행동: Login 이동\x20\xeb\xa7\x81크.
  • 도메인\x20\xec\x97\x94티티: 회원 계정.
  • \xec\xbb\xb4포\xeb\x84\x8c트 책임: 가입\x20\xed\x8f\xbc, 유효성 검사, 중복 이메일 오류 표시.
  • 상태: 로\xeb\x94\xa9, 오류(중복/형식), 성공(로그인 후 이동). 오류 시 수정 후 재제출.

Products

  • 정보/상태: 구독 가능한 상품 목록과 월 정기결제 금액. 로그인 회원 전용.
  • 주요 행동: 상품 선택 → 매월 정기결제 구독 시작(결제일·금액 확인 후 확정).
  • 보조 행동: Subscription으로 이동해 상태 확인.
  • 도메인\x20\xec\x97\x94티티: 상품, 구독, 결제 일정.
  • \xec\xbb\xb4포\xeb\x84\x8c트 책임: 상품 목록, 구독 시작 확인, 결제일·금액 표시.
  • 상태: 로\xeb\x94\xa9(목록 조회),\x20\xeb\xb9\x88 상태(구독 가능 상품 없음), 성공(구독 생성 → Subscription 이동), 오류(구독 생성 실패 시 재시도 안내).
Page 4 of 18

Subscription

  • 정보/상태: 회원의 현재 구독 상태(활성/일시정지), 다음 결제일, 대상 상품, 월 금액. 로그인 회원 전용.
  • 주요 행동: 구독 상태 확인, Subscription Cancellation으로 이동.
  • 보조 행동: 마이페이지로 이동해 결제 이력 확인.
  • 도메인\x20\xec\x97\x94티티: 구독, 결제 일정.
  • \xec\xbb\xb4포\xeb\x84\x8c트 책임: 상태 배지(일시정지는 노랑 계열로 표시), 다음 결제일, 해지 진입 버\xed\x8a\xbc.
  • 상태: 로\xeb\x94\xa9,\x20\xeb\xb9\x88 상태(활성 구독 없음 → Products 유도), 성공(상태 표시), 오류(조회 실패 시 재시도).

마이페이지

  • 정보/상태: 회원의 결제 내역 목록과 각 결제의 재시도 이력(시도 시각·결과·\xed\x9a\x9f수). 로그인 회원 전용.
  • 주요 행동: 결제 내역 조회, 특정 결제의 재시도 이력\x20\xed\x8e\xbc쳐보기.
  • 보조 행동: Subscription으로 이동.
  • 도메인\x20\xec\x97\x94티티: 결제 시도, 재시도 이력, 구독.
  • \xec\xbb\xb4포\xeb\x84\x8c트 책임: 결제 내역 표(규칙선·표 형식 숫자), 재시도 이력 상세, 상태 표기.
  • 상태: 로\xeb\x94\xa9,\x20\xeb\xb9\x88 상태(결제 내역 없음), 성공(목록 표시), 오류(조회 실패 시 재시도).
Page 5 of 18

Subscription Cancellation

  • 정보/상태: 해지 확인 화면. 해지 사유 입력 필드와, 해지 시 한 번 노출되는 할인\x20\xec\xbf\xa0\xed\x8f\xb0 제안 블록.
  • 주요 행동: 해지 사유 입력 → 해지 확정.\x20\xec\xbf\xa0\xed\x8f\xb0 제안 수락 또는 거절.
  • 보조 행동: 해지 취소(Subscription으로 복\xea\xb7\x80).
  • 도메인\x20\xec\x97\x94티티: 해지 요청(사유),\x20\xec\xbf\xa0\xed\x8f\xb0 제안 이력.
  • \xec\xbb\xb4포\xeb\x84\x8c트 책임: 사유 입력,\x20\xec\xbf\xa0\xed\x8f\xb0 제안 블록(1회 노출), 확정/취소\x20\xec\xbb\xa8트\xeb\xa1\xa4.
  • 상태: 로\xeb\x94\xa9(제출 중), 오류(사유 미입력·제출 실패 시 안내), 성공(해지 완료 → Subscription에 해지 상태 반영).\x20\xec\xbf\xa0\xed\x8f\xb0 제안은 이미 노출된 경우 재노출하지 않음.

Failed Payments

  • 정보/상태: 실패한 결제 목록(회원, 상품, 실패 시각, 재시도\x20\xed\x9a\x9f수, 구독 상태). 로그인 관리자 전용.
  • 주요 행동: 실패 결제 선택 → Payment Retry로 이동.
  • 보조 행동: 목록 새로고침.
  • 도메인\x20\xec\x97\x94티티: 실패 결제, 재시도 이력, 구독.
  • \xec\xbb\xb4포\xeb\x84\x8c트 책임: 실패 결제 표, 상태 표기(실패·일시정지), 선택\x20\xec\xbb\xa8트\xeb\xa1\xa4.
  • 상태: 로\xeb\x94\xa9,\x20\xeb\xb9\x88 상태(실패 결제 없음), 성공(목록 표시), 오류(조회 실패 시 재시도).
Page 6 of 18

Payment Retry

  • 정보/상태: 선택한 실패 결제의 상세(회원, 금액, 실패·재시도 이력)와 수동 재결제 실행\x20\xec\xbb\xa8트\xeb\xa1\xa4. 로그인 관리자 전용.
  • 주요 행동: 수동 재결제 실행 → 결과(성공/실패) 표시.
  • 보조 행동: Failed Payments로 복\xea\xb7\x80.
  • 도메인\x20\xec\x97\x94티티: 결제 시도, 구독 상태.
  • \xec\xbb\xb4포\xeb\x84\x8c트 책임: 결제 상세, 재결제 버\xed\x8a\xbc, 결과 배너, 구독 상태\x20\xea\xb0\xb1신 표시.
  • 상태: 로\xeb\x94\xa9(실행 중), 성공(결제 성공·구독 정상화 반영), 오류(재결제 실패 → 실패 사유 표시, 목록 복\xea\xb7\x80 가능).
Page 7 of 18

3. Functional Requirements

FR-1. 월 정기결제 구독 — explicit As a 회원, I should 상품을 선택해 매월 정기결제로 구독을 시작할 수 있어야 한다.

  • 트리거/입력: 로그인 후 Products에서 상품 선택 및 구독 확정.
  • 관찰 결과: 구독이 생성되고 결제일·월 금액이 정해지며 Subscription에 활성 상태로 표시된다.
  • 접근 상태: 로그인 회원 전용.
  • 실패/복구: 구독 생성 실패 시 오류 안내 후 재시도. 계속: Subscription에서 상태 확인.
  • 소유: Products, Subscription.

FR-2. 결제 실패 시 3회 재시도(1일 간격) — explicit As a 시스템, I should 결제일 카드 결제가 실패하면 하루 간격으로 최대 3회 재시도해야 한다.

  • 트리거/입력: 결제일 카드 결제 실패.
  • 관찰 결과: 1일 간격으로 재시도가 실행되고 각 시도 결과가 이력으로 저장된다.
  • 실패/복구: 각 재시도 실패는 다음 재시도로 이어지며, 3회 소진 시 FR-3으로 전환.
  • 소유: 시스템(백\xec\x97\x94드 스케\xec\xa4\x84러). 회원은 마이페이지에서 이력을 관찰.

FR-3. 3회 실패 후 일시정지 및 알림 — explicit As a 시스템, I should 3회 재시도가 모두 실패하면 구독을 일시정지하고 회원에게 알림을 보내야 한다.

  • 트리거/입력: 3번째 재시도 실패.
  • 관찰 결과: 구독 상태가 일시정지로 바\xeb\x80\x8c고, 알림이 발송되며 발송 기록이 남는다.
  • 실패/복구: 알림 발송 실패 시 기록하고 재발송을 시도할 수 있다. 계속: 회원은 Subscription·마이페이지에서 일시정지 상태를 확인.
  • 소유: 시스템(상태 전환·\xec\x95\x8c림), 회원(관찰).
Page 8 of 18

FR-4. 마이페이지 결제 내역·재시도 이력 조회 — explicit As a 회원, I should 마이페이지에서 결제 내역과 재시도 이력을 볼 수 있어야 한다.

  • 트리거/입력: 마이페이지 진입.
  • 관찰 결과: 결제 내역 목록과 각 결제의 재시도 시각·결과·\xed\x9a\x9f수가 표시된다.
  • 접근 상태: 로그인 회원 전용, 본인 데이터만.
  • 실패/복구: 조회 실패 시 재시도.\x20\xeb\xb9\x88 상태 안내.
  • 소유: 마이페이지.

FR-5. 해지 시 해지 사유 입력 — explicit As a 회원, I should 구독을 해지할 때 해지 사유를 입력해야 한다.

  • 트리거/입력: Subscription Cancellation에서 사유 입력 후 해지 확정.
  • 관찰 결과: 해지 요청과 사유가 저장되고 구독이 해지 처리된다.
  • 실패/복구: 사유 미입력·제출 실패 시 안내 후 재입력.
  • 소유: Subscription Cancellation.

FR-6. 해지 시 할인\x20\xec\xbf\xa0\xed\x8f\xb0 1회 제안 — explicit As a 회원, I should 해지 시 할인\x20\xec\xbf\xa0\xed\x8f\xb0 제안을 한 번 받아야 한다.

  • 트리거/입력: 해지\x20\xed\x9d\x90름 진입.
  • 관찰 결과:\x20\xec\xbf\xa0\xed\x8f\xb0 제안 블록이 1회 노출되고, 수락/거절 결과와 노출 이력이 저장된다.
  • 제약: 제안은 한 번만 제공된다(재노출 금지).
  • 소유: Subscription Cancellation.

FR-7. 관리자 실패 결제 목록 조회 — explicit As a 관리자, I should 실패한 결제 목록을 볼 수 있어야 한다.

  • 트리거/입력: Failed Payments 진입.
  • 관찰 결과: 실패 결제 목록(회원·상품·실패 시각·재시도\x20\xed\x9a\x9f수·구독 상태)이 표시된다.
  • 접근 상태: 로그인 관리자 전용.
  • 실패/복구: 조회 실패 시 재시도.\x20\xeb\xb9\x88 상태 안내.
  • 소유: Failed Payments.
Page 9 of 18

FR-8. 관리자 수동 재결제 — explicit As a 관리자, I should 선택한 실패 결제를 수동으로 다시 결제할 수 있어야 한다.

  • 트리거/입력: Payment Retry에서 재결제 실행.
  • 관찰 결과: 결제 시도가 실행되고 결과(성공/실패)가 표시되며, 성공 시 구독 상태가 정상으로\x20\xea\xb0\xb1신된다.
  • 실패/복구: 재결제 실패 시 사유 표시 후 목록 복\xea\xb7\x80·재시도 가능.
  • 소유: Payment Retry.

FR-9. 회원 가입·로그인 후 구독 시작 — required_inference As a 회원, I should 가입 후 로그인하여 구독을 시작할 수 있어야 한다.

  • 트리거/입력: Sign Up 제출 → Login.
  • 관찰 결과: 계정 생성·로그인 후 Products 접근 가능.
  • 실패/복구: 중복 이메일·자격 증명 오류 안내.
  • 소유: Sign Up, Login.

FR-10. 관리자 초대/사전 권한 후 로그인 — required_inference As a 관리자, I should 초대 또는 사전 권한 설정된 계정으로 로그인할 수 있어야 한다.

  • 트리거/입력: Login 제출.
  • 관찰 결과: 관리자 역할로 인증되어 Failed Payments 접근.
  • 실패/복구: 자격 증명 오류 안내.
  • 소유: Login.

FR-11. 결제일·재시도 일정 저장 — required_inference As a 시스템, I should 결제일과 재시도 일정을 저장해야 한다.

  • 관찰 결과: 구독별 결제일과 재시도 예정 시각이 영속 저장된다.
  • 소유: 시스템(백\xec\x97\x94드·DB).

FR-12. 3회 실패 후 구독 상태·\xec\x95\x8c림\x20\xea\xb0\xb1신 — required_inference As a 시스템, I should 세 번의 재시도 실패 후 구독 상태와 알림을\x20\xea\xb0\xb1신해야 한다.

  • 관찰 결과: 구독 상태=일시정지, 알림 발송 기록 저장.
  • 소유: 시스템(백\xec\x97\x94드).
Page 10 of 18

4. User Personas

회원

  • 제품\x20\xeb\xa7\xa5락: 정기결제로 상품을 매월 받고자 하는\x20\xec\x87\xbc\xed\x95\x91\xeb\xaa\xb0 이용자. 스스로 가입·로그인해 구독을 시작한다.
  • 주요 목표: 원하는 상품을 매월 정기결제로 구독하고, 결제가 어떻게 처리\xeb\x90\x90는지 투명하게 확인하며, 필요 시 해지한다.
  • 고유 책임: 상품 선택과 구독 확정(FR-1), 마이페이지에서 결제 내역·재시도 이력 확인(FR-4), 해지 시 사유 입력(FR-5)과\x20\xec\xbf\xa0\xed\x8f\xb0 제안 수령(FR-6).
  • 입력/결정: 구독할 상품, 해지 여부와 사유,\x20\xec\xbf\xa0\xed\x8f\xb0 제안 수락/거절.
  • 다른 행위자와의 상호작용: 시스템이 실패 시 재시도·일시정지·\xec\x95\x8c림을 수행하며, 회원은 그 결과를 관찰한다. 관리자는 회원의 실패 결제를 수동 재결제할 수 있다.
  • 관찰 가능한 성공: Subscription에 구독 상태가 정확히 표시되고, 마이페이지에서 결제·재시도 이력이 보이며, 해지 시 사유와\x20\xec\xbf\xa0\xed\x8f\xb0 제안이 1회 처리된다.

관리자

  • 제품\x20\xeb\xa7\xa5락: 회원의 결제 실패를 운영적으로 처리하는 운영 담당자. 초대 또는 사전 권한 설정으로 계정이 준비된다.
  • 주요 목표: 실패한 결제를 파악하고 수동 재결제로 구독 상태를 정상으로 되\xeb\x8f\x8c린다.
  • 고유 책임: 실패 결제 목록 조회(FR-7), 선택 결제 수동 재결제(FR-8).
  • 입력/결정: 어떤 실패 결제를 재결제할지 선택, 재결제 실행.
  • 다른 행위자와의 상호작용: 회원의 실패 결제를 대상으로 작업하며, 성공 시 해당 회원의 구독 상태가 정상화된다.
  • 관찰 가능한 성공: 재결제 결과가 표시되고 구독 상태가\x20\xea\xb0\xb1신된다.

5. Core User Flows

Page 11 of 18

Flow A — 회원: 가입·로그인 후 월 정기결제 구독 시작

  1. 방문자가 Landing에서 "구독 시작"을 선택한다. (Landing)
  2. Sign Up에서 자격 증명을 입력해 가입한다. (Sign Up) → 계정 생성, 로그인 상태.
  3. Products에서 상품과 월 금액, 결제일을 확인하고 구독을 확정한다. (Products)
  4. 시스템이 구독과 결제일·재시도 일정을 저장한다. (FR-11)
  5. 회원은 Subscription에서 활성 상태와 다음 결제일을 확인한다. (Subscription)
  6. 실패 시: 구독 생성 오류 안내 후 재시도. 계속: Subscription에서 상태 확인.

Flow B — 시스템/회원: 결제 실패 → 3회 재시도 → 일시정지·\xec\x95\x8c림

  1. 결제일에 카드 결제가 실패한다. (시스템)
  2. 시스템이 하루 간격으로 최대 3회 재시도하고 각 결과를 저장한다. (FR-2)
  3. 3회 모두 실패하면 시스템이 구독을 일시정지하고 알림을 발송·기록한다. (FR-3, FR-12)
  4. 회원은 알림을 받고 Subscription에서 일시정지 상태를, 마이페이지에서 재시도 이력을 확인한다. (Subscription, 마이페이지)
  5. 복구: 관리자가 수동 재결제(Flow E)로 정상화할 수 있다.

Flow C — 회원: 마이페이지에서 결제 내역·재시도 이력 조회

  1. 회원이 마이페이지에 진입한다. (마이페이지)
  2. 결제 내역 목록과 각 결제의 재시도 시각·결과·\xed\x9a\x9f수를 확인한다. (FR-4)
  3. 특정 결제의 재시도 이력을\x20\xed\x8e\xbc쳐 본다.
  4. 실패 시: 조회 오류 안내 후 재시도.\x20\xeb\xb9\x88 상태: 내역 없음 안내.
Page 12 of 18

Flow D — 회원: 해지(사유 입력 +\x20\xec\xbf\xa0\xed\x8f\xb0 1회 제안)

  1. 회원이 Subscription에서 해지 진입을 선택한다. (Subscription → Subscription Cancellation)
  2. 해지 사유를 입력한다. (FR-5)
  3. 할인\x20\xec\xbf\xa0\xed\x8f\xb0 제안 블록이 한 번 노출된다. 회원이 수락 또는 거절한다. (FR-6)
  4. 해지를 확정한다. → 해지 요청·사유·\xec\xbf\xa0\xed\x8f\xb0 결과 저장, 구독 해지 처리.
  5. Subscription에서 해지 상태를 확인한다.
  6. 실패 시: 사유 미입력·제출 오류 안내 후 재입력. 이미\x20\xec\xbf\xa0\xed\x8f\xb0이 노출된 경우 재노출하지 않는다.

Flow E — 관리자: 실패 결제 목록 조회 및 수동 재결제

  1. 관리자가 Login으로 로그인한다. (Login) → Failed Payments로 이동.
  2. 실패 결제 목록에서 대상 결제를 선택한다. (Failed Payments, FR-7)
  3. Payment Retry에서 상세와 이력을 확인하고 수동 재결제를 실행한다. (Payment Retry, FR-8)
  4. 결과(성공/실패)가 표시되고, 성공 시 구독 상태가 정상으로\x20\xea\xb0\xb1신된다.
  5. 실패 시: 사유 표시 후 목록 복\xea\xb7\x80·재시도.\x20\xeb\xb9\x88 상태: 실패 결제 없음 안내.
Page 13 of 18

6. Visuals Colors and Theme

Muse & headline: Paula Scher — "Typography as architecture." 숫자와 규칙을 포스터처럼 외치는 정기결제\x20\xec\x87\xbc\xed\x95\x91\xeb\xaa\xb0.

색상 토\xed\x81\xb0 (라이트 모드)

역할값
배경(종이)#F4F1E8
표면#FFFFFF
\x20\xed\x85\x8d스트#111111
프라이머리(결제·재시도 신호)#E0311F
\x20\xec\x95\xa1센트(\xec\xbf\xa0\xed\x8f\xb0·일시정지)#F2B705
\x20\xeb\xae\xa4트#6B6B66
  • 결제·재시도 상태\x20\xed\x85\x8d스트는\x20\xeb\xae\xa4트 그레이로 두지 않고 #E0311F 또는 #111111로 강하게 표기한다.
  • 일시정지·\xec\xbf\xa0\xed\x8f\xb0은 #F2B705로만 표시한다.

타이포그래피

  • 제목: Anton, 전부 대문자, 자간 -0.02em, 조밀하게\x20\xec\x8c\x93은 블록.
  • 본문: Archivo 400/600.
  • 스케일(1.5 모\xeb\x93\x88러): 데스크\xed\x86\xb1 128/64/28/18/14, 모바일 48/32/22/16/14. clamp()로\x20\xeb\xb7\xb0포트에 맞\xec\xb6\xb0 축소.

형태 언어: 하드\x20\xec\x97\xa3지, 라운드 없음. 대각선\x20\xec\xbb\xac러\x20\xeb\xb0\xb4드, 3px 두\xea\xba\xbc운 규칙선, 프레임에\x20\xeb\x8b\xbf는\x20\xed\x92\x80블리드 타입 블록.

Page 14 of 18

레이아\xec\x9b\x83: 데스크\xed\x86\xb1 2\xec\xbb\xac럼, 모바일 1\xec\xbb\xac럼 포스터 그리드. 각\x20\xec\x84\xb9션은\x20\xec\xbb\xac러 블록 위 스택\x20\xed\x97\xa4드라인. 데이터 행은 규칙선 위에 표 형식 숫자로 배치.

이미지:\x20\xed\x83\x80\xec\x9d\xb4포그래피가\x20\xea\xb3\xa7 이미지. 최대 한 장의 고대비 카드\x20\xec\xbb\xb7아\xec\x9b\x83. 재시도 단계는 번호가\x20\xeb\xb6\x99은 포스터 패널로 그린다.

금지: 라운드 카드·부드러운 그림자·그라디언트 블\xeb\xa1\xad, 파란\x20\xec\x95\xa1센트·화이트 우선\x20\xeb\x89\xb4트\xeb\x9f\xb4, 중앙정렬 SaaS\x20\xed\x9e\x88어로, 결제 상태의\x20\xed\x9d\x90린 그레이. 인디고/블루-온-화이트\x20\xed\x85\x9c플\xeb\xa6\xbf 금지.

7. Signature Design Concept

Landing의 첫 화면은 \xed\x92\x80블리드 종이색(#F4F1E8) 바\xed\x83\x95 위에 '매월'을 Anton 128px(데스크\xed\x86\xb1)/48px(모바일)로\x20\xec\x8c\x93고, 그 아래\x20\xeb\xb9\xa8간 블록(#E0311F)을\x20\xea\xb9\x94아 프레임을 가로지르는 검정 규칙선으로 자른다. 구독 CTA는 중앙정렬이 아니라 타입 아래 **노란 바(#F2B705)**에\x20\xec\xa2\x8c측 정렬로\x20\xeb\x86\x93는다. 스크\xeb\xa1\xa4하면\x20\xeb\xb9\xa8간 대각선\x20\xeb\xb0\xb4드가 3회 재시도 단계를 번호\x20\xeb\xb6\x99은 포스터 패널로 실어 나르고, 재시도 정책 문구가 타입 마\xed\x80\xb4로\x20\xed\x9d\x90른다. 모든 읽기\x20\xed\x85\x8d스트와\x20\xec\xbb\xa8트\xeb\xa1\xa4은\x20\xeb\xb7\xb0포트·\xec\xbb\xa8테이너 안에 온전히 유지되며, 크\xeb\xa1\xad·블리드·\xea\xb2\xb9침은 장식과 이미지에만 적용한다.

Page 15 of 18

8. Interaction Model & Motion Direction

Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: flat

Landing Hero Motion Brief

  • 초점 대상: '매월' 스택 타입과\x20\xeb\xb9\xa8간 블록, 노란 CTA 바.
  • 입력→변환→결과 명제: 스크\xeb\xa1\xa4/진입 → 단어 단위 스태거 리\xeb\xb9\x8c과\x20\xec\xbb\xac러 블록\x20\xec\x99\x80\xec\x9d\xb4프 → 재시도 정책(3회·1일 간격)이 포스터 패널과 마\xed\x80\xb4로 드러난다. (\xed\x97\x88용된 정책 문구만 사용)
  • 모션 어\xed\x9c\x98: 스태거 단어 리\xeb\xb9\x8c,\x20\xec\xbb\xac러 블록\x20\xec\x99\x80\xec\x9d\xb4프, 타입 마\xed\x80\xb4. 바운스·플로트 없음.
  • \xec\xb2\xab 프레임: 종이 바\xed\x83\x95, '매월' 대형 타입, 하단\x20\xeb\xb9\xa8간 블록과 노란 CTA 바, 프레임을 가르는 검정 규칙선.
  • 축소 모션 상태: prefers-reduced-motion 시 마\xed\x80\xb4·와이프를 정적 배치로 전환, 재시도 단계는 줄바\xea\xbf\x88된 정적 패널로 온전히 표시.
Page 16 of 18

9. Non-Functional Requirements

  • \xec\x9b\xb9 서비스: 브라우저 기반\x20\xec\x9b\xb9으로 제공한다. (explicit)
  • 정책 우선 정리: 화면·기능·정책을\x20\xeb\xa8\xbc저 확정한 뒤 개발한다. (explicit)
  • 재시도 정책 정확성: 재시도 간격 1일,\x20\xed\x9a\x9f수 3회, 3회 실패 시 일시정지·\xec\x95\x8c림을 시스템이 보장한다. (explicit)
  • \xec\xbf\xa0\xed\x8f\xb0 1회성: 할인\x20\xec\xbf\xa0\xed\x8f\xb0 제안은 해지 시 한 번만 노출·기록된다. (explicit)
  • 접근 분리: 회원 화면은 본인 데이터만, 관리자 화면은 관리자 역할만 접근한다. (required_inference, 역할 분리 근거)
  • 영속성: 구독·결제 시도·재시도 일정·해지 사유·\xec\xbf\xa0\xed\x8f\xb0 이력·\xec\x95\x8c림 기록을 MariaDB에 영속 저장한다. (required_inference)
  • 가독성/반응형: 375/768/1280px에서 읽기\x20\xed\x85\x8d스트·\xec\xbb\xa8트\xeb\xa1\xa4이\x20\xeb\xb7\xb0포트·\xec\xbb\xa8테이너 안에 온전히 유지된다. (explicit design constraint)

10. Tech Stack

  • Frontend: React (SPA).
  • Backend: Python / FastAPI — 공유 단일 프로세스에 인증, 상품·구독, 정기결제·재시도 스케\xec\xa4\x84러, 실패 결제·수동 재결제, 해지·\xec\xbf\xa0\xed\x8f\xb0, 알림 모\xeb\x93\x88을\x20\xeb\x91\x94\xeb\x8b\xa4.
  • Database: MariaDB — 구독, 결제 시도, 재시도 일정, 해지 사유,\x20\xec\xbf\xa0\xed\x8f\xb0 제안 이력, 알림 기록.
  • Infra: docker-compose (backend, database, frontend). 재시도 스케\xec\xa4\x84링은 백\xec\x97\x94드 내 스케\xec\xa4\x84러로 처리하며 별도\x20\xec\x9b\x8c\xec\xbb\xa4는 현재 범위에서 요구되지 않는다.
Page 17 of 18

11. Assumptions and Constraints

  • 가정: 관리자 계정은 초대 또는 사전 권한 설정으로 준비된다(자가 가입 없음). (required_inference)
  • 가정: 일시정지된 구독의 정상화는 관리자 수동 재결제 성공으로 처리된다. (required_inference)
  • 가정: 알림 채널은 요구되지 않았으므로 발송·기록만 보장하고 채널 세부는 개발 시 확정한다. (required_inference)
  • 제약: 재시도 간격 1일·\xed\x9a\x9f수 3회·일시정지·\xec\x95\x8c림은 고정 정책이다. (explicit)
  • 제약:\x20\xec\xbf\xa0\xed\x8f\xb0 제안은 1회로 제한된다. (explicit)
  • 제약:\x20\xec\x9b\xb9 서비스로 제공한다. (explicit)

12. Glossary

  • 정기결제(구독): 상품을 매월 카드로 자동 결제하는 구독.
  • 재시도: 결제 실패 후 하루 간격으로 최대 3회 다시 결제하는 것.
  • 일시정지: 3회 재시도 실패 후 구독이\x20\xeb\xa9\x88\xec\xb6\x98 상태.
  • 재시도 이력: 각 재시도의 시각·결과·\xed\x9a\x9f수 기록.
  • 해지 사유: 회원이 해지 시 입력하는 이유.
  • 할인\x20\xec\xbf\xa0\xed\x8f\xb0 제안: 해지 시 한 번 제공되는 할인 제안.
  • 수동 재결제: 관리자가 실패 결제를 직접 다시 결제하는 행위.
Page 18 of 18
Live
Landing design preview
Landing: Open service
Login: 1. Sign in as admin
Login: 2. Re-enter credentials after error
Failed Payments: View failed payments
Failed Payments: 1. Select failed payment
Payment Retry: 2. Review payment details
Payment Retry: 3. Run manual retry
Payment Retry: 4. See success, subscription restored
Payment Retry: 5. See failure reason
Failed Payments: 6. Return to list
Live
Landing design preview
Landing: Open service
Login: 1. Sign in as admin
Login: 2. Re-enter credentials after error
Failed Payments: View failed payments
Failed Payments: 1. Select failed payment
Payment Retry: 2. Review payment details
Payment Retry: 3. Run manual retry
Payment Retry: 4. See success, subscription restored
Payment Retry: 5. See failure reason
Failed Payments: 6. Return to list