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

  1. 한 화면에서 한 가지 결정만 요구한다.
  2. 진행 상태(hold, 결제, 검증, 완료)를 항상 상단에 고정해 노출한다.
  3. 실패 시 다음 행동은 한 단계만 제시한다. (재시도 또는 대체 경로)
  4. 완료 화면은 신뢰 신호(상태, 시각, 예약 식별자, 다음 행동)를 반드시 제공한다.
  5. 도메인 상태 전이는 사용자 문구와 1:1로 매핑한다.

4. Preconditions

  1. 사용자는 로그인 및 전화 인증(OTP)을 완료했다.
  2. 선택한 슬롯은 발행 중(issued)이며 가용 수량이 1 이상이다.
  3. 슬롯에는 payment_method, verification_method가 사전에 확정되어 있다.
  4. 네트워크는 기본적으로 연결되어 있다.

5. UX Main Scenario (먼저 보는 흐름)

  1. 사용자가 슬롯 상세에서 예약 CTA를 누른다.
  2. 앱은 Hold 생성 성공 시 즉시 남은 시간과 현재 단계를 노출한다.
  3. 앱은 결제 방식에 따라 다음 화면을 분기한다.
  • prepaid: 결제 진행 화면으로 이동
  • on_site: 결제 단계를 건너뛰고 예약 확정 단계로 이동
  1. 결제/예약 확정 직후 앱은 reserved 상태와 검증 필요 여부를 명시한다.
  2. 앱은 검증 방식에 따라 완료 단계를 분기한다.
  • none: 즉시 완료
  • location: 사용/수령 이벤트 시점 위치 검증
  • qr: QR 스캔 검증
  1. 완료 시 앱은 redeemed 결과와 후속 CTA(내 예약 보기, 홈으로)를 제공한다.

6. UX Flow Spec (화면 단위)

PhaseScreen/Surface사용자 질문UI가 답해야 할 내용Primary CTASecondary CTA종료 조건
P1슬롯 상세“지금 예약 가능한가?”잔여 수량, 결제/검증 방식 배지, 예상 소요 단계예약하기뒤로Hold 생성 요청
P2Hold 진행 바텀시트/페이지“얼마나 남았나?”hold 타이머, 현재 단계, 실패 시 영향계속 진행취소결제/예약 단계 진입
P3결제 진행(prepaid)“결제가 되었나?”결제 진행 상태, 재시도 가능 여부결제 계속취소성공 시 reserved
P3'예약 확정(on_site)“다음은 무엇인가?”reserved 확정, 검증 필요 여부검증 진행취소검증 단계 진입
P4-a즉시 완료(none)“끝났나?”완료 시각, 이용/수령 안내내 예약 보기홈으로redeemed
P4-b위치 검증(location)“여기서 확인되나?”이벤트 시점 검증 안내, 실패 시 QR 폴백 가능 여부위치 확인QR로 전환성공 시 redeemed
P4-cQR 검증(qr)“어떻게 인증하나?”스캔 안내, 실패 시 재시도/종료 조건QR 스캔취소성공 시 redeemed
P5완료 화면“정상 완료됐나?”최종 상태, 예약 식별 정보, 다음 행동내 예약 보기홈으로플로우 종료

7. UX Branch by Option (조합별 사용자 체감)

Casepayment_methodverification_method사용자가 체감하는 단계핵심 안내 문구실패 시 즉시 행동
B1prepaidnonehold -> 결제 -> 완료“결제가 확인되어 예약이 완료됐어요”결제 실패 시 다시 시도
B2prepaidlocationhold -> 결제 -> 검증 대기 -> 위치 확인“예약은 확정됐고, 현장에서 위치 확인이 필요해요”위치 실패 시 QR 전환
B3prepaidqrhold -> 결제 -> QR 인증“예약은 확정됐고, QR 인증 후 완료돼요”스캔 재시도
B4on_sitenonehold -> 즉시 완료“예약이 바로 완료됐어요”hold 만료 시 다른 슬롯 보기
B5on_sitelocationhold -> 검증 대기 -> 위치 확인“예약은 완료 직전이며 위치 확인이 필요해요”위치 실패 시 QR 전환
B6on_siteqrhold -> 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상태 전이
B1hold -> payment_pending -> reserved -> redeemed
B2hold -> payment_pending -> reserved -> location_verifying -> redeemed
B3hold -> payment_pending -> reserved -> qr_verifying -> redeemed
B4hold -> reserved -> redeemed
B5hold -> reserved -> location_verifying -> redeemed
B6hold -> reserved -> qr_verifying -> redeemed

정책 메모:

  • prepaid 결제 성공 시 상태는 우선 reserved로 확정한다.
  • nonereserved -> redeemed를 즉시 수행한다.
  • on_site+location 검증은 주기 검증이 아닌 이벤트 시점 검증이다.
  • 위치 검증 실패 시 만료 전에는 QR 폴백을 기본 제공한다.

10. ADR Impact (UX 기준 우선 반영)

  1. ADR-030: 결제 성공 직후 reserved 안내 문구/단계 표준을 UX 기준으로 고정한다.
  2. ADR-040: 위치 실패 시 QR 폴백 노출 조건(fallback=qr, expires_in_sec)을 UX 흐름 기준으로 명확화한다.
  3. ADR-260: 첫 예약 플로우의 단계 밀도, 실패 메시지 톤, CTA 우선순위를 빈 상태 기준과 일관되게 정렬한다.
  4. ADR-070: 재요청 시 동일 결과 화면 재노출 규칙을 UX 계약으로 연결한다.
  5. ADR-020: 완료 직후 수량 재동기화 안내를 사용자 플로우에 포함한다.

11. Acceptance Criteria

  • 사용자에게 단계 정보(hold/결제/검증/완료)가 항상 노출된다.
  • 각 화면은 Primary CTA 1개를 중심으로 의사결정 부담을 줄인다.
  • prepaid 성공 직후에는 반드시 reserved 안내를 먼저 노출한다.
  • none 분기는 즉시 완료 UX를 제공한다.
  • on_site+location은 이벤트 시점 검증 UX로만 동작한다.
  • 위치 실패 시 만료 전 QR 폴백 CTA가 기본으로 노출된다.
  • 멱등 재요청 시 동일 결과 화면을 재노출하고 중복 처리하지 않는다.
  • 완료 후 수량 표시가 서버 스냅샷 기준으로 동기화된다.
  • 관련 ADR/SPEC/RUNBOOK과 충돌하지 않는다.