안드로이드 앱 MVP 스프린트 플랜

안드로이드 앱 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시간 내”, “오늘” 정도의 단순 프리셋)

  • 정렬 기본값:

    1. 지금 사용 가능 여부

    2. 거리

    3. 시간 임박

  • 무한스크롤 지양: 페이지네이션 버튼/더보기(또는 제한된 결과 + 필터로 좁히기)

  • 빈 상태/로딩 상태/에러 상태 디자인

완료 기준

  • 필터 조합에 따라 결과가 즉시 바뀜

  • “지금 사용 가능”이 항상 우선 노출됨

  • 결과 수가 많아도 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 최소)

  1. 홈(주변 슬롯 리스트)

  2. 필터 패널(바텀시트)

  3. 슬롯 상세

  4. 확보 타이머(Reserved)

  5. 체크인(Arrived)

  6. 내 기록(History)


체크포인트

  • Sprint 3 끝나면: “확보까지 되는 앱”

  • Sprint 5 끝나면: “도착 확정까지 되는 앱” (MVP 핵심)

  • Sprint 8 끝나면: “운영 가능한 앱”