๐ฅ๋ฐ์ํ ๋ฌธ์ ?
"use client";
import { useEffect } from "react";
const KakaoMap = () => {
useEffect(() => {
const script = document.createElement("script");
script.type = "text/javascript";
script.src = `//dapi.kakao.com/v2/maps/sdk.js?appkey=${process.env.NEXT_PUBLIC_KAKAO_MAP_API}&autoload=false`;
document.body.appendChild(script);
script.onload = () => {
window.kakao.maps.load(() => {
const container = document.getElementById("map"); //์ง๋๋ฅผ ๋ด์ ์์ญ์ DOM ๋ ํผ๋ฐ์ค
const options = {
//์ง๋๋ฅผ ์์ฑํ ๋ ํ์ํ ๊ธฐ๋ณธ ์ต์
center: new window.kakao.maps.LatLng(33.450701, 126.570667), //์ง๋์ ์ค์ฌ์ขํ.
level: 3, //์ง๋์ ๋ ๋ฒจ(ํ๋, ์ถ์ ์ ๋)
};
const map = new window.kakao.maps.Map(container, options); //์ง๋ ์์ฑ ๋ฐ ๊ฐ์ฒด
});
};
}, []);
return <div id="map" className="w-[500px] h-[500px]"></div>;
};
export default KakaoMap;
ํ์ฌ ์นด์นด์ค ๋งต์ ์ฌ์ฉํ๊ธฐ ์ํด ์นด์นด์ค ๋งต API๋ฅผ Script๋ก ๋ถ๋ฌ์จ ์ํฉ์ ๋๋ค.
๋ชจ๋ ์ฝ๋๊ฐ ์ ์์ ์ผ๋ก ์๋ ํ์ง๋ง, window.kakao ์ฝ๋์์ ํ์ ์๋ฌ๊ฐ ๋๋ ์ํฉ์ ๋๋ค.
์นด์นด์ค ๋งต API๋ ์ ์ญ ๊ฐ์ฒด์ kakao๋ผ๋ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํด์ฃผ๋๋ฐ, ์ด ๋ถ๋ถ์ ํ์ ์ค์ ์ ํด๋ณด๋ ค ํฉ๋๋ค.
๐๋ฌธ์ ํด๊ฒฐ!
์์ฃผ ๊ฐ๋จํ๊ฒ ๋ฃจํธ ๋๋ ํ ๋ฆฌ type.d.ts ํ์ผ์ ๋ง๋ค์ด ํด๊ฒฐํ ์ ์์ต๋๋ค!
//types.d.ts
declare global {
namespace NodeJS {
interface ProcessEnv {
NEXT_PUBLIC_KAKAO_MAP_API: string | undefined;
}
}
interface Window {
kakao: any;
}
}
export {};
Windowํ์ ์ kakao ํ์ ์ ์ถ๊ฐํจ์ผ๋ก์จ ํ์ ์๋ฌ๋ฅผ ๋ฐฉ์งํ ์ ์์์ต๋๋ค!
๋ค์ผ๋ก .env์ ์ค์ ํ ํ๊ฒฝ ๋ณ์๋ค ์ญ์ ์ด๊ณณ์์ ํ์ ์ค์ ์ ํ ์ ์์ต๋๋ค!
๐ง ์ ํด๊ฒฐ ๋๋ ๊ฑธ๊น?
d.ts ํ์ผ์ ํตํด ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ปดํ์ผ ๋ ๋ ํ์ ์ ์ค์ ํด์ฃผ๋ ๊ฒ์ธ๋ฐ, export{} ์ด ๋ถ๋ถ์ ํตํด์ ์ด ํ์ผ์ด module๋ก์จ ์๋๋๊ฒ ํด์ค๋ค.
ํ์ ์คํฌ๋ฆฝํธ ์ฑ ํ๊ถ์ ์ ๋ ํด์ผ ํ ํ์์ฑ์ ๋๊ผ๋ค.