meeeter / frontend

A hyper-local mobile app leveraging the w3w coordinate system for precise, real-time location sharing between friends

Home Page:https://testflight.apple.com/join/nrlNSHda

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

๐Ÿ“ meeter

Meeter

meet within meters, meeter ๋Š” w3w ์ขŒํ‘œ์ฒด๊ณ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ, ๋‚˜์™€ ์นœ๊ตฌ์˜ ์ •ํ™•ํ•œ ์œ„์น˜๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜์ดํผ๋กœ์ปฌ ๋ชจ๋ฐ”์ผ ์•ฑ์ž…๋‹ˆ๋‹ค.


๐ŸŽฌ Preview

๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ + ์ตœ์ดˆ ์ง€๋„ ํ™”๋ฉด ์นœ๊ตฌ ์ถ”๊ฐ€ ๋ฐ ์š”์ฒญ ๊ด€๋ฆฌ
login-and-initial-map friends-tab

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง ์นœ๊ตฌ 4๋ช…์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์œ„์น˜๋ฅผ ๊ณต์œ ํ•œ๋‹ค๋ฉด?

์‚ฌ์šฉ์ž 1 ์‚ฌ์šฉ์ž 2 ์‚ฌ์šฉ์ž 3 ์‚ฌ์šฉ์ž 4
map-bkkim map-nykwak map-jslee map-swjun

๐Ÿšจ ์ •๋ฐ€ํ•œ w3w ์œ„์น˜๊ฐ’ ํ™œ์šฉ (๊ธด๊ธ‰์‹ ๊ณ , ์œ„์น˜๊ณต์œ )

112 ยท 119 ๊ธด๊ธ‰์‹ ๊ณ  ์นด์นด์˜ค๋งต ์œ„์น˜๊ณต์œ 
w3w-emergency w3w-share

๐Ÿค  Try It Out

์œ„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ํฅ๋ฏธ๋กœ์šฐ์…จ๋‚˜์š”?

iPhone์„ ์‚ฌ์šฉํ•˜์‹ ๋‹ค๋ฉด, ์ด Apple TestFlight ๋งํฌ๋ฅผ ํ†ตํ•ด meeter๋ฅผ ์ง์ ‘ ์ฒดํ—˜ํ•ด๋ณด์„ธ์š”!

Apple TestFlight๋กœ meeter ์ฒดํ—˜ํ•˜๊ธฐ

  • Apple TestFlight๋Š” iOS ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ๋œ ์•ฑ์ด App Store์— ์ •์‹ ์ถœ์‹œ๋˜๊ธฐ ์ „์—, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ๋ฒ ํƒ€ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Apple์ด ์ œ๊ณตํ•˜๋Š” ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.
  • TestFlight์— ๊ฒŒ์‹œ๋˜๋Š” ๋ฒ ํƒ€ ๋นŒ๋“œ ๋˜ํ•œ Apple์˜ ๊ผผ๊ผผํ•œ ๊ฒ€์ˆ˜๋ฅผ ๋ฐ›๊ธฐ์—, ์•ˆ์‹ฌํ•˜๊ณ  ๋‹ค์šด๋ฐ›์•„ ์‚ฌ์šฉํ•˜์…”๋„ ๋ผ์š”.
  • ์ต๋ช…์˜ ๋ฒ ํƒ€ ํ…Œ์Šคํ„ฐ๋กœ ์ฐธ๊ฐ€ํ•˜์‹œ๊ฒŒ ๋˜๋ฉฐ, ์•ฑ ํ˜ธํ™˜์„ฑ ๊ฒ€ํ† ๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๊ธฐ๊ธฐ์ •๋ณด๋ฅผ ์ œ์™ธํ•œ ๊ทธ ์–ด๋– ํ•œ ๊ฐœ์ธ์ •๋ณด๋„ ์ˆ˜์ง‘๋˜์ง€ ์•Š์•„์š”.
  • meeter๋Š” ํ˜„์žฌ ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ์ง€์›ํ•˜๊ณ  ์žˆ์–ด์š”. ๋งŒ์•ฝ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์ด ๋ถˆํŽธํ•˜์‹œ๋‹ค๋ฉด, ์ด ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. Apple ์‹ฌ์‚ฌ ํŒ€์—์„œ๋„ ์ด ๊ณ„์ •์ •๋ณด๋ฅผ ํ™œ์šฉํ•ด์„œ ์•ฑ์„ ํ…Œ์ŠคํŠธํ–ˆ๋‹ต๋‹ˆ๋‹ค.
  • ๋ฒ ํƒ€ ํ…Œ์ŠคํŠธ ๋„์ค‘ ๋ฌธ์ œ๋‚˜ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ์„ ๋•Œ, ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์Šคํฌ๋ฆฐ์ƒท๊ณผ ํ•จ๊ป˜ ํ”ผ๋“œ๋ฐฑ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋ณด๋‚ด์ฃผ์‹  ํ”ผ๋“œ๋ฐฑ์€ ์„ธ์‹ฌํ•˜๊ฒŒ ๊ฒ€ํ† ํ•ด์„œ, ๋‹ค์Œ ๋นŒ๋“œ์— ์ตœ๋Œ€ํ•œ ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ์–ด์š”.


Android ํœด๋Œ€ํฐ์„ ์‚ฌ์šฉํ•˜์‹œ๊ฑฐ๋‚˜ ์ง€๊ธˆ ๋‹น์žฅ์€ ์ฒดํ—˜์ด ์–ด๋ ต๋‹ค๋ฉด, ์‹œ์—ฐ์ด ํฌํ•จ๋œ 5๋ถ„ ๋‚ด์™ธ์˜ meeter ๋ฐœํ‘œ ์˜์ƒ์„ ๋ณด์‹ค ์ˆ˜๋„ ์žˆ์–ด์š” ๐Ÿ˜‰

Demo Preview


๐Ÿ“– Table of Contents


๐ŸŽจ Tech Stack

  • React Native
  • Expo
  • Zustand
  • Socket.IO
  • Apple MapKit JS
  • Node.js
  • Express
  • MongoDB
  • Apple TestFlight
  • AWS Elastic Beanstalk

๐Ÿง Why React Native + Expo

React Native๋Š” Flutter๊ณผ ๋”๋ถˆ์–ด ๋„๋ฆฌ ์“ฐ์ด๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ, ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์•ฑ ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. React์— ์ต์ˆ™ํ•œ ์ œ๊ฐ€ ๋ชจ๋ฐ”์ผ ์•ฑ์„ ๋งŒ๋“ค๊ณ ์ž ํ–ˆ์„ ๋•Œ, React Native๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป๊ฒŒ ๋ณด๋ฉด ๋‹น์—ฐํ•œ ์ˆ˜์ˆœ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์›น ํ™˜๊ฒฝ๊ณผ ํ˜„์ €ํžˆ ๋‹ค๋ฅธ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ, ๊ทธ ๊ณ ์œ ์˜ UI/UX๋ฅผ ๊ณ ๋ คํ•˜๋ฉฐ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝํ—˜์€ ๋งค์šฐ ์‹ ์„ ํ•˜๊ณ  ํฅ๋ฏธ๋กœ์› ์Šต๋‹ˆ๋‹ค.

