KakaoMap API

hyeseon hanยท2021๋…„ 10์›” 16์ผ
0

๐Ÿงป ํ”„๋ฆฌ๋ณด๋“œ์˜ ์ค‘๊ณ ๋งˆ์ผ“ ๋ถ€๋ถ„์—์„œ ์ƒํ’ˆ ๋“ฑ๋ก ์‹œ ๊ฑฐ๋ž˜์œ„์น˜๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์นด์นด์˜ค์—์„œ ์ œ๊ณตํ•˜๋Š” '์นด์นด์˜ค ์ง€๋„ API'์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด๋ณด์ž.๐Ÿšฝ

์นด์นด์˜ค ๋งต

  1. ์นด์นด์˜ค ๋งต API๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ https://apis.map.kakao.com/ ์ ‘์†ํ•œ๋‹ค.

  2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ์•ฑ ํ‚ค๋“ค์ด ์ƒ์„ฑ ๋˜๋Š”๋ฐ ๊ทธ ์ค‘ JavaScript Key ๊ฐ’์„ ์ด์šฉํ•œ๋‹ค.

  3. ์‚ฌ์šฉ ์ค‘์ธ ์‚ฌ์ดํŠธ ๋„๋ฉ”์ธ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

  4. Guide๋ฅผ ๋ณด๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ž˜ ์•ˆ๋œ๋‹ค. ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์„ ์ง€์›ํ•˜๋Š” Next JS์—์„œ document ๊ฐ์ฒด๋Š” ํ™”๋ฉด์„ ๋ Œ๋”ํ•˜๊ธฐ ์ „์—๋Š” ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š” ๊ฐ’(=undefined)์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋ฏ€๋กœ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋„๋กํ•ด๋ณด์ž

์นด์นด์˜ค ๋งต ๋“ฑ๋กํŽ˜์ด์ง€

  • ์นด์นด์˜ค ๋งต์—์„œ ์ œ๊ณตํ•˜๋Š” script๋ฅผ ๋‚ด ํ”„๋กœ์ ํŠธ ์•ˆ์— ์ ์šฉ ์‹œ์ผœ์ค˜์•ผํ•œ๋‹ค.
    โ–ถ๏ธŽ Head ํƒœ๊ทธ ์•ˆ์— script๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. src์†์„ฑ์œผ๋กœ ์นด์นด์˜ค๋งต์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ์—ฌ๊ธฐ์— JavaScript Key ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์นด์นด์˜ค๋งต์˜ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

    Head ํƒœ๊ทธ
    HTML์—์„œ Headํƒœ๊ทธ ์•ˆ์œผ๋กœ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋“ค์„ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ Next.js์˜ Head ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•ด ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • useEffect๋ฅผ ์ด์šฉํ•ด์„œ ํŽ˜์ด์ง€๊ฐ€ ๋ Œ๋”๋˜๊ณ  document ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ์ดํ›„์— ์นด์นด์˜ค๋งต์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

  • containeer: ์ง€๋„๋ฅผ ๋‹ด์„ ์˜์—ญ, options: ์ดˆ๊ธฐ ์œ„์น˜๊ฐ’ ์„ค์ •

  • ๋งต์€ ๋‹ค์šด๋ฐ›์•„์„œ ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ฒ„์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. window.kakao ๋กœ ์กด์žฌํ•จ์„ ์•Œ๋ ค์ค˜์•ผํ•œ๋‹ค.

import Head from "next/head";
import { useEffect } from "react";

declare const window: typeof globalThis & {
  kakao: any;
};

