ParkPin
주차 위치를 층·구역으로 기록하고 홈 위젯(iOS·Android)으로 앱을 열지 않고 확인하는 개인용 주차 앱 - 오프라인 우선, 로컬 저장.
- React Native / Expo
- TypeScript
- Home Widget (iOS/Android)
- Offline-first
온보딩 - "주차한 자리, 이제 다시 헤매지 않아요." 콕 기록 · 위젯 확인 · 차량별 저장 세 가지를 먼저 보여준다
홈 - 현재 주차 위치를 "B3-A · 기둥 옆"으로 크게, 차량·주차장·기록 시각과 지도·위치 공유·출차 버튼
지도 - 저장한 주차장 위치를 지도로 확인하고 "지도앱에서 길찾기"로 연결
상식 - 주차 매너·주정차 법규·번호판 개인정보 등 팁 모음. "일반 안내이고 최신 규정을 우선하라"는 경계를 하단에 명시
주차장 설정 - 단골 주차장의 층·구역을 직접 등록. 실외 주차는 설정 없이 "실외"로 바로 저장
주차 히스토리 - 입·출차와 주차 시간을 차량별로 타임라인으로 (예: "3시간 주차", "이마트 P2-딸기")
내 차량 정보 - 번호판별로 차량을 등록. 2대 이상이면 차량마다 주차 위치를 따로 기록
위치 공유 - 주차 위치를 이미지 카드로 만들어 공유
홈 위젯 - 앱을 열지 않고 "B3-A · 기둥 옆"을 홈 화면에서 바로 확인 (위젯 크기 여러 가지)
Setup
- Problem
주차 위치를 잊어 다시 찾는 데 시간을 쓴다. 단골 주차장(층·구역 구조가 있는 곳)과 낯선 곳(백화점 등)은 기록 방식이 달라서, 한 가지 방식만으로는 둘 다 잘 담기지 않는다.
- Context
개인용 도구로 시작. 단골 주차장은 층·구역으로 구조적으로, 낯선 곳은 자유 메모 한 줄로 기록하고 차량(번호판)별로 따로 저장한다.
Build
- What I did
- 두 가지 기록 방식 - 등록한 주차장은 층·구역 탭, 낯선 곳은 빠른 메모
- 차량(번호판)별 위치 저장 + 한국 번호판 형식 검증
- 홈 위젯(iOS·Android 모두)으로 앱을 열지 않고 위치 확인 - iOS는 WidgetKit + App Group, Android는 react-native-android-widget으로 구현
- 오프라인 우선 로컬 저장(AsyncStorage) - 네트워크 없이 동작, 앱 재실행 후에도 유지
- 선택적 Supabase 백엔드 - 계정·소셜 로그인·클라우드 백업/동기화. 미설정 시 로컬 전용으로 동작
- Product decisions
- 주차 후 화면은 "출차했어요" 버튼만 남기고 층·구역·저장을 숨김 - 다시 찾을 때 필요한 건 기록이 아니라 확인뿐이라
- 위젯을 핵심 진입점으로 - 위치 확인은 앱을 여는 것조차 마찰이라 홈 화면에서 두 줄로 끝나게
- 로컬 우선 - 개인 주차 위치는 네트워크·계정 없이도 즉시 저장·확인돼야 한다. 계정·클라우드 동기화는 선택적 Supabase 백엔드로 위에 얹되, 미설정 시 로컬 전용으로 degrade
- QA considerations
- 위젯과 앱이 같은 위치 데이터를 나눠 갖는 지점(iOS App Group)이 회귀가 가장 나기 쉬운 자리 - "앱에서 저장한 위치가 위젯에 항상 맞게 뜨는가"를 최우선 검증
- 오프라인 우선 - 네트워크·계정 없이 즉시 저장·확인되고, 앱 재실행 후에도 유지되는가
- 한국 번호판 형식 검증 로직을 단위 테스트로 고정(차량별 저장의 신뢰 기반)
- 선택적 Supabase 동기화 미설정 시 로컬 전용으로 정상 degrade 되는가
- 저장·번호판 검증·표시 로직·훅에 jest 단위 테스트를 먼저 깔아 회귀를 잡을 자리 확보
Outcome
- Metrics
- Android·iOS 비공개 테스트 단계
- 앱스토어 출시 전(스토어 등록 자료 준비 중)
- 소개·지원 페이지는 parkpin-app.pages.dev로 공개
진행 과정 (기획 → 개발)
문제·가설에서 스코프·스펙(SSOT)·개발·QA 게이트·배포까지, 같은 틀로 이 앱을 어떻게 기획하고 끌고 갔는지.
진행 과정 (기획 → 개발)
문제 · 가설
주차 위치를 잊어 다시 찾는 데 드는 시간을 없애려 시작. 단골 주차장(층·구역 구조)과 낯선 곳은 기록 방식이 다르다는 가설을 세우고, 한 화면을 두 입력 모드(구조 기록 / 빠른 메모)로 분기했다.
역량 · 문제 정의 · 가설
스코프 · 우선순위
기능을 FR-001~013으로 번호로 못박아 범위를 고정. 위젯·오프라인·차량별 저장을 코어로 두고, 지도·위치 공유·상식은 후순위로 밀어 초기 범위를 좁혔다.
역량 · 스코핑 · 우선순위
스펙 우선 (SSOT)
docs/ParkPin_SSOT.md에 화면·동작·수용 기준을 먼저 쓰고 구현이 그 문서를 따르게 했다. docs/ParkPin_Dev_Workflow.md로 개발 루틴을 고정해 혼자서도 흐트러지지 않게.
역량 · 스펙 · 문서화
개발 · 이터레이션
React Native/Expo로 코어를 세우고, 홈 위젯을 iOS(WidgetKit)·Android(react-native-android-widget) 양쪽에 붙인 뒤, 계정·백업이 필요한 사용자를 위해 선택적 Supabase 동기화를 위에 얹었다.
역량 · 실행 · 전달
검증 (QA 게이트)
저장·번호판 검증·표시 로직·훅에 jest 단위 테스트를 먼저 깔았다. 위젯과 앱이 같은 위치 데이터를 나눠 갖는 지점이 회귀가 가장 나기 쉬운 자리라, 그 상태 동기화를 검증 최우선으로 뒀다.
역량 · 품질 · 리스크
배포
EAS로 스토어 제출을 구성하고 현재 iOS·Android 비공개 테스트 단계. 소개·지원 페이지는 parkpin-app.pages.dev로 공개했다.
역량 · 릴리스
- Tech stack
- React Native (Expo SDK 56)
- TypeScript
- iOS WidgetKit
- react-native-android-widget
- AsyncStorage
- Supabase