Expo

Expo๋Š” ๋‹จ์—ฐ์ฝ” React Native๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ์ตœ๊ณ ์˜ ํ”Œ๋žซํผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ํ™˜๊ฒฝ ์„ธํŒ…๋ถ€ํ„ฐ ๋ผ์šฐํŒ…, ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ๊นŒ์ง€ โ€” ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ž์ฒด์— ํ•„์ˆ˜์ ์ด์ง€ ์•Š์€ ๊ฐ์ข… ์š”์†Œ๋“ค์ด ์ถ”์ƒํ™”๋˜์–ด ์žˆ๋Š” Expo ๋•๋ถ„์— ๊ฐœ๋ฐœ๊ณผ ์ตœ์ ํ™”์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์œ ์ผํ•œ ๋‹จ์ ์€ Expo์— ๋Œ€ํ•œ ์˜์กด์„ฑ์ด ์ƒ๋‹นํžˆ ๋†’์•„์ง„๋‹ค๋Š” ์ ์ธ๋ฐ (์‹ค์ œ๋กœ ์˜์กด์„ฑ ํŒจํ‚ค์ง€์˜ ์ ˆ๋ฐ˜ ์ด์ƒ์ด Expo ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค), Expo๋Š” ๋น ๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธ ๋˜๊ณ  ์•ˆ์ •์ ์œผ๋กœ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ๊ณ„์ด๋ฉฐ, React Native ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋„ Expo๋กœ ์•ฑ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ์„ ๋งŒํผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ์ œ๊ฐ€ meeter๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ–ˆ๋˜, Expo๊ฐ€ ์ง€์›ํ•˜๋Š” ์ฃผ์š”๊ธฐ๋Šฅ๋“ค์ž…๋‹ˆ๋‹ค.

  • create-expo-app ์‚ฌ์šฉ์œผ๋กœ React Native CLI๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ดˆ๊ธฐ ๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ค์ •
  • expo-router ์œผ๋กœ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์— ๋”์šฑ ์ง๊ด€์ ์ธ file-based routing ๊ตฌํ˜„
  • Expo Go ๋ชจ๋ฐ”์ผ ์•ฑ์œผ๋กœ HMR ๊ธฐ๋ฐ˜์˜ ์‹ ์†ํ•œ ์•ฑ ํ…Œ์ŠคํŒ…์ด ๊ฐ€๋Šฅ
  • Expo Prebuild ๋ฅผ ํ†ตํ•ด Expo SDK ์ƒํƒœ๊ณ„์—์„œ ํ™•์žฅํ•˜์—ฌ, ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ๋ฌธ์ œ์—†์ด ๊ฒฐํ•ฉํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ. ์‹ค์ œ๋กœ OAuth ๊ธฐ๋ฐ˜์˜ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ๊ตฌํ˜„ํ•  ๋•Œ Expo Prebuild๊ฐ€ ๋งค์šฐ ์œ ์šฉํ–ˆ์Œ
  • EAS Build๋ฅผ ํ†ตํ•ด ์•ฑ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋นŒ๋“œํ•˜๊ณ , EAS Submit์„ ํ†ตํ•ด App Store ๋ฐ Play Store์— ์†์‰ฝ๊ฒŒ ๋ฐฐํฌํ•˜๋ฉฐ, ๋ฐฐํฌ ํ›„์—๋Š” EAS Update๋ฅผ ํ†ตํ•ด ๋งˆ์ด๋„ˆ ํŒจ์น˜์˜ ๊ฒฝ์šฐ ์Šคํ† ์–ด ์‹ฌ์‚ฌ ์—†์ด๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ship ํ•˜๋Š” Over-The-Air ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿง Why Zustand

ํ”„๋กœ์ ํŠธ ๊ธฐ๋Šฅ๊ณผ ํŠน์„ฑ, ๊ฐœ๋ฐœ๊ธฐ๊ฐ„์„ ๊ณ ๋ คํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํƒœ๊ด€๋ฆฌ ํˆด ์„ ํƒ๊ธฐ์ค€์„ ์„ธ์› ๊ณ , ๊ฐ€์žฅ ์ ํ•ฉํ•œ Zustand๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Redux๋ณด๋‹ค ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์ ˆ๋Œ€์ ์ธ ์ฝ”๋“œ ์–‘์ด ์ ์œผ๋ฉฐ, ์‚ฌ์šฉ์ด ์ง๊ด€์ ์ด๊ณ , ํŒจํ‚ค์ง€ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ž‘์•„์•ผ ํ•จ
  • ์ดํ›„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์œ„์น˜ ๊ถŒํ•œ ๋ฐ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ, ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ๋„ ์ƒํƒœ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ
  • ํ˜„์žฌ ์œ„์น˜์ •๋ณด๋Š” ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๋กœ๋งŒ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๊ณ , ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์Œ
  • npm trend ๋“ฑ์—์„œ ์ฃผ๊ฐ„ ์‚ฌ์šฉ์ž ์ˆ˜๊ฐ€ ๋งŽ์•„์•ผ ํ•˜๋ฉฐ, ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€๋ณด์ˆ˜๋˜๊ณ  ์žˆ๋Š” ํŒจํ‚ค์ง€์—ฌ์•ผ ํ•จ

๐ŸŽข Challenges

์‹ค์‹œ๊ฐ„ ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃฐ๊นŒ?

์œ„์น˜ ๋ฐ์ดํ„ฐ๋งŒํผ์ด๋‚˜ ๊ทธ ์ •ํ™•๋„์™€ ์‹ค์‹œ๊ฐ„์„ฑ์ด ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„๊นŒ์š”? ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์„œ๋น„์Šค์ธ ๋‚ด๋น„๊ฒŒ์ด์…˜๋งŒ ์ƒ๊ฐํ•ด ๋ณด์•„๋„, ์œ„์น˜ ๋ฐ์ดํ„ฐ๋Š” ์–ผ๋งˆ๋‚˜ ์‹ค์‹œ๊ฐ„์— ๊ฐ€๊น๊ฒŒ, ์–ผ๋งˆ๋‚˜ ์ ์€ ์˜ค์ฐจ๋กœ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€์— ๋”ฐ๋ผ ๊ทธ ๊ฐ€์น˜๊ฐ€ ์ขŒ์šฐ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋‚˜์™€ ๋‚ด ์นœ๊ตฌ์˜ ์œ„์น˜๋ฅผ ์ง€๋„์— ํ‘œ์‹œํ•ด์ค€๋‹ค โ€” ๋ผ๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์•ฝ์†ํ•œ meeter ์•ฑ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์‹ค์‹œ๊ฐ„ ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ค„์•ผ ํ• ๊นŒ์š”? ์ด์ƒ์ ์œผ๋กœ๋Š”, meeter ์•ฑ์ด ์ผœ์ ธ ์žˆ๋Š” ๋‚ด๋‚ด GPS๋กœ ๋‚ด ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์„œ, ์ƒˆ๋กœ์šด ์œ„์น˜๊ฐ’์ด ํ™•์ธ๋ ๋•Œ๋งˆ๋‹ค ์œ„์น˜ ๋งˆ์ปค๋ฅผ ์ƒˆ๋กœ์ด re-rendering ํ•˜๊ณ , ๋™์‹œ์— ๋‚ด ๋ชจ๋“  ์นœ๊ตฌ๋“ค์—๊ฒŒ ์†Œ์ผ“์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์œ„์น˜๊ฐ’์„ ์•Œ๋ ค์ฃผ๋ฉด ๋˜๊ฒ ์ฃ .

