๐งป ํ๋ฆฌ๋ณด๋์ ์ค๊ณ ๋ง์ผ ๋ถ๋ถ์์ ์ํ ๋ฑ๋ก ์ ๊ฑฐ๋์์น๋ฅผ ์์ฑํ๊ธฐ ์ํด์ ์นด์นด์ค์์ ์ ๊ณตํ๋ '์นด์นด์ค ์ง๋ API'์ ๋ํด ๊ณต๋ถํด๋ณด์.๐ฝ
์นด์นด์ค ๋งต API๋ฅผ ๋ฐ๊ธฐ ์ํด์ https://apis.map.kakao.com/ ์ ์ํ๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๊ณ ์ฑ ํค๋ค์ด ์์ฑ ๋๋๋ฐ ๊ทธ ์ค JavaScript Key ๊ฐ์ ์ด์ฉํ๋ค.
์ฌ์ฉ ์ค์ธ ์ฌ์ดํธ ๋๋ฉ์ธ ์ฃผ์๋ฅผ ์ ๋ ฅํ๋ค.
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