Skip to content

Latest commit

ย 

History

History
175 lines (132 loc) ยท 9.44 KB

File metadata and controls

175 lines (132 loc) ยท 9.44 KB

WayToEarth ์ฝ”๋“œ ๋ฆฌ๋”ฉ ์Šคํ„ฐ๋”” ๋…ธํŠธ (study)

๋ณธ ๋ฌธ์„œ๋Š” ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•™์Šต ํฌ์ธํŠธ๋ฅผ ์ •๋ฆฌํ•œ ๋ฉ”๋ชจ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์†Œ์…œ ๋กœ๊ทธ์ธ(Kakao SDK) ํ๋ฆ„๊ณผ ์‹ค๋ฌด์—์„œ ์ค‘์š”ํ•˜๊ฒŒ ๋ณด๋Š” ๊ตฌํ˜„/์šด์˜ ํฌ์ธํŠธ์— ์ง‘์ค‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์š”

  • ์•ฑ ์„ฑ๊ฒฉ: ๋Ÿฌ๋‹ ํŠธ๋ž˜ํ‚น + ํ”ผ๋“œ/์— ๋ธ”๋Ÿผ/์—ฌ์ • ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๋ชจ๋ฐ”์ผ ์•ฑ(Expo/React Native).
  • ๋„ค์ดํ‹ฐ๋ธŒ/ํ”Œ๋žซํผ: Expo Dev/Build + iOS/Android, Hermes, EAS ์‚ฌ์šฉ.
  • ์ฃผ์š” ๊ธฐ์ˆ ์Šคํƒ: React Navigation, Expo Location, Axios, NativeModules(Kakao), AsyncStorage.
  • ๋ฒ ์ด์Šค URL: utils/api/client.ts โ†’ https://api.waytoearth.cloud.
  • ๋”ฅ๋งํฌ ์Šคํ‚ด: waytoearth:// (app.config.js โ†’ scheme: "waytoearth").