ํ•˜์ง€๋งŒ ํ˜„์‹ค์€ ๋…น๋ก์น˜ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์•ฑ ์‚ฌ์šฉ ๋‚ด๋‚ด GPS๋กœ ๋‚ด ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค๋ฉด, ์œ„์น˜๊ฐ€ ๋”ฑํžˆ ๋ณ€ํ•˜์ง€ ์•Š์•„๋„ GPS๋Š” ๊ณ„์†ํ•ด์„œ ํœด๋Œ€ํฐ ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•˜๊ณ  ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ •๋ง ์ž๊ทธ๋งˆํ•œ ์›€์ง์ž„์—๋„ ์ƒˆ๋กœ์šด ์œ„์น˜๊ฐ’์„ ์นœ๊ตฌ๋“ค์—๊ฒŒ ์†Œ์ผ“์œผ๋กœ ์ „์†กํ•œ๋‹ค๋ฉด, ์†Œ์ผ“ ๋ถ€ํ•˜๊ฐ€ ์ƒ๋‹นํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ meeter ์•ฑ์„ 100๋ช…, 1000๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ์ด ๋ถ€ํ•˜๋Š” ์„œ๋น„์Šค ์•ˆ์ •์„ฑ์— ์น˜๋ช…์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ์‹ค์‹œ๊ฐ„ ์œ„์น˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ณผ์ •์„ 2๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ์ •์˜ํ–ˆ๊ณ , ๋‹จ๊ณ„๋ณ„๋กœ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ธฐ๊ธฐ๊ฐ€ GPS๋ฅผ ์‚ฌ์šฉํ•ด ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๊ณผ์ •
  2. ๊ฐฑ์‹ ๋œ ์ƒˆ๋กœ์šด ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ์ผ“๊ณผ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” ๊ณผ์ •

GPS ์œ„์น˜์„ผ์„œ๋Š” ๋ฐฐํ„ฐ๋ฆฌ ๋„๋‘‘ ๐Ÿชซ

์‚ฌ์‹ค ์ €๋„ ๊ฐœ๋ฐœ ํ›„ ๋ฒ ํƒ€ ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„์—์„œ์•ผ ์ด ์ ์„ ์ฒด๊ฐํ–ˆ๋Š”๋ฐ์š”, GPS๋Š” ์Šค๋งˆํŠธํฐ ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์ถฉ๊ฒฉ์ ์œผ๋กœ ๋งŽ์ด ์†Œ๋ชจํ•ฉ๋‹ˆ๋‹ค.

Nonetheless, even with A-GPS, using your GPS is a noticeable battery hog. This is again due not to powering the GPS itself, but by preventing the phone from going to sleep. Compounding the cost, most mapping software is processor-intense. A well-designed app can make a significant difference here; Google Maps boasts several optimizations to reduce battery consumption from GPS usage.

โ€” Robert Love, Senior Director of Engineering at Google Cloud Platform, on "Why does GPS use so much more battery than any other antenna or sensor in a smartphone?" asked on Quora

์œ„ ๋‹ต๋ณ€์—์„œ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ, GPS๋Š” ๊ทธ ํŠน์œ ์˜ ๋งค์šฐ ๋Š๋ฆฐ ํ†ต์‹  ์†๋„์™€, ๊ธฐ๊ธฐ๋ฅผ ์ž ๋“ค์ง€(sleep) ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ํŠน์„ฑ ๋•Œ๋ฌธ์— ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ์‚ฌ์‹ค์— ์Šฌํผํ•˜๋ฉด์„œ๋„, ์ €๋Š” ๋™์‹œ์— ๋‹ต๋ณ€์˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์žฅ์— ์ฃผ๋ชฉํ–ˆ์Šต๋‹ˆ๋‹ค: ์ž˜ ๋””์ž์ธ๋œ ์•ฑ์€ ํš๊ธฐ์ ์ธ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Google Maps๋Š” GPS ์‚ฌ์šฉ์— ๋”ฐ๋ฅธ ๋ฐฐํ„ฐ๋ฆฌ ์†Œ๋ชจ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์ตœ์ ํ™” ๊ธฐ์ˆ ์„ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  meeter ์•ฑ์ด ๊ตฌ๊ธ€ ๋งต ์ˆ˜์ค€์˜ ์ตœ์ ํ™”๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆœ ์—†๊ฒ ์ง€๋งŒ, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์œ„์น˜ ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์น˜๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ GPS ์‚ฌ์šฉ์„ ์ตœ๋Œ€ํ•œ ์ค„์ผ ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.


๊ธฐ๊ธฐ๊ฐ€ ์›€์ง์˜€์„ ๋•Œ๋งŒ GPS๋ฅผ ์‚ฌ์šฉํ•˜์ž

GPS ์‚ฌ์šฉ์„ ์ตœ๋Œ€ํ•œ ์ค„์ธ๋‹ค๋Š” ๊ฒƒ์€ ๊ณง, ๊ผญ ํ•„์š”ํ• ๋•Œ๋งŒ GPS๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ GPS ์‚ฌ์šฉ์ด ๊ผญ ํ•„์š”ํ•  ๋•Œ๋Š” ์–ธ์ œ์ผ๊นŒ์š”? ์‚ฌ์šฉ์ž์˜ ์œ„์น˜๊ฐ€ ๋ฐ”๋€Œ๋ฉด, ๊ทธ ์ƒˆ๋กœ์šด ์œ„์น˜์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด GPS๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์—, ์‚ฌ์šฉ์ž์˜ ๊ธฐ๊ธฐ๋Š” ๊ฐ€๋งŒํžˆ ์žˆ๋Š”๋ฐ GPS๋งŒ ๊ณ„์†ํ•ด์„œ ์œ„์น˜๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์€ ํ”ผํ•ด์•ผ ํ•˜์ฃ .