export default function KakaoMapPage() {
  useEffect(() => {
    // ์นด์นด์˜ค ๋งต์„ ํ˜ธ์ถœํ•˜๋Š” JS
    const container = document.getElementById("map"); // ์ง€๋„๋ฅผ ๋‹ด์„ ์˜์—ญ์˜ DOM ๋ ˆํผ๋Ÿฐ์Šค
    const options = {
      // ์ง€๋„๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•„์š”ํ•œ ๊ธฐ๋ณธ ์˜ต์…˜
      center: new kakao.maps.LatLng(33.450701, 126.570667), // ์ง€๋„์˜ ์ค‘์‹ฌ์ขŒํ‘œ.
      level: 3, // ์ง€๋„์˜ ๋ ˆ๋ฒจ(ํ™•๋Œ€, ์ถ•์†Œ ์ •๋„)
    };

    const map = new window.kakao.maps.Map(container, options); // ์ง€๋„ ์ƒ์„ฑ ๋ฐ ๊ฐ์ฒด ๋ฆฌํ„ด
    console.log(map);
  }, []);

  return (
    <>
      <Head>
        <script
          type="text/javascript"
          src="//dapi.kakao.com/v2/maps/sdk.js?appkey=5c3f3b5fa1a016d4a491f6dc430152fe"
        ></script>
      </Head>
      
      // ์นด์นด์˜ค ๋งต์„ ์ถœ๋ ฅํ•˜๋Š” HTML
      <div id="map" style={{ width: "500px", height: "400px" }}></div>
    </>
  );
}

  • script.src ์— autoload=false๋ฅผ์ง€์ •ํ•ด์•ผํ•œ๋‹ค. ์ด ๋•Œ &๋กœ appkey์™€ ์—ฐ๊ฒฐํ•œ๋‹ค.

ํด๋ฆญํ•œ ์œ„์น˜์— ๋งˆ์ปค ํ‘œ์‹œํ•˜๊ธฐ

https://apis.map.kakao.com/web/sample/addMapClickEventWithMarker/

์ด ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

export default function KakaoMapRoutedPage() {
  useEffect(() => {
    const script = document.createElement("script"); // script ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ ๋‹ค.
    script.src =
      "//dapi.kakao.com/v2/maps/sdk.js?autoload=false&appkey=---f-b5-a1a-1-d4-4-1-6-c-30--2-e";
    document.head.appendChild(script); // appendChild ์ž์‹์œผ๋กœ ์ถ”๊ฐ€
    script.onload = () => {
      window.kakao.maps.load(() => {
        const container = document.getElementById("map"); // ์ง€๋„๋ฅผ ๋‹ด์„ ์˜์—ญ์˜ DOM ๋ ˆํผ๋Ÿฐ์Šค
        const options = {
          // ์ง€๋„๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•„์š”ํ•œ ๊ธฐ๋ณธ ์˜ต์…˜
          center: new window.kakao.maps.LatLng(
            37.51719553992789,
            126.95962070083127
          ), // ์ง€๋„์˜ ์ค‘์‹ฌ์ขŒํ‘œ.
          level: 3, // ์ง€๋„์˜ ๋ ˆ๋ฒจ(ํ™•๋Œ€, ์ถ•์†Œ ์ •๋„)
        };

        const map = new window.kakao.maps.Map(container, options); // ์ง€๋„ ์ƒ์„ฑ ๋ฐ ๊ฐ์ฒด ๋ฆฌํ„ด
        console.log(map);

        //๋งˆ์ปค
        // ์ง€๋„๋ฅผ ํด๋ฆญํ•œ ์œ„์น˜์— ํ‘œ์ถœํ•  ๋งˆ์ปค์ž…๋‹ˆ๋‹ค
        const marker = new window.kakao.maps.Marker({
          // ์ง€๋„ ์ค‘์‹ฌ์ขŒํ‘œ์— ๋งˆ์ปค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
          position: map.getCenter(),
        });
        // ์ง€๋„์— ๋งˆ์ปค๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค
        marker.setMap(map);

        // ์ง€๋„์— ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค
        // ์ง€๋„๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค
        window.kakao.maps.event.addListener(
          map,
          "click",
          function (mouseEvent: { latLng: any }) {
            // ํด๋ฆญํ•œ ์œ„๋„, ๊ฒฝ๋„ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค
            const latlng = mouseEvent.latLng;

            // ๋งˆ์ปค ์œ„์น˜๋ฅผ ํด๋ฆญํ•œ ์œ„์น˜๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค
            marker.setPosition(latlng);
          }
        );
      });
    };
  }, []);

  return (
    <>
      <div id="map" style={{ width: "500px", height: "400px" }}></div>
    </>
  );

์ฐธ๊ณ : kakaomap

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