Sprint 1 - 위치 권한 _ 현재 위치 기반 조회

Sprint 1 - 위치 권한 _ 현재 위치 기반 조회

목표
“위치”가 앱의 입력값으로 들어오고, 그 결과로 “주변 슬롯 리스트”가 안정적으로 갱신된다.

Sprint 1 종료 시점에서 Supabase가 아직 완전히 붙지 않아도 된다.
단, API 레이어는 “실데이터로 바꿔 끼울 수 있게” 분리되어 있어야 한다.


S1-1 위치 권한 요청 플로우 구현

목적
권한 허용/거부/재요청까지 앱이 끊기지 않고 안내한다.

작업

  • 위치 권한 요청 (최초 진입 시)

  • 권한 거부 상태 UI (권한 필요 안내)

  • 설정으로 이동 CTA

  • 권한 재확인 트리거(앱 포그라운드 복귀 시 재검사)

완료 조건

  • 권한 허용 시 다음 티켓(위치 획득)으로 진행

  • 권한 거부 시 홈에서 “권한 필요” 상태를 명확히 표시

  • 설정에서 허용 후 앱으로 복귀하면 자동으로 정상 화면 전환


S1-2 현재 위치 1회 획득 및 store 반영

목적
현재 위치를 가져와 전역 상태로 저장한다.

작업

  • getCurrentPosition(1회) 구현

  • location store에 (lat, lng, accuracy, timestamp) 저장

  • 위치 획득 실패 케이스 처리 (timeout, unavailable 등)

완료 조건

  • 홈 화면에서 현재 위치 값이 store에 들어오는 것이 확인됨

  • 실패 시 에러 화면이 아니라 “위치 획득 실패 상태”로 graceful 처리


S1-3 위치 갱신 정책 정의 및 구현

목적
위치를 과하게 갱신하지 않으면서도 “현재”에 충분히 가깝게 유지한다.

권장 정책(초기)

  • 홈 진입 시 1회 갱신

  • 수동 새로고침 시 갱신

  • 포그라운드 복귀 시 (예: 60초 이상 경과했을 때만) 갱신

  • 고주기 watchPosition은 Sprint 1에서 금지(배터리/복잡도 증가)

작업

  • “마지막 위치 갱신 시각” 관리

  • refreshLocation() 유틸/액션 작성

  • 지나치게 잦은 요청 방지(간단한 throttle)

완료 조건

  • 연속 새로고침에도 위치 요청이 폭주하지 않음

  • 포그라운드 복귀 시 조건부 갱신이 동작


S1-4 슬롯 조회 API 계약(Contract) 확정

목적
UI와 데이터 소스(Supabase/Mock) 사이의 계약을 고정한다.

작업

  • Slot 타입 정의(필수 필드만)

    • slotId

    • startAt, endAt

    • benefitText(할인/혜택 요약)

    • remainingQty

    • distanceMeters(계산 결과)

    • merchantSummary(최소 정보)

  • getNearbySlots(params) 시그니처 확정

    • center(lat,lng)

    • radiusMeters

    • timeWindow(“now”, “next1h”, “today” 등)

    • category(optional)

완료 조건

  • HomeScreen은 이 계약만 의존하고, 구현체(mock/supabase)는 교체 가능

S1-5 거리 계산 유틸 구현 및 단위 표기 규칙 확정

목적
거리 표시의 일관성 확보(정확도보다 일관성).

작업

  • haversine 기반 거리 계산(또는 라이브러리 1개 채택)

  • 표시 규칙

    • 1000m 미만: “xxx m”

    • 1000m 이상: “x.x km”

  • 거리 반올림 규칙(예: 10m 단위 또는 50m 단위)

완료 조건

  • 동일 좌표 입력에 대해 거리 결과가 안정적으로 동일

  • SlotCard에서 거리 문자열 표시


S1-6 홈 화면: 위치 기반 슬롯 로딩 플로우 연결

목적
위치 → 슬롯 조회 → 리스트 렌더링까지 한 흐름으로 연결.

작업

  • 홈 진입 시:

    • 권한 체크

    • 위치 획득

    • 슬롯 조회

  • 로딩/빈상태/에러 상태 분기

  • pull-to-refresh(또는 버튼 새로고침)로 위치+슬롯 갱신

완료 조건

  • 최초 진입에서 자동 로딩이 동작

  • 새로고침 시 리스트가 갱신(데이터가 달라도 UI 안정)


S1-7 검색 반경 기본값 및 조정 UI(초기 최소)

목적
초근거리 원칙을 UI/정책에 반영.

권장 초기값

  • 기본 반경: 1km 또는 2km(도시 밀도에 따라 조정)

  • 반경 조정은 “필터”로 Sprint 2로 넘겨도 되지만,
    Sprint 1에서는 최소한 내부 상수로 고정하고 로그로 남긴다.

작업

  • radiusMeters 기본값 상수화

  • 반경 변경은 아직 UI로 열지 않되, params로는 이미 지원

완료 조건

  • 코드 상에서 반경 변경이 쉬운 구조

  • 슬롯 조회 요청에 반경이 포함됨


S1-8 개발용 더미 데이터 시나리오 세트 작성

목적
백엔드 없이도 QA 가능한 시나리오를 만든다.

작업

  • 주변 슬롯 0개(빈 상태)

  • 5개(정상)

  • 시간 임박 2개 + 수량 임박 1개(표시 테스트)

  • API 실패 1회(에러 처리 테스트)

완료 조건

  • 개발자가 토글로 시나리오 변경 가능

  • 홈 UI 상태 전부 확인 가능


Sprint 1 완료 정의

다음이 가능해야 한다.

  • 위치 권한 처리(거부/허용/설정 이동 포함)

  • 현재 위치 획득 후 store 반영

  • 위치를 입력으로 주변 슬롯 조회 호출

  • 홈에서 로딩/빈/에러/정상 상태가 명확히 분기

  • 새로고침으로 위치+슬롯 갱신