| 영역 | 선택 | 기준 |
|---|---|---|
| 앱 런타임 | Expo SDK 56 | CLEVER Routes와 같은 검증 경로 사용 |
| 모바일 프레임워크 | React Native 0.85 | iOS와 Android 단일 코드베이스 |
| UI 런타임 | React 19 | Expo 56 정렬 버전 |
| 언어 | TypeScript 6 strict | 계약과 상태 전이의 정적 검증 |
| 패키지 관리 | npm lockfile | 기존 앱과 같은 설치·CI 흐름 |
| Node.js | 20.19.4 이상 | 기존 앱 엔진 기준 |
| 민감정보 저장 | Expo SecureStore | 추후 승인된 인증 토큰 저장 |
| 배송 증빙 선택 | Expo ImagePicker | 카메라 촬영과 앨범 사진 선택을 Expo SDK에 맞게 처리 |
| 배송 증빙 업로드 | Expo FileSystem + Expo Fetch | 로컬 사진 URI를 File로 변환해 표준 멀티파트 파일로 전송 |
| 전화번호 처리 | libphonenumber-js | 국가번호와 E.164 정규화 |
| 테스트 | Node test runner + tsx | 도메인 테스트를 네이티브 런타임과 분리 |
| 정적 검사 | Expo ESLint + tsc --noEmit |
기존 검증 명령 유지 |
| 지도 | MapLibre React Native 11.3.4 | CLEVER Routes와 같은 네이티브 지도 경로 사용 |
| 지도 스타일 | OpenFreeMap Liberty | Routes의 기본 미리보기 스타일과 정렬 |
| 제스처 | React Native Gesture Handler | 드래그 입력을 네이티브 UI 스레드에서 처리 |
| 애니메이션 | React Native Reanimated + Worklets | React 재렌더 없이 주문 위치를 UI 스레드에서 전환 |
| 배포 준비 | EAS preview/production profiles | 내부 APK와 스토어 빌드 분리 |
- 상태 관리 라이브러리: 실제 공유 상태와 재사용 요구가 없다.
- API 클라이언트 라이브러리: 현재 승인된 인증 호출은 표준
fetch로 충분하다. - 내비게이션 라이브러리: 승인된 두 화면은 최상위 상태 전환으로 충분하다.
- 백그라운드 위치 추적, 경로 계산, 알림: 현재 범위에 포함되지 않는다.
지도 화면은 @maplibre/maplibre-react-native 11.3.4와
https://tiles.openfreemap.org/styles/liberty를 사용한다. 앱은 배송지 좌표로
경로를 계산·보간하거나 직선 연결하지 않는다. 경로 선은 DSV 서버가
OSRM/VWorld로 생성해 응답한 GeoJSON LineString geometry만 수정 없이
MapLibre source에 전달한다. geometry가 없으면 배송지 표식만 표시한다. GPS
전체 지도 화면에서만 사용 중 위치 권한을 요청하고 MapLibre UserLocation의
기본 위치점, 정확도 원과 방향 표시를 사용한다. 순서 편집의 지도 미리보기에서는
위치를 요청하지 않으며 백그라운드 위치 권한과 추적은 사용하지 않는다.
주문 드래그 중에는 React 주문 배열이나 MapLibre source를 변경하지 않는다. Gesture Handler가 입력을 받고 Reanimated shared value가 화면상 주문 위치만 변경한다. 손을 놓은 뒤 최종 위치를 주문 배열에 한 번 반영하며, 지도 마커도 그 확정된 배열로 한 번 갱신한다. 이 규칙은 드래그 중 JS 재렌더와 지도 native source 갱신이 프레임 연속성을 방해하지 않도록 하기 위한 것이다.
비밀번호 검증, 계정 생성, 로그인 세션과 DSV 배송원 연결은 서버가 소유한다.
앱은 승인된 DSV 인증 API 계약에 따라 가입과 로그인 요청을 전송하고, 응답
access token과 계정 정보는 화면 메모리에만 두고, 30일 refresh token과
만료 시각만 Expo SecureStore에 보관한다. 기본 API 주소는
https://clever-route-api.cleversystem.ai이며 EXPO_PUBLIC_DSV_API_BASE_URL로
재정의할 때는 localhost 또는 127.0.0.1 개발 서버를 제외하고 HTTPS여야 한다. 토큰
앱 시작 시 refresh token으로 DSV 세션을 복원하고 access token 만료 1분 전
자동 갱신한다. 로그아웃과 만료 세션은 SecureStore에서 삭제하며
비밀번호와 access token은 영구 저장하지 않는다.
회원가입은 clever-driver://signup?token=... 링크의 일회용 보안 토큰을 서버에서
검증한 경우에만 화면을 연다. 배송원 정보가 없는 초대에서는 가입자가 이름과 휴대전화
번호를 직접 입력하고 서버가 계정과 DSV 배송원을 원자적으로 생성한다. 앱은 시작 URL과 실행 중 URL 이벤트를 모두 처리하지만
토큰을 기기에 저장하거나 자체적으로 가입 권한을 판정하지 않는다. 토큰의 만료·폐기·
일회성 소비와 정확한 DSV 배송원 연결은 서버가 원자적으로 처리한다.
새 패키지는 다음 세 조건을 모두 만족할 때만 추가한다.
- 승인된 사용자 기능에 직접 필요하다.
- Expo 56과의 버전 정합성이 확인된다.
- 표준 라이브러리나 현재 의존성으로 해결할 수 없다.