์ฝ”๋“œ ๊ตฌ์กฐ(์š”์ )

  • ํ™”๋ฉด: Pages/ (์˜ˆ: Login.tsx, LiveRunningScreen.tsx, Onboading.tsx ๋“ฑ)
  • ์žฌ์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ: components/ (์˜ˆ: KakaoLoginButton.tsx, Running/โ€ฆ)
  • ํ›…: hooks/ (์˜ˆ: useKakaoLogin.ts, useLiveRunTracker.ts)
  • API ๋ชจ๋“ˆ: utils/api/*.ts (client.ts, auth.ts, running.ts, users.ts, feeds.ts)
  • ์œ ํ‹ธ: utils/geo.ts, utils/run.ts (๊ฑฐ๋ฆฌ, ํŽ˜์ด์Šค ๊ณ„์‚ฐ ๋“ฑ)
  • ํƒ€์ž…: types/types.ts, utils/api/types.ts
  • ์„ค์ •: app.config.js, app.plugin.js, eas.json, tsconfig.json

์†Œ์…œ ๋กœ๊ทธ์ธ(Kakao SDK) ์„ค๊ณ„์™€ ํ๋ฆ„

์ „๋ฐ˜ ํ๋ฆ„

  1. ์‚ฌ์šฉ์ž๊ฐ€ Pages/Login.tsx์—์„œ ์นด์นด์˜ค ๋ฒ„ํŠผ ํƒญ โ†’ useKakaoLogin() ํ˜ธ์ถœ
  2. hooks/useKakaoLogin.ts
    • NativeModules.RNKakaoLogins ๋กœ๋“œ/๊ฒ€์‚ฌ (๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ๊ฐ€์šฉ์„ฑ ํ™•์ธ)
    • ์นด์นด์˜คํ†ก ๋กœ๊ทธ์ธ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ์ฒดํฌ โ†’ ๊ฐ€๋Šฅ ์‹œ login(), ๋ถˆ๊ฐ€ ์‹œ loginWithKakaoAccount()๋กœ ์•ก์„ธ์Šค ํ† ํฐ ํš๋“
    • ์„œ๋ฒ„ ๋กœ๊ทธ์ธ: utils/api/auth.ts์˜ kakaoLoginWithSDK(accessToken) ํ˜ธ์ถœ
  3. kakaoLoginWithSDK
    • Kakao API GET https://kapi.kakao.com/v2/user/me๋กœ kakaoId ํ™•๋ณด
    • ๋ฐฑ์—”๋“œ POST /v1/auth/kakao๋กœ kakaoId, accessToken ์ „๋‹ฌ(๋ชจ๋ฐ”์ผ ํ”Œ๋ž˜๊ทธ ํฌํ•จ)
    • ์‘๋‹ต์—์„œ jwtToken ์ถ”์ถœ(์„œ๋ฒ„ ๋ž˜ํ•‘ ์œ ๋ฌด๋ฅผ ๋ชจ๋‘ ์ปค๋ฒ„)
  4. JWT ์ €์žฅ ๋ฐ ๋ผ์šฐํŒ…
    • AsyncStorage.setItem("jwtToken", โ€ฆ) ์ €์žฅ
    • isOnboardingCompleted์— ๋”ฐ๋ผ Register ๋˜๋Š” LiveRunningScreen์œผ๋กœ ์ด๋™

ํ•ต์‹ฌ ์ฝ”๋“œ ํฌ์ธํŠธ

  • ํ›…: hooks/useKakaoLogin.ts
    • ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ๊ฐ€๋“œ: RNKakao ์กด์žฌ/๋ฉ”์„œ๋“œ ์ฒดํฌ โ†’ ์˜๋ฏธ์žˆ๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ œ๊ณต(๊ฐœ๋ฐœ ๋นŒ๋“œ/APK ์žฌ์„ค์น˜ ์•ˆ๋‚ด ํฌํ•จ)
    • getKeyHash()(Android) ์ง€์› ์‹œ ํ‚คํ•ด์‹œ ํ‘œ์‹œ(๊ฐœ๋ฐœ ํŽธ์˜)
    • ์นด์นด์˜คํ†ก ์„ค์น˜/๊ฐ€์šฉ์„ฑ ๋ถ„๊ธฐ โ†’ login() vs loginWithKakaoAccount() ํด๋ฐฑ
    • ์‹คํŒจ ์‹œ Alert + ์•ˆ์ „ํ•œ logout() ์‹œ๋„
  • API: utils/api/auth.ts
    • Kakao user/me ์žฌ์กฐํšŒ๋กœ kakaoId ์‹ ๋ขฐ์„ฑ ํ™•๋ณด ํ›„ ์„œ๋ฒ„ ๋กœ๊ทธ์ธ ์š”์ฒญ
    • ์„œ๋ฒ„ ์‘๋‹ต์˜ ๋ž˜ํผ({ success, data }) ๋˜๋Š” ์ง์ ‘ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ชจ๋‘ ์ˆ˜์šฉํ•˜๋Š” ์–ธ๋ž˜ํ•‘ ๋กœ์ง
  • ํด๋ผ์ด์–ธํŠธ: utils/api/client.ts
    • ์š”์ฒญ ์ธํ„ฐ์…‰ํ„ฐ: AsyncStorage์˜ JWT๋ฅผ Authorization: Bearer๋กœ ์ž๋™ ์ฃผ์ž…
    • ์‘๋‹ต ์ธํ„ฐ์…‰ํ„ฐ: { success, data, message } ๋ž˜ํผ๋ฅผ ์ž๋™ ์–ธ๋ž˜ํ•‘ โ†’ ๋ชจ๋“ˆ๋ณ„ ์ฝ”๋“œ ๋‹จ์ˆœํ™”
  • ์„ค์ •: app.config.js + app.plugin.js
    • @react-native-seoul/kakao-login ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ, Android ๋นŒ๋“œ ์‹œ Kakao Maven, queries(Android 11+) ๋ฐ kakao_app_key ์ž๋™ ์ฃผ์ž…
    • EAS์—์„œ KAKAO_NATIVE_APP_KEY ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฃผ์ž…

SDK ๋ฐฉ์‹ vs. OAuth ์ฝ”๋“œ(์›น๋ทฐ/๋ฆฌ๋””๋ ‰ํŠธ) ๋ฐฉ์‹

  • ํ˜„์žฌ๋Š” SDK ์ง์ ‘ ๋กœ๊ทธ์ธ ๋ฐฉ์‹(๋„ค์ดํ‹ฐ๋ธŒ KakaoTalk ์•ฑ ๋˜๋Š” ๊ณ„์ • ๋กœ๊ทธ์ธ)์„ ์‚ฌ์šฉ
  • ์žฅ์ : ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(์›ํƒญ), ์•ˆ์ •์ ์ธ ์•ก์„ธ์Šค ํ† ํฐ ํ™•๋ณด, ๋”ฅ๋งํฌ/๋ฆฌ๋””๋ ‰ํŠธ ๋ณต์žก๋„โ†“
  • ๋Œ€์•ˆ์œผ๋กœ kakaoLogin(code, redirectUri) ํ•จ์ˆ˜๋„ ์ค€๋น„๋˜์–ด ์žˆ์œผ๋‚˜ ํ˜„์žฌ ๊ฒฝ๋กœ๋Š” kakaoLoginWithSDK๊ฐ€ ์ฃผ ๊ฒฝ๋กœ

๋””๋ฒ„๊น…/์šด์˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ(์‹ค๋ฌด ์ค‘์š”)

  • ๊ฐœ๋ฐœ ๋นŒ๋“œ ํ•„์ˆ˜: Kakao SDK๋Š” Expo Go๊ฐ€ ์•„๋‹Œ Dev/Production ๋นŒ๋“œ์—์„œ ๋™์ž‘
  • ํ‚คํ•ด์‹œ ๋“ฑ๋ก: Android๋Š” ์ฝ˜์†”์— ์˜ฌ๋ฐ”๋ฅธ KeyHash ๋“ฑ๋ก ํ•„์š”(useKakaoLogin, Login.tsx์—์„œ ๋กœ๊ทธ ํ™•์ธ)
  • Kakao App Key: app.config.js/eas.json์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์—ฐ๊ฒฐ ํ™•์ธ(EAS Secrets ๊ถŒ์žฅ)
  • Android Manifest queries: com.kakao.talk ์กฐํšŒ ์„ค์ •(ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ฒ˜๋ฆฌ)
  • ๋”ฅ๋งํฌ ์Šคํ‚ด: scheme: "waytoearth" ์œ ์ง€, iOS URL Types/Android Intent Filter ๋นŒ๋“œ ํ™•์ธ
  • ์„œ๋ฒ„ ์‘๋‹ต ํฌ๋งท: ์ธํ„ฐ์…‰ํ„ฐ ์–ธ๋ž˜ํ•‘/auth.ts์˜ ๋‹คํ˜•์  ํ‚ค(jwtToken|accessToken|token) ์ปค๋ฒ„ ์—ฌ๋ถ€ ์ ๊ฒ€

๋ณด๊ฐ• ํฌ์ธํŠธ ์ œ์•ˆ(์‹ค๋ฌด ๊ด€์ )

  • ํ† ํฐ ๋ณด๊ด€: AsyncStorage โ†’ ํ•„์š” ์‹œ expo-secure-store/Keychain ์ „ํ™˜ ๊ฒ€ํ† (์œ„ํ˜‘ ๋ชจ๋ธ์— ๋”ฐ๋ผ)
  • ํ† ํฐ ๊ฐฑ์‹ : 401 ์ธํ„ฐ์…‰ํ„ฐ์—์„œ Refresh ํ๋ฆ„ ์ถ”๊ฐ€(์ง€๊ธˆ์€ ์—†์Œ)
  • ๋ชจ๋“ˆ ๋ถ„๋ฆฌ: Kakao SDK ์—๋Ÿฌ์ฝ”๋“œ ๋งคํ•‘/์‚ฌ์šฉ์ž ์นœํ™” ๋ฉ”์‹œ์ง€ ํ…Œ์ด๋ธ”ํ™”
  • ์žฌ์‹œ๋„/๋ฐฑ์˜คํ”„: ์ผ์‹œ ๋„คํŠธ์›Œํฌ ์ด์Šˆ์— ๋Œ€ํ•œ ์•ˆ์ •์„ฑ(ํŠนํžˆ ๋กœ๊ทธ์ธ ์ฒซ ์ง„์ž…)
  • ๋กœ๊น…/ํŠธ๋ž˜ํ‚น: ์‹คํŒจ์œจ, ์—๋Ÿฌ์‚ฌ์œ  ๋Œ€์‹œ๋ณด๋“œํ™”(Sentry/Ampli ๋“ฑ)

๋Ÿฌ๋‹ ํŠธ๋ž˜ํ‚น ์„ค๊ณ„(Expo Location)์™€ ์‹ค๋ฌด ํฌ์ธํŠธ

ํ๋ฆ„๊ณผ ์ฑ…์ž„

  • ํ›…: hooks/useLiveRunTracker.ts
    • ๊ถŒํ•œ ์š”์ฒญ/์ค€๋น„(getForegroundPermissionsAsync, ์ดˆ๊ธฐ ์œ„์น˜ ์บ์‹œ)
    • ์œ„์น˜ ์ŠคํŠธ๋ฆผ ๊ตฌ๋…(watchPositionAsync) + ๋…ธ์ด์ฆˆ ํ•„ํ„ฐ๋ง
    • ๊ฑฐ๋ฆฌ/์†๋„/ํŽ˜์ด์Šค/์นผ๋กœ๋ฆฌ ๊ณ„์‚ฐ(utils/geo.ts, utils/run.ts)
    • ์ฃผ๊ธฐ ์—…๋ฐ์ดํŠธ(์ตœ์†Œ 5์ดˆ ๋˜๋Š” 50m ๋ณ€ํ™”) ์‹œ ์„œ๋ฒ„๋กœ ์ „์†ก(utils/api/running.ts)
    • ์„ธ์…˜ ์ƒ์„ฑ: ์„œ๋ฒ„ ๋ฏธ๊ตฌํ˜„ ์‹œ ๋กœ์ปฌ ์„ธ์…˜(local_โ€ฆ)๋กœ ๋™์ž‘, ์šด์˜ ์ „ ์ œ๊ฑฐ ์ฃผ์„ ์žˆ์Œ
  • ํ™”๋ฉด: Pages/LiveRunningScreen.tsx
    • useLiveRunTracker ์ƒํƒœ/์ œ์–ด(start/pause/resume/stop) ๋ฐ”์ธ๋”ฉ

๋…ธ์ด์ฆˆ/์ •ํ™•๋„ ์ฒ˜๋ฆฌ(์ค‘์š”)

  • ์ •ํ™•๋„ ์ž„๊ณ„์น˜: accuracy > 60m ์ƒ˜ํ”Œ ์ œ์™ธ
  • ์ตœ์†Œ ์ด๋™: ์ •ํ™•๋„ ๊ธฐ๋ฐ˜ ํ•˜ํ•œ(์˜ˆ: max(acc*0.5, 5m)) ๋ฏธ๋งŒ ์ด๋™ ์ œ์™ธ
  • ์ €์†(์ •์ง€ ๊ทผ์ฒ˜) ํ”๋“ค๋ฆผ: speed < 0.6 m/s์—์„œ ๋” ๊ฐ•ํ•œ ์ตœ์†Œ ์ด๋™
  • ์†๋„ ์ŠคํŒŒ์ดํฌ: > 6.5 m/s ๊ตฌ๊ฐ„์€ ๊ฑฐ๋ฆฌ ๋ฐ˜์˜ ์ œ์™ธ(๋‹ฌ๋ฆฌ๊ธฐ ํ•ฉ๋ฆฌ ๋ฒ”์œ„)
  • ๊ฑฐ๋ฆฌ ๋ณด์ •: ์ด์ „/ํ˜„์žฌ ์ •ํ™•๋„์˜ ํ‰๊ท  50%๋ฅผ ๋…ธ์ด์ฆˆ ํ—ˆ์šฉ์น˜๋กœ ์ฐจ๊ฐ ํ›„ ๋ฐ˜์˜

์„ธ์…˜/์—…๋ฐ์ดํŠธ ์ „์†ก

  • ์“ฐ๋กœํ‹€: UPDATE_MIN_MS=5000, UPDATE_MIN_KM=0.05 ๋งŒ์กฑ ์‹œ apiUpdate
  • ์ „์†ก ํŽ˜์ด๋กœ๋“œ: ๋ˆ„์ ๊ฑฐ๋ฆฌ(m), ๊ฒฝ๊ณผ(sec), ํ‰๊ท  ํŽ˜์ด์Šค(sec/km), ์นผ๋กœ๋ฆฌ, currentPoint{lat,lng,sequence,t}
  • ์™„๋ฃŒ ์ „์†ก: apiComplete์—์„œ routePoints ์‹œํ€€์‹ฑ/ํƒ€์ž„์Šคํƒฌํ”„ ๋ณด์ •, endedAt ISO ํ‘œ์ค€ํ™”

์šด์˜์ƒ ๊ณ ๋ ค์‚ฌํ•ญ

  • ๋ฐฐํ„ฐ๋ฆฌ: ์ •ํ™•๋„/์ฃผ๊ธฐ ์กฐ์ •์œผ๋กœ ์†Œ๋ชจ ๊ด€๋ฆฌ(์ •ํ™•๋„ High โ†” Balanced, distanceInterval/timeInterval)
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ: iOS setActivityTypeAsync(Fitness) ์‚ฌ์šฉ ์‹œ ํžŒํŠธ ์ œ๊ณต, ์‹ค์ œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ •์ฑ…์€ ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์— ๋งž์ถฐ ํ…Œ์ŠคํŠธ ํ•„์š”
  • ๊ถŒํ•œ UX: ์‚ฌ์ „ ์•ˆ๋‚ด/๊ฑฐ๋ถ€ ์‹œ ๋Œ€์ฒด UX, ์„ค์ • ์ด๋™ ์•ˆ๋‚ด
  • ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ: ์—…๋กœ๋“œ ์‹คํŒจ ์‹œ ๋กœ์ปฌ ํ/์žฌ์‹œ๋„(ํ˜„์žฌ๋Š” ์กฐ์šฉํžˆ ๋ฌด์‹œ, ๊ฐœ์„  ์—ฌ์ง€)

API/๋„คํŠธ์›Œํ‚น ํŒจํ„ด(์‹ค๋ฌด ๊ด€์ )

  • ์ธํ„ฐ์…‰ํ„ฐ ์–ธ๋ž˜ํ•‘: ๋‹ค์–‘ํ•œ ์„œ๋ฒ„ ์‘๋‹ต ๋ž˜ํผ๋ฅผ ํก์ˆ˜ โ†’ ๋ชจ๋“ˆ ์ฝ”๋“œ ๋‹จ์ˆœ, ํ…Œ์ŠคํŠธ ์šฉ์ด
  • ์—๋Ÿฌ ๋กœ๊น…: [API ERR] ์ƒํƒœ/๋ฐ”๋”” ๋กœ๊น…, ํ•„์š” ์‹œ ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€์™€ ๋ถ„๋ฆฌ๋œ ๋‚ด๋ถ€ ๋กœ๊น… ์ฒด๊ณ„ ๊ถŒ์žฅ
  • ํƒ€์ž… ๋‹คํ˜•์„ฑ ํก์ˆ˜: auth.ts, running.ts๊ฐ€ ์—ฌ๋Ÿฌ ํ‚ค ํ›„๋ณด๋ฅผ ์•ˆ์ „ํžˆ ๋งคํ•‘(๋งˆ์ด๊ทธ๋ ˆ์ด์…˜/์Šค์›จ๊ฑฐ ๋ถˆ์ผ์น˜ ๋Œ€์‘)
  • ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ: utils/api/feeds.ts
    • presign โ†’ S3 PUT โ†’ download/public url ์‚ฌ์šฉ(์šด์˜ ํ‘œ์ค€ ํŒจํ„ด)
    • FileSystem.uploadAsync๋กœ Content-Type/Length ์„ค์ •

๋ณด์•ˆ/์„ค์ • ์ฒดํฌ(์ค‘์š”)

  • .env ๋น„๊ณต๊ฐœ: ํ˜„์žฌ .env์— ํ‚ค ๋…ธ์ถœ๋จ โ†’ ์ฆ‰์‹œ ๋ ˆํฌ ์ œ์™ธ(.gitignore), ํ‚ค ๋กœํ…Œ์ด์…˜, EAS Secrets๋กœ ์ด๊ด€ ๊ถŒ์žฅ
  • HTTPS ๊ณ ์ •: baseURL์€ https, OK
  • ๊ถŒํ•œ ์„ ์–ธ: ์œ„์น˜ ๊ถŒํ•œ์€ Expo๊ฐ€ ๊ด€๋ฆฌํ•˜์ง€๋งŒ, ์•ฑ์Šคํ† ์–ด ์ œ์ถœ ์ „ ํ”Œ๋žซํผ๋ณ„ ์„ค๋ช… ๋ฌธ๊ตฌ/๊ถŒํ•œ ํ•ญ๋ชฉ ์žฌ๊ฒ€์ฆ ํ•„์š”
  • ๋”ฅ๋งํฌ/์Šคํ‚ด: scheme: waytoearth ์œ ์ง€, ์นด์นด์˜ค ์„ค์ •๊ณผ ์ถฉ๋Œ ์—†๋Š”์ง€ ํ™•์ธ

๊ฐœ์„  ๋กœ๋“œ๋งต ์ œ์•ˆ

  • ์ธ์ฆ
    • Refresh ํ† ํฐ ํ๋ฆ„ + 401 ์ž๋™ ์žฌ๋ฐœ๊ธ‰/์žฌ์‹œ๋„
    • ํ† ํฐ ์ €์žฅ์†Œ ๋ณด์•ˆ ๋ ˆ๋ฒจ ์ƒํ–ฅ(ํ•„์š” ์‹œ SecureStore)
  • ํŠธ๋ž˜ํ‚น ์•ˆ์ •ํ™”
    • ์—…๋กœ๋“œ ์‹คํŒจ ํ์ž‰/์žฌ์‹œ๋„(๋ฐฑ์˜คํ”„), ์˜คํ”„๋ผ์ธ ์ผ๊ด„ ๋™๊ธฐํ™”
    • ๋ฐฐํ„ฐ๋ฆฌ/์ •ํ™•๋„ ํ”„๋กœํŒŒ์ผ ํ”„๋ฆฌ์…‹(์ ˆ์•ฝ/๊ท ํ˜•/์ •๋ฐ€)
  • DX/๊ด€์ธก์„ฑ
    • ์—๋Ÿฌ/์ด๋ฒคํŠธ ๋กœ๊น… ํ‘œ์ค€ํ™”(Sentry), ์ฃผ์š” ํผ๋„(๋กœ๊ทธ์ธ/์„ธ์…˜์‹œ์ž‘/์™„๋ฃŒ) ์ง€ํ‘œํ™”
    • Jest + RNTL ๊ธฐ๋ณธ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€(ํ›… ๋‹จ์œ„: useKakaoLogin, useLiveRunTracker)
  • ์ฝ”๋“œ ์ •๋ˆ
    • utils/api/weather.ts์˜ callOrMock ๋“ฑ ๋ฏธ์ •์˜ ์œ ํ‹ธ ๊ฒ€ํ† /์ •๋ฆฌ
    • NativeWind ๋„์ž…๋ฒ”์œ„ ํ™•๋Œ€ ์‹œ className ์ผ๊ด€ ์ ์šฉ

๋น ๋ฅธ ๋ ˆํผ๋Ÿฐ์Šค(ํŒŒ์ผ ๊ฒฝ๋กœ)

  • Kakao ๋กœ๊ทธ์ธ ํ›…: hooks/useKakaoLogin.ts
  • ๋กœ๊ทธ์ธ ํ™”๋ฉด: Pages/Login.tsx
  • ์ธ์ฆ API: utils/api/auth.ts, ํด๋ผ์ด์–ธํŠธ utils/api/client.ts
  • ๋Ÿฌ๋‹ ํ›…: hooks/useLiveRunTracker.ts
  • ๋Ÿฌ๋‹ API: utils/api/running.ts
  • ๊ฑฐ๋ฆฌ/ํŽ˜์ด์Šค ์œ ํ‹ธ: utils/geo.ts, utils/run.ts
  • Kakao ์„ค์ •: app.config.js, app.plugin.js, eas.json

ํ•„์š” ์‹œ ์œ„ ํ•ญ๋ชฉ ์ค‘ ์›ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋” ๊นŠ๊ฒŒ ํ™•์žฅํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์งˆ๋ฌธ์ด์—์š”. โ€œ์„ธ์„ธํ•˜๊ฒŒโ€๋Š” ๋งž์ง€๋งŒ, ํŒŒ์ผ ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ โ€œ์˜๋„ ๋‹จ์œ„(ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ ๋ณ€ํ™”)โ€๋กœ ์ชผ๊ฐœ๋Š” ๊ฒŒ ๋ฒ ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๊ฐ ์ปค๋ฐ‹์€ ๋‹ค์Œ์„ ๋งŒ์กฑํ•˜๋ฉด ์ข‹์•„์š”:

  • ๋นŒ๋“œ/ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•œ๋‹ค.
  • ํ•˜๋‚˜์˜ ๋ชฉ์ ๋งŒ ๋‹ด๋Š”๋‹ค(๊ธฐ๋Šฅ ์ถ”๊ฐ€, ๋ฒ„๊ทธ ์ˆ˜์ •, ๋ฆฌํŒฉํ„ฐ ๋“ฑ).
  • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋งŒ ์ฝ์–ด๋„ ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•˜๋‹ค.
  • PR์—์„œ๋Š” ํ•„์š”์‹œ ์Šค์ฟผ์‹œ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋กœ์ปฌ ํžˆ์Šคํ† ๋ฆฌ๋Š” ์˜๋ฏธ ์žˆ๊ฒŒ ๋‚จ๋Š”๋‹ค.