ํ•˜์ง€๋งŒ ์—ญ์„ค์ ์ด๊ฒŒ๋„, ๊ธฐ๊ธฐ๊ฐ€ ์›€์ง์˜€๋Š”์ง€๋ฅผ ์•Œ๋ ค๋ฉด ๊ฒฐ๊ตญ GPS๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๋“ฏ ํ–ˆ์Šต๋‹ˆ๋‹ค. GPS๋กœ ๋ฐ›์•„ ์˜จ ์กฐ๊ธˆ ์ „์˜ ์œ„์น˜์™€ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋น„๊ตํ•˜์—ฌ ๊ธฐ๊ธฐ๊ฐ€ ์›€์ง์˜€๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์‹ฌ์ง€์–ด React Native Community์—์„œ ์ œ๊ณตํ•˜๋Š” Geolocation API ๋˜ํ•œ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ๊ฐ€ ์›€์ง์˜€๋Š”์ง€๋ฅผ ํŒ๋ณ„ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ GPS๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ์˜ ์›€์ง์ž„์„ ํƒ์ง€ํ•˜๊ฒ ๋‹ค๋Š” ์‹œ๋„๋Š” ์• ์ดˆ์— ๋ง์ด ์•ˆ๋˜๋Š” ๋“ฏ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ ์ˆœ๊ฐ„, iPhone์˜ ๋‘ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ๋“ค์ด ์ œ ๋‡Œ๋ฆฌ๋ฅผ ์Šค์ณค์Šต๋‹ˆ๋‹ค. iPhone์€ GPS ์œ„์น˜์„ผ์„œ๊ฐ€ ๊บผ์ ธ ์žˆ์–ด๋„, ์‚ฌ์šฉ์ž๊ฐ€ ๊ตํ†ต์‚ฌ๊ณ ๋ฅผ ๋‹นํ–ˆ๋Š”์ง€, ๋˜๋Š” ์šด์ „์ค‘์ธ์ง€๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ GPS ์—†์ด ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž์˜ ์›€์ง์ž„์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

iPhone Features

So how does this technology work? The new iPhone models, along with the Watch Series 8 and Ultra, have a 3-axis gyroscope and a high G-4 accelerometer, which samples motion at over 3000 times a second. It means that when a car is going really fast and then abruptly stops or slows down, it's able to sense the precise moment of impact, or the change in that motion.

โ€” The Wall Street Journal, Does Apple's Crash Detection Work? We Totaled Some Cars To Find Out.

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

์ด ์ ์— ์ฐฉ์•ˆํ•ด์„œ, meeter๋Š” ๊ฐ€์†๋„์„ผ์„œ์˜ ์ž‘๋™์„ ๊ณง ์‚ฌ์šฉ์ž์˜ ์›€์ง์ž„์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ , ๋น„๋กœ์†Œ GPS ์œ„์น˜์„ผ์„œ๋ฅผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ธฐ๊ธฐ๊ฐ€ ํ™•์‹คํžˆ ์›€์ง์˜€์„ ๋•Œ๋งŒ GPS๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„ํ•˜์—ฌ, ๋ถˆํ•„์š”ํ•œ GPS ์ž‘๋™์„ ๋ง‰๊ณ  ๊ธฐ๊ธฐ ์„ฑ๋Šฅ๊ณผ ๋ฐฐํ„ฐ๋ฆฌ ํšจ์œจ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.


๋„ค์ดํ‹ฐ๋ธŒ ๊ธฐ๊ธฐ๊ฐ€ ๊ฐ€์†๋„ ๊ฐ’์„ ์ œ๊ณตํ•˜๊ธด ํ•˜๋Š”๋ฐ.. ๐Ÿค”

๊ทธ๋Ÿผ ๋„ค์ดํ‹ฐ๋ธŒ ๊ธฐ๊ธฐ์˜ ๊ฐ€์†๋„์„ผ์„œ ์ธก์ •๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? Apple์€ Core Motion ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ์ผ๋ฐ˜ ๊ฐ€์†๋„ ๊ฐ’(raw acceleration)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Apple Accelerometer

์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด, ๊ฐ€์†๋„์„ผ์„œ๋Š” x, y, z 3์ฐจ์› ์ถ•์„ ๋”ฐ๋ผ ์ž‘์šฉํ•˜๋Š” ๊ฐ€์†๋„ ์ธก์ •๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์ด๋ฅผ ์ด์šฉํ•˜๋Š” Expo์˜ expo-sensors ๋ฅผ ํ†ตํ•ด ์ผ๋ฐ˜ ๊ฐ€์†๋„ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ํ™”๋ฉด์€ ์ œ๊ฐ€ ํœด๋Œ€ํฐ์„ ํ‰ํ‰ํ•œ ์ฑ…์ƒ ์œ„์— ๊ฐ€๋งŒํžˆ ๋†“๊ณ  ์ธก์ •ํ•œ ์ผ๋ฐ˜ ๊ฐ€์†๋„ ๊ฐ’์ž…๋‹ˆ๋‹ค.

Raw Acceleration

๊ทธ๋Ÿฐ๋ฐ ๋ญ”๊ฐ€ ์ด์ƒํ•˜์ง€ ์•Š๋‚˜์š”? ๊ธฐ๊ธฐ๋Š” x, y, z์ถ• ์–ด๋–ค ๋ฐฉํ–ฅ์œผ๋กœ๋„ ์›€์ง์ด์ง€ ์•Š๊ณ  ์žˆ๋Š”๋ฐ, z์ถ• ๊ฐ€์†๋„ ๊ฐ’์€ -1๋กœ ์ˆ˜๋ ดํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๋Š” ๋ฐ”๋กœ ๊ฐ€์†๋„ ์„ผ์„œ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ผ๋ฐ˜ ๊ฐ€์†๋„ ๊ฐ’์ด ์ง€๊ตฌ๊ฐ€ ๊ธฐ๊ธฐ๋ฅผ ๋Œ์–ด๋‹น๊ธฐ๋Š” ์ค‘๋ ฅ ๋˜ํ•œ ๊ธฐ๊ธฐ์— ์ ์šฉ๋˜๋Š” '์›€์ง์ž„'์ด๋ผ๊ณ  ๊ฐ„์ฃผํ•ด์„œ, ์ค‘๋ ฅ์ด ์ž‘์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ 1g = 9.81m/s^2 ๋งŒํผ์˜ ๊ฐ’์„ ํ•ญ์ƒ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ™”๋ฉด์„ ์œ„๋กœ ํ•œ ์ฑ„๋กœ ํ‰ํ‰ํ•œ ์ฑ…์ƒ ์œ„์— ๋‘” ์ œ ํœด๋Œ€ํฐ์—๋Š” -z์ถ• ๋ฐฉํ–ฅ์œผ๋กœ 1g๋งŒํผ ์ค‘๋ ฅ์ด ์ž‘์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ , ๊ทธ๋ž˜์„œ z์ถ• ์ผ๋ฐ˜ ๊ฐ€์†๋„ ๊ฐ’์€ -1๋กœ ๋‚˜ํƒ€๋‚ฌ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ €๋Š” ์ค‘๋ ฅ์ด ์ž‘์šฉํ•˜๋Š” ๋ฐฉํ–ฅ๊ณผ ๊ด€๊ณ„์—†์ด ์ˆœ์ˆ˜ ์‚ฌ์šฉ์ž์˜ ์›€์ง์ž„๋งŒ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ๊ธฐ์˜ ๊ฐ€์†์„ ์ธก์ •ํ•ด์•ผ ํ•˜๊ธฐ์—, ์ผ๋ฐ˜ ๊ฐ€์†๋„ ๊ฐ’์—์„œ ์ค‘๋ ฅ์˜ ์˜ํ–ฅ์„ ์ œ๊ฑฐํ•œ ์„ ํ˜• ๊ฐ€์†๋„ ๊ฐ’์„ ๊ตฌํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.


์ผ๋ฐ˜ ๊ฐ€์†๋„ ๊ฐ’์„ ์„ ํ˜• ๊ฐ€์†๋„ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

