안드로이드 앱 MVP 스프린트 플랜
MVP 성공 조건
사용자가 현재 위치 기준으로 슬롯을 보고
슬롯을 확보(15분) 하고
매장에서 체크인해서
슬롯이 사용 확정(redeemed) 상태로 전환되고
미도착이면 자동 만료(expired) 되어 재노출되는 흐름이 실제로 돈다
Sprint 0 (3~5일) 기본 골격 고정
목표
“화면 3개짜리 빈 앱”이 아니라, 확장 가능한 기본 뼈대를 만든다.
산출물
RN(Expo) 프로젝트 생성
라우팅 구조
상태관리 최소(예: Zustand) 및 API 레이어(Repository) 스켈레톤
환경변수/빌드 타입 분리(dev/prod)
로그/에러 리포팅 최소 (Sentry 같은 건 나중, 지금은 console+간단 logger)
완료 기준
- 앱 실행 → 홈 진입 → 더미 데이터로 슬롯 리스트/상세/확보 화면 이동 가능
Sprint 1 (1주) 위치 권한 + “현재 위치 기반” 조회
목표
앱의 심장: 위치가 돈다.
범위
위치 권한 요청/거부/재요청 플로우
현재 위치 획득
“내 주변 슬롯” API 호출(초기엔 mock 또는 Supabase)
거리 계산 및 표시(정확도는 후순위, 일관성 우선)
UI 원칙 반영
리스트 1차 정보: 시간 / 혜택 / 남은수량 / 거리
매장 정보는 최소(2차)
완료 기준
권한 허용 시: 주변 슬롯 리스트가 뜸
권한 거부 시: “권한 필요” 안내 + 설정 이동
새로고침 시 위치가 갱신되고 리스트가 갱신됨
Sprint 2 (1주) 슬롯 리스트 UX 고정 + 필터
목표
“탐색이 빨라야 한다”를 구조로 박는다.
범위
필터: 거리 / 업종 / 시간대(“지금 사용 가능”, “1시간 내”, “오늘” 정도의 단순 프리셋)
정렬 기본값:
지금 사용 가능 여부
거리
시간 임박
무한스크롤 지양: 페이지네이션 버튼/더보기(또는 제한된 결과 + 필터로 좁히기)
빈 상태/로딩 상태/에러 상태 디자인
완료 기준
필터 조합에 따라 결과가 즉시 바뀜
“지금 사용 가능”이 항상 우선 노출됨
결과 수가 많아도 UI가 안정적으로 유지됨
Sprint 3 (1주) 슬롯 상세 + 확보(Reserved) 생성
목표
슬롯은 상품이 아니라 시간 기회라는 감각을 상세에서 완성.
범위
슬롯 상세 화면
시간 범위
혜택 조건
남은 수량
거리/예상 이동(선택)
“확보” CTA
확보(Reserved) 생성 API
확보 성공 시: “15분 타이머 화면” 진입
완료 기준
사용자가 슬롯 상세에서 확보 가능
확보하면 상태가 reserved로 생성되고 사용자에게 15분 타이머가 보임
중복 확보/수량 부족/만료 임박 등 오류 메시지 처리
Sprint 4 (1주) 15분 유효시간 타이머 + 만료 처리
목표
보증금 대신 시간 설계로 노쇼를 제어한다. 이걸 앱에서 체감 가능하게.
범위
확보 타이머 UI (남은 시간, 주의 메시지, 체크인 안내)
만료 시:
자동으로 expired 처리(서버 기준)
화면에서 만료 안내 후 리스트로 복귀
앱 백그라운드/복귀 시 타이머 동기화 (클라 기준 X, 서버 기준으로 재계산)
완료 기준
앱을 껐다 켜도 타이머가 “정확하게” 이어짐
15분 경과 시 자동 만료 + 재확보 불가(또는 재시도 시 서버가 거절)
Sprint 5 (1주) 체크인(Arrived) 확정 + 수량 차감
목표
reserved는 임시 상태이며 수량 차감은 redeemed에서만 수행한다.
범위 (둘 중 하나 선택, 초기엔 단순한 걸로)
체크인 방식 A: 위치 기반 “도착 확인” 버튼
- 반경 조건(예: 50~100m) 충족 시 체크인 가능
체크인 방식 B: QR 스캔(발행자 옵션)
- MVP에선 A를 기본으로, B는 Phase 2로 넘겨도 됨
서버 로직:
redeemed로 전환 시 수량 차감 트랜잭션 처리
이미 만료/이미 차감/수량 0이면 실패 처리
완료 기준
사용 확정 성공 시 redeemed 상태가 됨
reserved 상태에서만 “사용 확정” UI가 보임
수량이 실제로 감소함(동시성 포함)
Sprint 6 (1주) 사용 처리(Redeemed) 최소 구현
목표
결제/정산은 나중이어도, “사용 완료” 상태는 있어야 운영이 된다.
범위
redeemed 전환 방법(초기 MVP 단순화)
매장 직원이 보는 별도 화면이 없으면: “사용 완료” 버튼은 임시로 막거나(일반 사용자 노출 금지)
MVP에서도 redeemed를 최종 상태로 운영하고, 데이터 모델을 동일하게 유지
사용자 히스토리: “내 확보/체크인 기록” 리스트
완료 기준
사용자는 본인 기록(Reserved/Arrived/Expired)을 확인 가능
운영/분석을 위한 이벤트 로그가 남음
Sprint 7 (1주) 노쇼/반복 미도착 제한 (사용자 제재 v1)
목표
보증금 없이도 “장난”을 구조로 눌러야 한다.
범위
반복 미도착 감지 기준(예시)
- 최근 7일 내 expired n회 이상
제재 정책(점진형)
확보 가능 수량 제한
확보 유효시간 단축(예: 15 → 10)
일정 기간 확보 불가(예: 24시간)
앱 UI: 제재 사유/기간 안내 (과장 없이, 차분하게)
완료 기준
반복 미도착 유저에게 자동 제재가 적용되고, 앱에서 확보 시도가 거절됨
제재 해제 시 자동 복구
Sprint 8 (1주) 안정화/성능/경계조건
목표
“돌아는 가는데 불안한 앱”을 “운영 가능한 앱”으로 만든다.
범위
네트워크 실패/재시도 정책
중복 탭/연타 방지
앱 재설치/재로그인 시 reserved 복구
로딩/에러 UI 통일
위치 오차 큰 기기 대응(반경 체크 보수적으로)
완료 기준
QA 시나리오 30개 정도를 통과
크래시 없이 데모 가능
운영자가 봐도 정책이 일관됨
병렬로 꼭 깔아야 하는 “공통 백로그”
(스프린트에 끼워 넣는 형태로 진행)
인증/계정
MVP는 소셜/매직링크 중 하나로 단순 시작
익명→가입 전환(게스트로 보기만, 확보는 로그인 필요)도 현실적인 선택
이벤트 로깅
“누가/언제/어떤 슬롯을/어떤 상태로 바꿨는지”
최소 이벤트: slot_view, reserve, reserve_fail, redeem, expired, penalty_applied
알림 (초기 최소)
확보 후 10분 경과 시 “5분 남음” 로컬 알림 정도는 효과 큼
과한 푸시는 금지(지침 준수)
앱 화면 구성 (MVP 최소)
홈(주변 슬롯 리스트)
필터 패널(바텀시트)
슬롯 상세
확보 타이머(Reserved)
체크인(Arrived)
내 기록(History)
체크포인트
Sprint 3 끝나면: “확보까지 되는 앱”
Sprint 5 끝나면: “도착 확정까지 되는 앱” (MVP 핵심)
Sprint 8 끝나면: “운영 가능한 앱”