SCENARIO-USER-020_로그인 후 첫 예약 완료 흐름
SCENARIO-USER-020_로그인 후 첫 예약 완료 흐름
SCENARIO-USER-020 로그인 후 첫 예약 완료 흐름
1. Metadata
- Status: draft
- Date: 2026-03-09
- Owner: YSY
- Related ADRs: ADR-020, ADR-030, ADR-040, ADR-070, ADR-260
2. Goal
로그인/전화 인증 완료 사용자의 첫 예약에서 상태 머신 설명보다 UX 이해를 우선한다. 사용자는 각 단계에서 “지금 해야 할 행동"과 “다음에 일어날 일"을 즉시 이해할 수 있어야 한다.
3. UX-First Principles
- 한 화면에서 한 가지 결정만 요구한다.
- 진행 상태(hold, 결제, 검증, 완료)를 항상 상단에 고정해 노출한다.
- 실패 시 다음 행동은 한 단계만 제시한다. (재시도 또는 대체 경로)
- 완료 화면은 신뢰 신호(상태, 시각, 예약 식별자, 다음 행동)를 반드시 제공한다.
- 도메인 상태 전이는 사용자 문구와 1:1로 매핑한다.
4. Preconditions
- 사용자는 로그인 및 전화 인증(OTP)을 완료했다.
- 선택한 슬롯은 발행 중(
issued)이며 가용 수량이 1 이상이다. - 슬롯에는
payment_method, verification_method가 사전에 확정되어 있다. - 네트워크는 기본적으로 연결되어 있다.
5. UX Main Scenario (먼저 보는 흐름)
- 사용자가 슬롯 상세에서 예약 CTA를 누른다.
- 앱은 Hold 생성 성공 시 즉시 남은 시간과 현재 단계를 노출한다.
- 앱은 결제 방식에 따라 다음 화면을 분기한다.
prepaid: 결제 진행 화면으로 이동on_site: 결제 단계를 건너뛰고 예약 확정 단계로 이동
- 결제/예약 확정 직후 앱은
reserved 상태와 검증 필요 여부를 명시한다. - 앱은 검증 방식에 따라 완료 단계를 분기한다.
none: 즉시 완료location: 사용/수령 이벤트 시점 위치 검증qr: QR 스캔 검증
- 완료 시 앱은
redeemed 결과와 후속 CTA(내 예약 보기, 홈으로)를 제공한다.
6. UX Flow Spec (화면 단위)
| Phase | Screen/Surface | 사용자 질문 | UI가 답해야 할 내용 | Primary CTA | Secondary CTA | 종료 조건 |
|---|
| P1 | 슬롯 상세 | “지금 예약 가능한가?” | 잔여 수량, 결제/검증 방식 배지, 예상 소요 단계 | 예약하기 | 뒤로 | Hold 생성 요청 |
| P2 | Hold 진행 바텀시트/페이지 | “얼마나 남았나?” | hold 타이머, 현재 단계, 실패 시 영향 | 계속 진행 | 취소 | 결제/예약 단계 진입 |
| P3 | 결제 진행(prepaid) | “결제가 되었나?” | 결제 진행 상태, 재시도 가능 여부 | 결제 계속 | 취소 | 성공 시 reserved |
| P3' | 예약 확정(on_site) | “다음은 무엇인가?” | reserved 확정, 검증 필요 여부 | 검증 진행 | 취소 | 검증 단계 진입 |
| P4-a | 즉시 완료(none) | “끝났나?” | 완료 시각, 이용/수령 안내 | 내 예약 보기 | 홈으로 | redeemed |
| P4-b | 위치 검증(location) | “여기서 확인되나?” | 이벤트 시점 검증 안내, 실패 시 QR 폴백 가능 여부 | 위치 확인 | QR로 전환 | 성공 시 redeemed |
| P4-c | QR 검증(qr) | “어떻게 인증하나?” | 스캔 안내, 실패 시 재시도/종료 조건 | QR 스캔 | 취소 | 성공 시 redeemed |
| P5 | 완료 화면 | “정상 완료됐나?” | 최종 상태, 예약 식별 정보, 다음 행동 | 내 예약 보기 | 홈으로 | 플로우 종료 |
7. UX Branch by Option (조합별 사용자 체감)
| Case | payment_method | verification_method | 사용자가 체감하는 단계 | 핵심 안내 문구 | 실패 시 즉시 행동 |
|---|
| B1 | prepaid | none | hold -> 결제 -> 완료 | “결제가 확인되어 예약이 완료됐어요” | 결제 실패 시 다시 시도 |
| B2 | prepaid | location | hold -> 결제 -> 검증 대기 -> 위치 확인 | “예약은 확정됐고, 현장에서 위치 확인이 필요해요” | 위치 실패 시 QR 전환 |
| B3 | prepaid | qr | hold -> 결제 -> QR 인증 | “예약은 확정됐고, QR 인증 후 완료돼요” | 스캔 재시도 |
| B4 | on_site | none | hold -> 즉시 완료 | “예약이 바로 완료됐어요” | hold 만료 시 다른 슬롯 보기 |
| B5 | on_site | location | hold -> 검증 대기 -> 위치 확인 | “예약은 완료 직전이며 위치 확인이 필요해요” | 위치 실패 시 QR 전환 |
| B6 | on_site | qr | hold -> QR 인증 | “QR 인증 후 완료돼요” | 스캔 재시도 |
8. Recovery UX (예외/복구)
A1. Hold 생성 실패(경합/마감)
- 안내: “방금 마감되어 예약이 어려워요”
- 행동: 다른 시간 보기 CTA를 1순위로 제공한다.
A2. 결제 실패 또는 타임아웃 (prepaid)
- 안내: 실패 사유와 재시도 가능 여부를 분리해 표시한다.
- 행동: 재시도 가능하면 동일 컨텍스트 재시도, 불가하면 종료한다.
A3. 위치 검증 실패 (location)
- 안내: 실패 원인 요약 + 만료 전 남은 시간 + QR 전환 가능 여부를 함께 표시한다.
- 행동: 만료 전에는 QR 폴백 CTA를 기본으로 제공한다.
A4. QR 검증 실패/시간초과 (qr)
- 안내: 재시도 가능 횟수 또는 종료 조건을 명시한다.
- 행동: 재시도 우선, 만료 시 종료(
expired|cancelled) 처리한다.
A5. 멱등 재요청 (모든 분기)
- 안내: “이미 처리된 요청"임을 명확히 보여준다.
- 행동: 동일 결과 화면을 재노출하고 중복 결제/중복 완료는 차단한다.
A6. 완료 후 수량 표시 지연
- 안내: “최신 수량으로 갱신 중” 상태를 짧게 노출한다.
- 행동: 서버 스냅샷 기준 자동 동기화 후 현재 화면을 유지한다.
9. Domain Mapping (참조용 상태 전이)
| Case | 상태 전이 |
|---|
| B1 | hold -> payment_pending -> reserved -> redeemed |
| B2 | hold -> payment_pending -> reserved -> location_verifying -> redeemed |
| B3 | hold -> payment_pending -> reserved -> qr_verifying -> redeemed |
| B4 | hold -> reserved -> redeemed |
| B5 | hold -> reserved -> location_verifying -> redeemed |
| B6 | hold -> reserved -> qr_verifying -> redeemed |
정책 메모:
prepaid 결제 성공 시 상태는 우선 reserved로 확정한다.none은 reserved -> redeemed를 즉시 수행한다.on_site+location 검증은 주기 검증이 아닌 이벤트 시점 검증이다.- 위치 검증 실패 시 만료 전에는 QR 폴백을 기본 제공한다.
10. ADR Impact (UX 기준 우선 반영)
- ADR-030: 결제 성공 직후
reserved 안내 문구/단계 표준을 UX 기준으로 고정한다. - ADR-040: 위치 실패 시 QR 폴백 노출 조건(
fallback=qr, expires_in_sec)을 UX 흐름 기준으로 명확화한다. - ADR-260: 첫 예약 플로우의 단계 밀도, 실패 메시지 톤, CTA 우선순위를 빈 상태 기준과 일관되게 정렬한다.
- ADR-070: 재요청 시 동일 결과 화면 재노출 규칙을 UX 계약으로 연결한다.
- ADR-020: 완료 직후 수량 재동기화 안내를 사용자 플로우에 포함한다.
11. Acceptance Criteria