์ผ๋ฐ˜ ๊ฐ€์†๋„ ๊ฐ’์€ ๋‰ดํ„ด์˜ ์ œ2๋ฒ•์น™์ธ ๊ฐ€์†๋„์˜ ๋ฒ•์น™ $F = ma$ ๋กœ๋ถ€ํ„ฐ ์ถœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ $F$ ๋Š” ์•Œ์งœํž˜(ํ•ฉ๋ ฅ), ์ฆ‰ ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์ž‘์šฉํ•˜๋Š” ํž˜, $m$ ์€ ์งˆ๋Ÿ‰, $a$ ๋Š” ๊ฐ€์†๋„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ณต์‹์„ ํ™œ์šฉํ•ด์„œ ๋„ค์ดํ‹ฐ๋ธŒ ๊ธฐ๊ธฐ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ผ๋ฐ˜ ๊ฐ€์†๋„ ๊ฐ’์„ ์ •์˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$$A_D = -\frac{1}{m} \sum F_S - g$$

์—ฌ๊ธฐ์„œ $A_D$ ๋Š” ๊ธฐ๊ธฐ์— ์ž‘์šฉํ•˜๋Š” ๊ฐ€์†๋„ (Acceleration on Device), $m$ ์€ ์งˆ๋Ÿ‰, $F_S$ ๋Š” ๊ฐ€์†๋„ ์„ผ์„œ ์ž์ฒด์— ์ž‘์šฉํ•˜๋Š” ํž˜ (Force on Sensor)์„ ๊ฐ๊ฐ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์•ž์„œ ์‚ดํŽด๋ณด์•˜๋“ฏ์ด, ์ผ๋ฐ˜ ๊ฐ€์†๋„ ๊ฐ’์€ ํ•ญ์ƒ ์ค‘๋ ฅ์„ ํฌํ•จํ•˜์—ฌ ๊ณ„์‚ฐ๋˜๊ธฐ์—, ์ค‘๋ ฅ (gravity)์„ ์˜๋ฏธํ•˜๋Š” $g$ ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ๊ฐ€์†๋„ ๊ฐ’์„ ์„ ํ˜• ๊ฐ€์†๋„ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์ค‘๋ ฅ $g$ ์˜ ์ž‘์šฉ์„ ์ œ๊ฑฐํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์„ ํ˜• ๊ฐ€์†๋„๋ฅผ ์ •์˜ํ•ด ๋ณด๋ฉด:

$$L_D = -\frac{1}{m} \sum F_S$$

๋””๋ฐ”์ด์Šค์— ์ž‘์šฉํ•˜๋Š” ์ค‘๋ ฅ ๊ฐ€์†๋„ ๊ฐ’ $g$ ๋ฅผ ์ถ”์ •ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ค‘, ์ €๋Š” low-pass filter ๋ฅผ ํ™œ์šฉํ•œ ์ถ”์ • ๋ฐฉ๋ฒ•์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ธฐ๊ธฐ์˜ ์ž์ด๋กœ์„ผ์„œ ๋“ฑ์„ ํ™œ์šฉํ•ด์„œ ์ข€ ๋” ์ •ํ™•ํ•œ ์ถ”์ •์น˜๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ, ํ•„ํ„ฐ๋ง ๋ฐฉ์‹๋ณด๋‹ค ํ›จ์”ฌ ๋ณต์žกํ•˜๋ฉฐ, ํ˜„์žฌ ๋ฌธ์ œ ์ƒํ™ฉ์—์„œ ๋งค์šฐ ์ •๋ฐ€ํ•œ ๋ณด์ • ์ž‘์—…์€ ๋ถˆํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

low-pass filter๋ฅผ ํ™œ์šฉํ•œ ์ค‘๋ ฅ ๊ฐ€์†๋„ ์ œ๊ฑฐ (์ฝ”๋“œ)

export default function App() {
  const [{ x, y, z }, setRawAcc] = useState({
    x: 0,
    y: 0,
    z: 0,
  });

  const [{ linearAccX, linearAccY, linearAccZ }, setLinearAcc] = useState({
    linearAccX: 0,
    linearAccY: 0,
    linearAccZ: 0,
  });
  const [subscription, setSubscription] = useState(null);

  const _slow = () => Accelerometer.setUpdateInterval(1000);
  const _fast = () => Accelerometer.setUpdateInterval(100);

  const alpha = 0.8;
  let gravityX = 0;
  let gravityY = 0;
  let gravityZ = 0;

  const _subscribe = () => {
    setSubscription(Accelerometer.addListener(({ x, y, z }) => {
      setRawAcc({ x, y, z });

      gravityX = alpha * gravityX + (1 - alpha) * x;
      gravityY = alpha * gravityY + (1 - alpha) * y;
      gravityZ = alpha * gravityZ + (1 - alpha) * z;

      const linearAccX = x - gravityX;
      const linearAccY = y - gravityY;
      const linearAccZ = z - gravityZ;

      setLinearAcc({ linearAccX, linearAccY, linearAccZ });
    }));
  };
}


์ด์ œ ์ˆœ์ˆ˜ํ•œ ์‚ฌ์šฉ์ž์˜ ์›€์ง์ž„๋งŒ์„ ๋ฐ˜์˜ํ•œ ์„ ํ˜• ๊ฐ€์†๋„ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๊ฐ€์†๋„ ๊ฐ’๊ณผ ํ•œ๋ฒˆ ๋น„๊ตํ•ด์„œ ํ™•์ธํ•ด ๋ณผ๊นŒ์š”?

Linear Acceleration

์•ž์„  ์ƒํ™ฉ๊ณผ ๋™์ผํ•˜๊ฒŒ ํœด๋Œ€ํฐ์„ ํ‰ํ‰ํ•œ ํ…Œ์ด๋ธ” ์œ„์— ๊ฐ€๋งŒํžˆ ๋†“์•˜์„ ๋•Œ, ์„ ํ˜• ๊ฐ€์†๋„์˜ x, y, z์ถ• ๊ฐ’ ๋ชจ๋‘ 0์— ๊ฐ€๊นŒ์ด ์ˆ˜๋ ดํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์„ ํ˜• ๊ฐ€์†๋„์— ํŠน์ • ์—ญ์น˜๊ฐ’(threshold)๋ฅผ ์„ค์ •ํ•˜์—ฌ, ์„ผ์„œ ์ธก์ •๊ฐ’์ด ๊ทธ ์—ญ์น˜๊ฐ’์„ ๋„˜์„๋•Œ๋งŒ GPS ์„ผ์„œ๋ฅผ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๊ธฐ๊ธฐ๊ฐ€ ํ™•์‹คํžˆ ์›€์ง์˜€์„๋•Œ๋งŒ ์ž‘๋™ํ•˜๋Š” GPS

