| ์์ญ | ์ ํ | ๊ธฐ์ค |
|---|---|---|
| ์ฑ ๋ฐํ์ | 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 ์ค๋ ๋์์ ์ ํ |
| Android ๋ฐฐํฌ | ๊ณ ์ Google Drive APK + EAS Google Play AAB | ์ง์ ์ค์น ์ฑ๋๊ณผ Play internal/production ์น๊ฒฉ์ ๋ถ๋ฆฌ |
| iOS ๋ฐฐํฌ | EAS production + TestFlight + Unlisted App Store | ํ์ผ๋ฟ๊ณผ ์ ์ ๋น๊ณต๊ฐ ๋งํฌ ๋ฐฐํฌ๋ฅผ ๋ถ๋ฆฌ |
- ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ์ค์ ๊ณต์ ์ํ์ ์ฌ์ฌ์ฉ ์๊ตฌ๊ฐ ์๋ค.
- API ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ํ์ฌ ์น์ธ๋ ์ธ์ฆ ํธ์ถ์ ํ์ค
fetch๋ก ์ถฉ๋ถํ๋ค. - ๋ด๋น๊ฒ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ์น์ธ๋ ๋ ํ๋ฉด์ ์ต์์ ์ํ ์ ํ์ผ๋ก ์ถฉ๋ถํ๋ค.
- ๋ฐฑ๊ทธ๋ผ์ด๋ ์์น ์ถ์ , ๊ฒฝ๋ก ๊ณ์ฐ, ์๋ฆผ: ํ์ฌ ๋ฒ์์ ํฌํจ๋์ง ์๋๋ค.
- ์น์ฑ๊ณผ PWA: ๋ค์ดํฐ๋ธ ๊ถํยท์ง๋ยท์ฆ๋น ๊ธฐ๋ฅ์ ๋ฐฐํฌ ๋์์ผ๋ก ๋ง๋ค์ง ์๋๋ค.
- iOS Ad Hoc ์ ์ ๋ฐฐํฌ์ Enterprise ๋ฐฐํฌ: ๋ด๋ถ QA๊ฐ ์๋ ๋ฐฐ์ก์ ์ด์ ๊ฒฝ๋ก๋ก ์ฌ์ฉํ์ง ์๋๋ค.
์ง๋ ํ๋ฉด์ @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์
๊ธฐ๋ณธ ์์น์ , ์ ํ๋ ์๊ณผ ๋ฐฉํฅ ํ์๋ฅผ ์ฌ์ฉํ๋ค. ์์ ํธ์ง์ ์ง๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์์๋
์์น๋ฅผ ์์ฒญํ์ง ์์ผ๋ฉฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์น ๊ถํ๊ณผ ์ถ์ ์ ์ฌ์ฉํ์ง ์๋๋ค.
๊ฐ์ ๋ฐฐ์ก์ง ID์ ์ฃผ๋ฌธ์ ์์ ํธ์ง์์ ํ ํ์ผ๋ก ๋ฌถ๋๋ค. ๋ฐฐ์ก์ง ๋๋๊ทธ ์ค์๋ 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์ ์๊ตฌ ์ ์ฅํ์ง ์๋๋ค.
๋น๋ฐ๋ฒํธ ์ฌ์ค์ ์ ๊ด๋ฆฌ์๊ฐ ๋ฐ๊ธํ 30๋ถ ์ ํจ ์ผํ์ฉ HTTPS ๋งํฌ๋ฅผ DSV ์น์์ ์ฌ๋ ๋ฐฉ์์ด๋ค. ์ฑ์ ๋ก๊ทธ์ธ ํ๋ฉด์์ ์ด ๋ฐ๊ธ ๊ฒฝ๋ก๋ง ์๋ดํ๋ฉฐ SMS ์ธ์ฆ, ์ด๊ธฐํ ํ ํฐ ์์ , ์ฌ์ค์ API ํธ์ถ์ ๊ตฌํํ์ง ์๋๋ค. ์ฌ์ค์ ์๋ฃ๋ก ๊ธฐ์กด refresh session์ด ๋ง๋ฃ๋๋ฉด ๊ธฐ์กด ์ธ์ ๋ง๋ฃ ์ฒ๋ฆฌ์ ๋์ผํ๊ฒ SecureStore์ refresh token์ ์ญ์ ํ๋ค.
ํ์๊ฐ์ ์ ๋ก๊ทธ์ธ ํ๋ฉด์ ๋ฒํผ์ผ๋ก ์ง์ ํ๋ค. ์ฑ์ ์ด๋ฆ๊ณผ ํด๋์ ํ ๋ฒํธ๋ฅผ ์๋ฒ์ ๋ณด๋ด๊ณ , ์๋ฒ๊ฐ ๊ฐ์ ์ด๋ฆ๊ณผ ์ ๊ทํ๋ ์ ํ๋ฒํธ๋ฅผ ๊ฐ์ง ํ์ฑยท๋ฏธ์ฐ๊ฒฐ DSV ๋ฐฐ์ก์๋ง ์์์ ์ผ๋ก ์ฐ๊ฒฐํ๋ค. ๊ฐ์ ์์ฒญ์๋ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ก๊ทธ์ธ ์์ด๋ ๋๋ ์ด๋ฉ์ผ ์ฃผ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ํจ๊ป ์ ์กํ๋ฉฐ, ๋ณ๋ ๊ฐ์ ํ ํฐ์ด๋ ์ฃผ๋ฏผ๋ฑ๋ก์ ๋ณด๋ ์์งํ๊ฑฐ๋ ์ ์กํ์ง ์๋๋ค.
์ ํจํค์ง๋ ๋ค์ ์ธ ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํ ๋๋ง ์ถ๊ฐํ๋ค.
- ์น์ธ๋ ์ฌ์ฉ์ ๊ธฐ๋ฅ์ ์ง์ ํ์ํ๋ค.
- Expo 56๊ณผ์ ๋ฒ์ ์ ํฉ์ฑ์ด ํ์ธ๋๋ค.
- ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ฌ ์์กด์ฑ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
๊ธฐ์กด Expo Notifications์ ์ง์ FCM ํ ํฐ๊ณผ route-updates ์ฑ๋์ ์ฌ์ฌ์ฉํ๋ค.
ํ ํฐ ๋ฑ๋ก์ ์๋ฒ tokenId์ ๋์ผํ deviceId๋ก schema-v1 capability๋ฅผ ๋ฑ๋กํ๋ค.
์ธ์ฆ resolver๊ฐ ํ์ฌ ๋ชฉ์ ์ง๋ฅผ ๊ฒฐ์ ํ๋ค. ํด๋ฆญ ๋ณต๊ตฌ์๋ ์๋ฆผ ID์ ๊ณ์ ๋ฐ์ธ๋ฉ๋ง ์ ์ฅํ๋ค.
AsyncStorage๋ ๋ฏธ๋ฐฐ์ก ์ ๋ ฅ ์ด์๊ณผ ์ํ ์์ยท๋ณด๊ณ ๋ช ๋ น์ ID, ๋ฐ์ ์๊ฐ, ๋ณธ๋ฌธ๊ณผ ์ ยท๊ตฌ fence๋ฅผ ์ ์ฅํ๋ค. ์ฌ์๋๋ ํ์ฌ ๊ณ์ ๊ณผ ์๋ฒ context๋ฅผ ๋ค์ ํ์ธํ๋ค. ์๋ฒ ์น์ธ ์ ์๋ ์ฑ๊ณต์ผ๋ก ํ์ํ์ง ์๋๋ค. access token๊ณผ ๋ชฉ์ ์ง ์์ธ๋ ์๊ตฌ ์ ์ฅํ์ง ์๋๋ค. ์ฌ์ง ์คํ๋ผ์ธ ํ๋ ํฌํจํ์ง ์๋๋ค. ์์น ํ์ ๊ณผ 5๋ถ ๋ฐ๋ณต ์๋ฆผ ์์ฝ์ ์๋ฒ ์ฑ ์์ด๋ค. ์ ๋ค์ดํฐ๋ธ ์์น ๊ธฐ๋ฅ์ด๋ ๋ก์ปฌ ์๋ฆผ ํ์ด๋จธ๋ฅผ ์ถ๊ฐํ์ง ์๋๋ค. ์ API ์ฌ์ฉ ์กฐ๊ฑด์ ์ด์ ์๋ฆผ ๋ฌธ์๋ฅผ ๋ฐ๋ฅธ๋ค.