SCENARIO-USER-030_예약 취소 및 만료 후 재진입 흐름
SCENARIO-USER-030_예약 취소 및 만료 후 재진입 흐름
SCENARIO-USER-030 예약 취소 및 만료 후 재진입 흐름
1. Metadata
- Status: draft
- Date: 2026-03-09
- Owner: YSY
- Related ADRs: ADR-050, ADR-060, ADR-070, ADR-080, ADR-100, ADR-260
2. Goal
예약 확정(reserved) 이후 사용자가 취소하거나 자동 만료되는 상황에서, 환불 정책/책임 경계/다음 행동을 혼동 없이 이해하고 다시 탐색으로 복귀할 수 있는 UX 표준 흐름을 정의한다.
3. UX-First Principles
- 취소/만료 결과는 정책 문구와 함께 즉시 확정 표시한다.
- 취소 확인 단계에서 핵심 비용/정책(환불 없음)을 먼저 보여준다.
- 실패/차단 상황에서는 한 번에 하나의 다음 행동만 기본 제안한다.
- 시간 관련 안내는 서버 기준 만료 시각을 사용자 로컬 시간으로 변환해 제공한다.
- 동일 요청 재전송 시 결과 화면을 동일하게 재노출한다.
4. Preconditions
- 사용자는 로그인 및 전화 인증을 완료했다.
- 대상 예약은 사용자 소유이며 상태가
reserved 또는 검증 대기 상태다. - 현재 시각은 서버 UTC 기준으로 관리되고, 앱 표시는 로컬 시간으로 변환된다.
- 결제 방식은
prepaid 또는 on_site일 수 있다.
5. UX Main Scenario (사용자 취소)
- 사용자가
내 예약에서 대상 예약 상세를 연다. - 상세 화면은 현재 상태, 만료 시각(로컬), 남은 시간, 취소 가능 여부를 표시한다.
- 사용자가
예약 취소 CTA를 누른다. - 취소 확인 시트는
환불 없음 정책과 취소 후 결과(cancelled)를 명시한다. - 사용자가 취소를 확정하면 상태를
cancelled로 전이하고 cancel_reason=user_cancelled를 기록한다. - 완료 화면에서 결과 요약과 다음 행동 CTA(
다른 슬롯 보기, 홈으로)를 제공한다.
6. UX Flow Spec (화면 단위)
| Phase | Screen/Surface | 사용자 질문 | UI가 답해야 할 내용 | Primary CTA | Secondary CTA | 종료 조건 |
|---|
| P1 | 내 예약 목록 | “지금 처리해야 할 예약이 뭔가?” | 예약 상태/만료 임박 여부 | 예약 상세 보기 | 홈으로 | 상세 진입 |
| P2 | 예약 상세(reserved) | “취소 가능한가?” | 취소 가능 여부, 만료 시각(로컬), 정책 요약 | 예약 취소 | 뒤로 | 취소 확인 진입 |
| P3 | 취소 확인 시트 | “취소하면 뭐가 바뀌나?” | cancelled 전이, 환불 없음, 사유 기록 | 취소 확정 | 유지하기 | 취소 요청 전송 |
| P4 | 취소 완료 화면 | “정상 처리됐나?” | 최종 상태, 처리 시각, refund=false | 다른 슬롯 보기 | 홈으로 | 플로우 종료 |
| P5 | 만료 완료 화면 | “왜 종료됐나?” | 만료 사유, 만료 시각, 다음 선택지 | 다른 슬롯 보기 | 내 예약 목록 | 플로우 종료 |
7. Branches (취소/만료/책임 분기)
| Case | Trigger | 상태 결과 | 사용자 안내 핵심 | 다음 행동 |
|---|
| C1 | 사용자 취소 확정 | reserved -> cancelled | “예약이 취소되었고 환불은 제공되지 않아요” | 다른 슬롯 보기 |
| C2 | 파트너 취소 | reserved -> cancelled | “매장 사정으로 취소되었어요” | 다른 슬롯 보기/문의 |
| C3 | 시스템 취소 | reserved -> cancelled | “시스템 정책에 따라 취소되었어요” | 안내 확인 |
| E1 | 만료 시각 경과 | reserved -> expired | “만료로 예약이 종료되었어요” | 다른 슬롯 보기 |
| D1 | 선결제 분쟁 문의 | 상태 유지(`expired | cancelled`) | “분쟁은 발행자와 직접 해결, 플랫폼은 증적 제공” |
| P1 | 반복 미이행 임계 도달 | 예약 시도 차단 가능 | “반복 미이행으로 일정 기간 제한” | 이의제기/해제 시각 확인 |
8. Recovery UX (예외/복구)
A1. 취소 요청 권한 없음
- 안내: 권한 부족 사유를 명시한다. (
AUTH_TRANSITION_DENIED) - 행동: 목록 복귀 또는 지원 채널 이동 CTA를 제공한다.
A2. 취소 사유 누락
- 안내: 취소 사유가 필요함을 명시한다. (
CANCEL_REASON_REQUIRED) - 행동: 사유 입력/선택 후 재시도하게 한다.
A3. 중복 취소 탭/네트워크 재전송
- 안내: 이미 처리된 요청임을 표시한다.
- 행동: 최초 처리 결과 화면을 동일하게 재노출한다.
A4. 만료 임박 상태
- 안내: 만료 임박 강조와 정확한 로컬 시각을 함께 노출한다.
- 행동: 취소 또는 즉시 이용 행동 중 하나를 선택하게 한다.
A5. 선결제 분쟁 문의
- 안내: 환불 없음 정책과 책임 경계를 반복 안내한다.
- 행동: 발행자 직접 문의 경로 + 증적 요청 경로를 제공한다.
9. Domain Mapping (참조용 상태/사유)
| 이벤트 | 상태 전이 | 필수 사유/필드 |
|---|
| 사용자 취소 | reserved -> cancelled | cancel_reason=user_cancelled, refund=false |
| 파트너 취소 | reserved -> cancelled | cancel_reason=partner_cancelled, refund=false |
| 시스템 취소 | reserved -> cancelled | cancel_reason=system_cancelled, refund=false |
| 만료 처리 | reserved -> expired | expires_at_utc 기준 판정, refund=false |
| 재요청 | 상태 변화 없음 | idempotency_key로 동일 결과 재반환 |
정책 메모:
expired|cancelled는 모두 환불 없음 정책을 따른다.- 취소 요청은
cancel_reason 없이 처리할 수 없다. - 만료 기준은 서버 UTC, 사용자 표시는 로컬 타임존을 사용한다.
- 반복
expired/cancelled는 제재 정책과 연동될 수 있다.
10. ADR Impact
- ADR-060: 취소 확인 UX에서
refund=false와 책임 경계 문구를 표준화한다. - ADR-050: 취소 권한 실패 시 차단 사유/복구 CTA 표준을 명확화한다.
- ADR-080: 만료 시각 로컬 표기와 임박 강조 규칙을 사용자 플로우 기준으로 고정한다.
- ADR-070: 취소 재요청 시 동일 결과 화면 재노출을 UX 계약으로 연결한다.
- ADR-100: 반복 미이행 사용자 경고/제재 안내 진입 시점을 시나리오로 명시한다.
11. Acceptance Criteria