๐Ÿ—บ๏ธ 74. React Native์—์„œ ์ง€๋„(Map) ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ „๋žต โ€” react-native-maps, ๋งˆ์ปค, ๊ฒฝ๋กœ ํ‘œ์‹œ๊นŒ์ง€

JM_Devยท2025๋…„ 8์›” 8์ผ
0
post-thumbnail

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

์ด๋ฒˆ ๊ธ€์€ React Native์—์„œ ์ง€๋„ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ๋˜ ๊ณผ์ •๊ณผ ์ „๋žต์„ ์ •๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค.


โœ… ์ง€๋„ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ์ด์œ 

ํ•ญ๋ชฉ์„ค๋ช…
์ง๊ด€์ ์ธ UI์‹œ๊ฐ์ ์œผ๋กœ ์œ„์น˜๋ฅผ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค
์‚ฌ์šฉ์ž ํŽธ์˜์ฃผ์†Œ๋ณด๋‹ค ์ง€๋„๊ฐ€ ํ›จ์”ฌ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค
๋‹ค์–‘ํ•œ ํ™•์žฅ์„ฑ๊ฒ€์ƒ‰, ๊ฒฝ๋กœ ์•ˆ๋‚ด, ์ฃผ๋ณ€ ํƒ์ƒ‰ ๊ธฐ๋Šฅ๊นŒ์ง€ ํ™•์žฅ ๊ฐ€๋Šฅ

๐Ÿ“ฆ react-native-maps ์„ค์น˜์™€ ๊ธฐ๋ณธ ์‚ฌ์šฉ

์„ค์น˜

npm install react-native-maps
npx pod-install

๊ธฐ๋ณธ ์˜ˆ์‹œ

import MapView, { Marker } from 'react-native-maps';

<MapView
  style={{ flex: 1 }}
  initialRegion={{
    latitude: 37.5665,
    longitude: 126.9780,
    latitudeDelta: 0.01,
    longitudeDelta: 0.01,
  }}
>
  <Marker
    coordinate={{ latitude: 37.5665, longitude: 126.9780 }}
    title="์„œ์šธ"
    description="์„œ์šธํŠน๋ณ„์‹œ"
  />
</MapView>
  • initialRegion์œผ๋กœ ์ง€๋„ ์‹œ์ž‘ ์œ„์น˜์™€ ์คŒ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  • Marker๋ฅผ ์‚ฌ์šฉํ•ด ํŠน์ • ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“ ์‚ฌ์šฉ์ž ํ˜„์žฌ ์œ„์น˜ ํ‘œ์‹œ

์œ„์น˜ ๊ถŒํ•œ์„ ๋จผ์ € ์š”์ฒญํ•ด์•ผ ํ•œ๋‹ค.
react-native-permissions๋‚˜ Expo ํ™˜๊ฒฝ์ด๋ผ๋ฉด expo-location์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

npm install expo-location
import * as Location from 'expo-location';

const getCurrentLocation = async () => {
  const { status } = await Location.requestForegroundPermissionsAsync();
  if (status !== 'granted') return;

  const location = await Location.getCurrentPositionAsync({});
  console.log(location.coords);
};

์ด ๊ฐ’์„ Marker ์ขŒํ‘œ๋กœ ๋„ฃ์œผ๋ฉด ํ˜„์žฌ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ›ฃ๏ธ ๊ฒฝ๋กœ(Route) ํ‘œ์‹œ

๊ฒฝ๋กœ๋ฅผ ๋ณด์—ฌ์ฃผ๋ ค๋ฉด Google Directions API ๊ฐ™์€ ์™ธ๋ถ€ API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
์‘๋‹ต์œผ๋กœ ๋ฐ›์€ ์ขŒํ‘œ ๋ฆฌ์ŠคํŠธ๋ฅผ Polyline ์ปดํฌ๋„ŒํŠธ๋กœ ๊ทธ๋ฆฐ๋‹ค.

import { Polyline } from 'react-native-maps';

<Polyline
  coordinates={[
    { latitude: 37.5665, longitude: 126.9780 },
    { latitude: 37.5700, longitude: 126.9920 },
  ]}
  strokeColor="#007bff"
  strokeWidth={4}
/>

โš™๏ธ UX ๊ฐœ์„  ํฌ์ธํŠธ

๊ธฐ๋Šฅ์ด์œ 
์คŒ ์ œ์Šค์ฒ˜ ์ œํ•œ์‚ฌ์šฉ์ž๊ฐ€ ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ/๊ฐ€๊น๊ฒŒ ๋ณด์ง€ ์•Š๋„๋ก
๋งˆ์ปค ์ปค์Šคํ„ฐ๋งˆ์ด์ง•๋ธŒ๋žœ๋“œ ์•„์ด์ฝ˜์ด๋‚˜ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
ํด๋Ÿฌ์Šคํ„ฐ๋ง๋งˆ์ปค๊ฐ€ ๋งŽ์„ ๋•Œ ์„ฑ๋Šฅ๊ณผ ๊ฐ€๋…์„ฑ ๊ฐœ์„ 
์œ„์น˜ ๋ฒ„ํŠผ์‚ฌ์šฉ์ž๊ฐ€ ์–ธ์ œ๋“  ํ˜„์žฌ ์œ„์น˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก

๐Ÿง  ์‹ค์ „์—์„œ ๊ฒช์—ˆ๋˜ ์ผ

๋ฐฐ๋‹ฌ ๊ฒฝ๋กœ ํ‘œ์‹œ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์—ˆ์„ ๋•Œ,
๋‹จ์ˆœํžˆ ๋งˆ์ปค์™€ ์„ ๋งŒ ํ‘œ์‹œํ•˜๋ฉด ๋  ์ค„ ์•Œ์•˜๋‹ค.
ํ•˜์ง€๋งŒ ์‹ค์ œ ์‚ฌ์šฉ ํ™˜๊ฒฝ์—์„œ๋Š”

  • GPS ์˜ค์ฐจ
  • API ์‘๋‹ต ์ง€์—ฐ
  • ์ง€๋„ ์ด๋™ ์‹œ ์„ฑ๋Šฅ ์ €ํ•˜
    ๊ฐ™์€ ๋ฌธ์ œ๋“ค์ด ์žˆ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋งˆ์ปค๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ , Polyline ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ–ˆ๊ณ ,
์œ„์น˜ ๊ฐฑ์‹  ์ฃผ๊ธฐ๋ฅผ ์กฐ์ ˆํ•ด์„œ ๋ฐฐํ„ฐ๋ฆฌ ์†Œ๋ชจ๋„ ์ค„์˜€๋‹ค.
๊ทธ ๊ฒฐ๊ณผ ์ง€๋„๊ฐ€ ํ›จ์”ฌ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋™์ž‘ํ•˜๊ฒŒ ๋๋‹ค.


๐Ÿ—บ๏ธ ์ง€๋„๋Š” ๋‹จ์ˆœํ•œ ์‹œ๊ฐ ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ, ์‹ค์‹œ๊ฐ„ ์ •๋ณด์™€ UX๊ฐ€ ๊ฒฐํ•ฉ๋œ ๊ธฐ๋Šฅ์ด๋‹ค.


profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€