์ด๋ ‡๊ฒŒ ๊ธฐ๊ธฐ์˜ ๊ฐ€์†๋„์„ผ์„œ์™€ GPS ์„ผ์„œ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ, ๊ธฐ๊ธฐ์™€ ๋ฐฐํ„ฐ๋ฆฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋ฉด์„œ๋„ ์‚ฌ์šฉ์ž์˜ ์œ ์˜๋ฏธํ•œ ์œ„์น˜๋ณ€ํ™”์—๋Š” ์—ฌ์ „ํžˆ ๊ธฐ๋ฏผํ•˜๊ฒŒ ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ตœ์ ํ™” ์ดํ›„์— ์•Œ๊ฒŒ ๋œ ์‚ฌ์‹ค์ด์ง€๋งŒ, GPS์˜ ๊ณผ๋„ํ•œ ์—๋„ˆ์ง€ ์‚ฌ์šฉ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ, GPS๋ฅผ ๊ฐ€์†๋„์„ผ์„œ์™€ ๊ฒฐํ•ฉํ•œ ์—๋„ˆ์ง€ ํšจ์œจ์ ์ธ ๋ฐ˜์‘ํ˜• GPS ์ƒ˜ํ”Œ๋ง(adaptive GPS sampling) ๊ธฐ์ˆ ์ด ํ•™๊ณ„์—์„œ ํ™œ๋ฐœํžˆ ๋…ผ์˜ ๋ฐ ์—ฐ๊ตฌ๋˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค!

ํ•œ ์—ฐ๊ตฌ๋Š” ๊ธฐ๊ธฐ ์—๋„ˆ์ง€, ๋ฐ์ดํ„ฐ ์šฉ๋Ÿ‰, ๋ฐ์ดํ„ฐ ๊ด‘๋Œ€์—ญ ์†Œ๋น„๋ฅผ 78%๋‚˜ ์ ˆ๊ฐํ•˜๋ฉด์„œ๋„ 91.4%๋ผ๋Š” ๋งค์šฐ ๋†’์€ ์œ„์น˜ ์ •ํ™•๋„๋ฅผ ๋ณด์˜€๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

This paper has proposed a novel approach that applies adaptive sampling to optimize GPS sensing, using Accelerometer's data. Based on the collected dataset, this study's results indicate the capability to reduce energy, data volume, and bandwidth consumption by 78% while preserving a relatively high accuracy: 91.4%. Our work's strength lies in using a second less-energy-consuming sensor (Accelerometer) to produce energy-efficient sensing of a more energy-consuming sensor (GPS).

โ€” Ezzini, S., & Berrada, I. (2021). Energy efficient adaptive GPS sampling using accelerometer data. Ad Hoc Networks, 191โ€“200. https://doi.org/10.1007/978-3-030-67369-7_14


๊ณผ๋„ํ•œ ์†Œ์ผ“ ํ†ต์‹ 

meeter ์•ฑ์€ ์‚ฌ์šฉ์ž ๊ฐ„ ์œ„์น˜์ •๋ณด ๊ณต์œ ๋ฅผ ์œ„ํ•ด socket.IO ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋„์‹์€ ์ด์ƒ์ ์ธ ์ƒํ™ฉ์—์„œ์˜

Meeter Architecture as-is

(์†Œ์ผ“ ๋„์‹ as-is vs. to-be)

์ตœ์ดˆ ์ง€๋„ ํ™”๋ฉด, ์–ด๋–ป๊ฒŒ ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๋กœ๋”ฉํ• ๊นŒ?

[๊ธฐ์กด]
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ์‹œ
[๊ธฐ์ˆ ๊ฒ€์ฆ]
WebView + MapKit ์ง์ ‘ ๊ฒฐํ•ฉ
[์ตœ์ ํ™” ํ›„]
๊ฒฐํ•ฉ ํ›„ ํŒŒ์ธ ํŠœ๋‹
loading-before loading-poc loading-optimized
ํ‰๊ท  7-10์ดˆ ์†Œ์š” ํ‰๊ท  1์ดˆ ๋ฏธ๋งŒ ๋”œ๋ ˆ์ด ๊ฑฐ์˜ ๋Š๊ปด์ง€์ง€ ์•Š์Œ

๋กœ๋”ฉ ์ง€์—ฐ ์›์ธ์— ๋Œ€ํ•œ ๊ฐ€์„ค ์ˆ˜๋ฆฝ ๋ฐ ๊ฒ€์ฆ

meeter ์•ฑ์„ ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ, ์ƒ๋‹จ์˜ ์ขŒ์ธก ํ™”๋ฉด๊ณผ ๊ฐ™์ด ํ‰๊ท ์ ์œผ๋กœ 10์ดˆ ๊ฐ€๊นŒ์ด ๋นˆ ํ™”๋ฉด์ด ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์ค˜์•ผํ•˜๋Š” ์ง€๋„ ๊ธฐ๋ฐ˜ ์•ฑ์˜ ํŠน์„ฑ์ƒ, ์ด๋Š” ๋งค์šฐ ์น˜๋ช…์ ์ธ ์ด์Šˆ์˜€๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๋„ ์‹ฌ๊ฐํ•˜๊ฒŒ ํ•ด์น˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์ด ์ด์œ ๋ฅผ ๋‘ ๊ฐ€์ง€๋กœ ์ขํ˜€๋ณด์•˜์Šต๋‹ˆ๋‹ค:

  1. ๊ธฐ๊ธฐ๊ฐ€ ์ตœ์ดˆ ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ค, ์œ„์น˜ ์ •๋ณด๊ฐ€ ํ™•์ธ๋ ๋•Œ๊นŒ์ง€ ์ง€๋„๊ฐ€ ๋ณด์ด์ง€ ์•Š์Œ
  2. ์ตœ์ดˆ ์œ„์น˜๋Š” ํŒŒ์•…๋˜์—ˆ์œผ๋‚˜, ๋ Œ๋”๋ง ํ•  ์ง€๋„ ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋ฐ์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆผ

1๋ฒˆ ๊ฐ€์„ค์„ ๊ฒ€์ฆํ•˜๊ณ  ๋ฐฐ์ œํ•˜๋Š” ๋ฐ์—๋Š” ๊ทธ๋ฆฌ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ๊ธฐ์˜ ์œ„์น˜์ •๋ณด๋Š” ๊ฑฐ์˜ ์ˆœ๊ฐ„์ ์œผ๋กœ ์กฐํšŒ๊ฐ€ ๋˜์—ˆ๊ณ , ์ด์— ๋”ํ•ด ๊ธฐ์กด์— Map ํƒญ์— ์ง„์ž…ํ•ด์•ผ ์‹œ์ž‘ํ–ˆ๋˜ ์œ„์น˜์ •๋ณด ํ™•์ธ์ž‘์—…์„ ์•ฑ ๋ถ€ํŒ… ์‹œ์ ์— ์‹œ์ž‘ํ•˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ๋”๋‹ˆ, ์œ„์น˜์ •๋ณด๋ฅผ ํŒŒ์•…ํ•˜๋Š” ์ž‘์—…์— ๋”ฐ๋ฅธ ์ง€์—ฐ์€ ๋” ์ด์ƒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

