์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

๋ฆฌ์•กํŠธ์—์„œ Google Maps API(๊ตฌ๊ธ€๋งต API) ์‚ฌ์šฉํ•˜๊ธฐ(+ ์ปค์Šคํ…€ ๋งˆ์ปค)

Project Log

by loeybho 2024. 5. 10. 16:19

๋ณธ๋ฌธ

๊ณต๋ถ€ ๊ณ„๊ธฐ ๐Ÿ“š

๊ฐœ์ธ ํ”„๋กœ์ ํŠธ ์›๋”๋ Œ์ฆˆ ๊ฐœ๋ฐœ ์ค‘, Home ํ™”๋ฉด์— ๊ตฌ๊ธ€๋งต API๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ–ˆ๋‹ค.
 
1. Google Maps API(๊ตฌ๊ธ€๋งต API) ์ถ”๊ฐ€
2. ๊ฐ”๋˜ ์—ฌํ–‰์ง€์— ์ƒ‰์ƒ ์ถ”๊ฐ€
 

์ค‘์š” ํฌ์ธํŠธ โœง

1. API ํ‚ค๊ฐ’ ๋ฐœ๊ธ‰๋ฐ›์•„ <script>์— ๋„ฃ๊ธฐ
2. ๊ณต์‹ ๋ฌธ์„œ์— ์žˆ๋Š” ์ฝ”๋“œ React hooks๋กœ ์ˆ˜์ •ํ•˜๊ธฐ 
 

ํ™œ์šฉ ์˜ˆ์‹œ ๐Ÿช„

1. API ํ‚ค๊ฐ’ ๋ฐœ๊ธ‰๋ฐ›์•„ Script์— ๋„ฃ๊ธฐ

    <script
      src="https://maps.googleapis.com/maps/api/js?key=%VITE_MAP_API_KEY%&loading=async&libraries=marker"
      async
    ></script>

 
index.html์— ์žˆ๋Š” script์— API์™€ key๊ฐ’์„ ์ž…๋ ฅํ–ˆ๋‹ค. key๊ฐ’์€ ๊นƒํ—ˆ๋ธŒ์— ์˜ฌ๋ ธ์„ ๋•Œ ๋…ธ์ถœ๋˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด .envํŒŒ์ผ์— ๋„ฃ์—ˆ๊ธฐ์— ๋ณ€์ˆ˜๋ช…์„ ์‚ฌ์šฉํ–ˆ๋‹ค.
 

2. ๊ณต์‹ ๋ฌธ์„œ์— ์žˆ๋Š” ์ฝ”๋“œ React๋กœ ์ˆ˜์ •ํ•˜๊ธฐ

์ดˆ๋ฐ˜๋ถ€์—” ๋‹นํ™ฉํ–ˆ์ง€๋งŒ, ์ด๋ฏธ ๋‹ค๋ฅธ ๋ถ„๋“ค์ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ์™€ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋งž๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

import { useCallback, useEffect, useRef } from "react";

const locations = [
  { title: "vancouver", position: { lat: 49.2576182, lng: -123.2887105 } },
  { title: "vietnam", position: { lat: 14.073694, lng: 108.413399 } },
  { title: "mongolia", position: { lat: 47.0008262, lng: 103.0839711 } },
];

function Home() {
  const mapRef = useRef(null);

  const initMap = useCallback(() => {
    const map = new window.google.maps.Map(mapRef.current, {
      center: { lat: 40.397, lng: 150.644 },
      zoom: 2,
      mapId: "DEMO_MAP_ID",
    });

    const mapPin = "/mapPin.svg";

    locations.forEach((location) => {
      new window.google.maps.Marker({
        // new window.google.maps.marker.AdvancedMarkerElement({
        map,
        position: location.position,
        title: location.title,
        icon: mapPin,
      });
    });
  }, [mapRef]);

  useEffect(() => {
    initMap();
  }, [initMap]);

  return (
    <div
      className="map"
      style={{ width: "100vw", height: "600px" }}
      ref={mapRef}
    ></div>
  );
}

export default Home;

 

 
์ขŒํ‘œ๊ฐ’์œผ๋กœ ์ฐ์–ด์ค„ ์œ„๋„์™€ ๊ฒฝ๋„๋Š” ๊ตฌ๊ธ€๋งต์—์„œ ์ฐพ์•˜๋‹ค.
 
 

์ถ”๊ฐ€ ๊ฐœ๋… ๐Ÿ“ƒ

useRef๋ฅผ ์˜ˆ์ „์— ๋ฐฐ์› ๋Š”๋ฐ, ์žŠ์–ด๋ฒ„๋ ธ๋‹ค. ๊ทผ๋ฐ ์ด๋ฒˆ์— map์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•ด์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ณต๋ถ€ํ•œ๋‹ค.
 
useRef๋ž€ React์˜ Hookํ•จ์ˆ˜๋กœ ํŠน์ • DOM์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— ์‚ฌ์šฉํ•œ๋‹ค. ๋ณดํ†ต Javascript๋ฅผ ์‚ฌ์šฉํ•  ๋• getElementById ๋˜๋Š” querySelector๊ฐ™์€ Dom selector๋ฅผ ์‚ฌ์šฉํ•ด ์„ ํƒํ•œ๋‹ค.
 
input์— ํฌ์ปค์Šค๊ฐ€ ์žกํžˆ๋„๋ก ํ•  ๋•Œ useRef๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค.
 
์œ„์˜ ์ฝ”๋“œ์—์„œ mapRef๋Š” ๊ตฌ๊ธ€ ์ง€๋„๊ฐ€ ๋ Œ๋”๋ง๋  DOM์š”์†Œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
 
 
 

์ฐธ๊ณ  ์ž๋ฃŒ

https://developers.google.com/maps/documentation/javascript/overview?hl=ko#maps_map_simple-javascript

 

๊ฐœ์š”  |  Maps JavaScript API  |  Google for Developers

Google Maps JavaScript API๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ํ™•์ธํ•˜๊ณ , ๊ฐœ๋…์„ ์•Œ์•„๋ณด๊ณ , ์‚ฌ์ดํŠธ์— ๋งž๋Š” ๋งž์ถค ์ง€๋„๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”.

developers.google.com

 
https://react.vlpt.us/basic/10-useRef.html

 

10. useRef ๋กœ ํŠน์ • DOM ์„ ํƒํ•˜๊ธฐ · GitBook

10. useRef ๋กœ ํŠน์ • DOM ์„ ํƒํ•˜๊ธฐ JavaScript ๋ฅผ ์‚ฌ์šฉ ํ•  ๋•Œ์—๋Š”, ์šฐ๋ฆฌ๊ฐ€ ํŠน์ • DOM ์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— getElementById, querySelector ๊ฐ™์€ DOM Selector ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ DOM ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”

react.vlpt.us

 
 

๋ฐฐ์šด ๊ฒƒ

๊ณต์‹๋ฌธ์„œ๋ฅผ ๊ผผ๊ผผํ•˜๊ฒŒ ์ฝ๋Š” ๊ฒƒ์˜ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ๋˜ ํ•œ๋ฒˆ ์ง€๋„ ๋„์šฐ๋Š”๊ฒƒ์„ ์„ฑ๊ณตํ•˜๋‹ˆ ๋‹ค๋ฅธ ๊ฒƒ๋„ ์ฒœ์ฒœํžˆ ์ ‘๊ทผํ•˜๋ฉด ์ž˜ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค!

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