2๋ฒˆ ๊ฐ€์„ค์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์กด์— meeter ์•ฑ์ด ์–ด๋–ป๊ฒŒ ์ง€๋„ ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๊ณ  ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ ์ €๋Š” React Native ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ง€๋„๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฆฌ ํ†ต์šฉ๋˜๋Š” react-native-maps ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ <MapView> ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ, iOS ๊ธฐ์ค€์œผ๋กœ Apple MapKit JS์˜ ์ง€๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ ์™ธ์— ๋ณ„๋‹ค๋ฅธ ํŠน์ด์ ์€ ๋ณด์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ Apple MapKit JS์— ๋Œ€ํ•œ ์กฐ์‚ฌ๋ฅผ ์ด์–ด๋‚˜๊ฐ€๋˜ ์ค‘, ์ €๋Š” Apple Tech Talks์˜ ํ•œ ์˜์ƒ์„ ๋ณด๊ณ ๋Š” ์ง€๊ธˆ๊ป ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์™”๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•œ๊ณ„์ ์„ ๋ผˆ์ €๋ฆฌ๊ฒŒ ๋Š๋ผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํŽธ๋ฆฌํ•จ์— ์†์•„ ์ฃผ๋„๊ถŒ์„ ์žƒ๋‹ค

Meet high-performance MapKit JS ๋ผ๋Š” ์ œ๋ชฉ์˜ 10๋ถ„ ๋‚จ์ง“๋˜๋Š” ์ด ๋ฐœํ‘œ๋Š”, ์ œ๋ชฉ ๊ทธ๋Œ€๋กœ MapKit JS๋ฅผ ์•ฑ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์†Œ๊ฐœ์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ ์ œ๊ฒŒ ๊ฐ€์žฅ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์•ฝ์†ํ•ด์ฃผ์—ˆ์ฃ .

Mapkit Talk

  • ์ง€๋„ ํŽ˜์ด์ง€๊ฐ€ ๋” ๋น ๋ฅด๊ฒŒ ๋ฐ˜์‘ํ•˜๊ณ 
  • ์ง€๋„ ํŽ˜์ด์ง€๊ฐ€ ๋” ๋น ๋ฅด๊ฒŒ ๋กœ๋“œ๋˜๊ณ 
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ๋” ์„ธ์‹ฌํ•˜๊ฒŒ ์ง€๋„ ํŽ˜์ด์ง€๋ฅผ ์ œ์–ดํ•˜๊ณ , ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ์ ์žฌ์ ์†Œ์— ํฌํ•จํ•˜๋„๋ก ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

์ง€๋„์˜ ๋กœ๋”ฉ์‹œ๊ฐ„์„ ๊ฐœ์„ ํ•˜๊ณ , ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋” ๋งŽ์€ MapKit ์ œ์–ด๊ถŒ์„ ์ฃผ๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ์€ ๊ฒฐ๊ตญ ์ง€๋„์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋ฐ›์•„๊ฐ€์ง€ ์•Š๊ณ , ์ƒํ™ฉ์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ, ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•ด์„œ ๋ฐ›์•„๊ฐ€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์ œ๊ณตํ•ด ์ค€๋‹ค๋Š” ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด meeter์˜ ๊ฒฝ์šฐ, MapKit์ด ์ œ๊ณตํ•˜๋Š” Basic Map, Overlays, Annotations, User Location Display, Services, GeoJSON ๋“ฑ ๋ฐฉ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ์™€ API ์ค‘ Basic Map๋งŒ ์šฐ์„ ์ ์œผ๋กœ ๋ฐ›์•„์™€์„œ ์ตœ์ดˆ ์ง€๋„ ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•˜๊ณ , ์ดํ›„์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ์ถ”๊ฐ€์ ์œผ๋กœ ๋กœ๋“œํ•ด์˜ค๋ฉด ๋˜์—ˆ์ฃ .

์•ˆํƒ€๊น๊ฒŒ๋„, react-native-maps ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋Š” ์ด๋Ÿฌํ•œ ์ปค์Šคํ…€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋งŽ์€ ์š”์†Œ๋“ค์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋กœ ํ•˜์—ฌ๊ธˆ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋•์ง€๋งŒ, ํ•œํŽธ์œผ๋กœ๋Š” ์ด๋Ÿฌํ•œ ๋ฏธ์„ธํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ œ์–ด๋ฅผ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ฃ .


WebView์™€ MapKit JS ์ง์ ‘ ์—ฐ๊ฒฐ

๊ทธ๋ž˜์„œ ์ €๋Š” react-native-maps ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , WebView์™€ MapKit JS๋ฅผ ์ง์ ‘ ์—ฐ๊ฒฐํ•ด์„œ ์ง€๋„ ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

<script
  src="https://cdn.apple-mapkit.com/mk/5.x.x/mapkit.core.js"
  crossorigin async
  data-callback="initMapKit"
  data-libraries="map"
  data-initial-token="..."
></script>

๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ธฐ์ˆ  ๊ฒ€์ฆ์˜ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ฐ”๋กœ ์ด ํ™”๋ฉด์ž…๋‹ˆ๋‹ค.

Loading WebView MapKit POC

๊ธฐ์ˆ  ๊ฒ€์ฆ ํ›„์—๋Š”, ์ง€๋„ ์†์„ฑ์„ ์กฐ์ ˆํ•˜๊ณ  ์•ฑ์˜ ์—ฌํƒ€ ๋กœ์ง๊ณผ ์—ฐ๊ฒฐํ•˜์—ฌ ๋งค๋„๋Ÿฌ์šด ์ตœ์ดˆ ์ง€๋„ ๋กœ๋”ฉ ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•ด๋ƒˆ์Šต๋‹ˆ๋‹ค.

Loading Optimized


๋ฒˆ์™ธ 1) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์œ ์ง€ํ•œ๋‹ค๊ณ  ์ „์ œํ–ˆ์„ ๋•Œ, ๊ณ ๋ คํ•œ ๋ฐฉ๋ฒ•๋“ค

  • ์ตœ์ดˆ ์‚ฌ์šฉ์ž ์œ„์น˜๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ•œ ์ง€๋„ ์Šค๋ƒ…์ƒท Maps Web Snapshot์„ ์šฐ์„  ๋ณด์—ฌ์ฃผ๊ณ , ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋งต์ด ๋กœ๋”ฉ๋˜๊ณ ๋‚˜๋ฉด ๊ทธ ํ™”๋ฉด์œผ๋กœ ๊ฐˆ์•„๋ผ์šฐ๋Š” ๋ฐฉ๋ฒ•
    • ์‚ฌ์‹ค์ƒ ๊ฐ€์žฅ ์œ ๋ ฅํ•œ ๋Œ€์•ˆ์ด์—ˆ๊ณ , ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๋กœ๋“œํ•ด์˜ค๊ณ , ์ดํ›„ ๋กœ๋”ฉ๋œ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ์ ์—์„œ ํ˜„์žฌ ํ•ด๊ฒฐ์ฑ… (WebView + MapKit ์ง์ ‘ ๊ฒฐํ•ฉ)๊ณผ ๊ฐ€์žฅ ๋ฐœ์ƒ์ด ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•
  • ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ meeter ์•ฑ์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ์ง€๋„ ํ™”๋ฉด์„ ๊ธฐ๊ธฐ์˜ asyncStorage์— ์บ์‹ฑํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ๋‹ค์Œ ์•ฑ ๋ถ€ํŒ… ์‹œ ์ดˆ๊ธฐ ํ™”๋ฉด์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹
    • ์•ฑ์ด ์ข…๋ฃŒ๋˜๋Š” ์‹œ์ ์˜ ์ง€๋„ ํ™”๋ฉด์„ ๊ธฐ์–ตํ•ด์•ผํ•˜๋Š” ์–ด๋ ค์›€์ด ์žˆ๊ณ , ์•ฑ ์ข…๋ฃŒ์™€ ๋‹ค์Œ ๋ถ€ํŒ… ์‚ฌ์ด ์‚ฌ์šฉ์ž๊ฐ€ ์œ„์น˜๋ฅผ ๋งŽ์ด ์ด๋™ํ–ˆ๋‹ค๋ฉด ์ง€๋„๊ฐ€ '๋‚ ์•„๊ฐ€๋Š”' ์–ด์ƒ‰ํ•œ ์›€์ง์ž„์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๋‹จ์ 
  • ์•ฑ์˜ ๋ถ€ํŒ… ํ™”๋ฉด์ธ ์Šคํ”Œ๋ž˜์‹œ ์Šคํฌ๋ฆฐ์œผ๋กœ ์‹œ๊ฐ„์„ ๋ฒŒ๊ฑฐ๋‚˜, ๋กœ๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ณด์—ฌ์ฃผ๊ธฐ
    • ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹Œ ์ž„์‹œ๋ฐฉํŽธ

๋จธ๋ฆฌ๋ฅผ ์‹ธ๋งค๊ณ  ๊ณ ๋ฏผํ•˜๋ฉด์„œ, ์นด์นด์˜ค๋งต์ด๋‚˜ ๊ตฌ๊ธ€ ๋งต ๊ฐ™์€ ์‹œ์ค‘ ์ง€๋„ ์„œ๋น„์Šค๋Š” ์–ด๋–ป๊ฒŒ ๋น ๋ฅธ ๋กœ๋”ฉ์‹œ๊ฐ„์„ ์‹คํ˜„ํ–ˆ๋Š”์ง€ ๊ถ๊ธˆํ•ด์„œ Kakao Dev Talk์— ํ˜ธ๊ธฐ๋กญ๊ฒŒ ์งˆ๋ฌธ๋“œ๋ ธ์œผ๋‚˜.. ๋‚ด๋ถ€ ๊ธฐ๋ฐ€์ด๋ผ ์„ค๋ช…์ด ํž˜๋“ค๋‹ค๋Š” ๋‹ต๋ณ€์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค ๐Ÿ˜ญ ์ง€๊ธˆ ์ƒ๊ฐํ•˜๋ฉด ์•ˆ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด ๋‹น์—ฐํžˆ ๋งž๋Š”๋ฐ, ๊ทธ ๋‹น์‹œ์—๋Š” ์ง€ํ‘ธ๋ผ๊ธฐ๋ผ๋„ ๋ถ™์žก๋Š” ์‹ฌ์ •์œผ๋กœ ์งˆ๋ฌธ์„ ๋“œ๋ ธ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Kakao Question


๋ฒˆ์™ธ 2) ๊ทธ๋Ÿผ react-native-maps ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์™œ ์—ฌ์ „ํžˆ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์“ฐ๋Š”๊ฑด๋ฐ..? ๐Ÿค”

Location.getCurrentPositionAsync(options)

Requests for one-time delivery of the user's current location. Depending on given accuracy option it may take some time to resolve, especially when you're inside a building.

Note: Calling it causes the location manager to obtain a location fix which may take several seconds. Consider using Location.getLastKnownPositionAsync if you expect to get a quick response and high accuracy is not required.

์œ„ ๊ณต์‹๋ฌธ์„œ์— ์„ค๋ช…๋˜์–ด ์žˆ๋“ฏ์ด, ์ง€๋„ ๋กœ๋”ฉ ์ง€์—ฐ์„ ์œ ๋ฐœํ•˜๋Š” Location.getCurrentPositionAsync() ๋ฉ”์†Œ๋“œ ๋Œ€์‹  Location.getLastKnownPositionAsync() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์ˆ ๋˜์–ด ์žˆ๋“ฏ ์œ„์น˜ ์ •ํ™•๋„๊ฐ€ ๋†’์ง€ ์•Š๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ ํ™•์ธ๋œ ์œ„์น˜๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ์— ์ง€๋„๊ฐ€ '๋‚ ์•„๊ฐ€๋Š”' ์–ด์ƒ‰ํ•œ ์›€์ง์ž„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์œ„์น˜ ๋ฐ์ดํ„ฐ์˜ ์ •ํ™•์„ฑ๊ณผ ์‹ค์‹œ๊ฐ„์„ฑ์„ ์ง€ํ‚ค๋ฉด์„œ๋„, ์ง€๋„์˜ ์ตœ์ดˆ ๋กœ๋”ฉ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๊ณ ์ž ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  WebView์™€ MapKit์„ ์ง์ ‘ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž๊ธฐ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์„ ์ด์šฉํ•œ ์šฉ๋Ÿ‰ ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ ๊ตฌํ˜„

๐Ÿ“š Lessons Learned

์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ค‘์‹ฌ์˜ ์ง€์†์ ์ธ ์ œํ’ˆ ๊ฐœ์„ ์˜ ์ค‘์š”์„ฑ

๊ฐœ๋ฐœ ํ›„ production ๋นŒ๋“œ๋ฅผ Apple TestFlight ์‹ฌ์‚ฌ๋ฅผ ํ†ตํ•ด ์—…๋กœ๋“œํ•˜๊ณ , ๋ฒ ํƒ€ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค (2024๋…„ 1์›”). ๊ฐœ๋ฐœ๊ธฐ๊ฐ„์—๋Š” ์ฐจ๋งˆ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๊ฑฐ๋‚˜, ๋†“์ณค๋˜ ๋ฒ„๊ทธ๋“ค์— ๋Œ€ํ•œ ์†Œ์ค‘ํ•œ ์œ ์ € ํ”ผ๋“œ๋ฐฑ์„ ๊ฒฝ์ฒญํ•˜๊ณ , ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐ€์žฅ ํฌ๊ฒŒ ์ €ํ•ดํ•˜๋Š”, ์ฆ‰ ๊ฐœ์„ ํ•˜์˜€์„ ๋•Œ ๊ฐ€์žฅ ํฐ ์ž„ํŒฉํŠธ๋ฅผ ๋‚ผ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘๊ณ  ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋Šฅ๋™์ ์ด๊ณ  ์ฐฝ์˜์ ์ธ ๋ฌธ์ œํ•ด๊ฒฐ์˜ ์ฆ๊ฑฐ์›€

์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์„ ๋น„๊ตํƒ๊ตฌํ•˜๊ณ , ํ•ฉ๋ฆฌ์ ์ธ ๊ทผ๊ฑฐ๋ฅผ ๋“ค์–ด ์ฑ„ํƒํ•˜๋Š” ๊ณผ์ •

About

A hyper-local mobile app leveraging the w3w coordinate system for precise, real-time location sharing between friends

https://testflight.apple.com/join/nrlNSHda


Languages

Language:JavaScript 100.0%