nextjs , typescript 활용 했습니다.
layout.tsx 에는 아래 코드를 적용 하였습니다
html lang=“en” className={GeistSans.className}>
<Script
src=“https://dapi.kakao.com/v2/maps/sdk.js?appkey=“내키”&libraries=services,clusterer”
strategy=“afterInteractive” />
{children}
TopMenu.tsx에는 아래 코드를 적용 하였습니다.
declare global {
interface Window {
kakao: any;
}
}
const { kakao } = window; 여기 값은 잘 나옵니다
const geocoder = new kakao.maps.services.Geocoder();
kakao.maps.services: undefined
Cannot read properties of undefined (reading ‘Geocoder’) 나옵니다 어떻게 해결 해야하나요?
스크립트가 모두 다운로드된 이후 객체에 접근을 해야 하는데 그전에 객체에 접근을 해서 난 오류로 보입니다.
그리고 SDK는 내부에서 스크립트를 추가하는 부분이 있어서 next/script를 사용하면 script태그 관련 warning 문구가 보일 수 있기 때문에 아래 1번 방법 보단 스크립트를 클라이언트에서 동적으로 호출하는 방법을 추천드립니다.
두 방법을 적용해서 확인해 주세요.
-
일반 스크립트 태그로 sdk를 호출
<script src="https://dapi.kakao.com/v2/maps/sdk.js?appkey=앱키&libraries=services,clusterer"></script>
-
useEffect 훅에서 동적으로 스크립트를 로드한 후 sdk가 모두 다운로드되면 객체 생성하는 방법
import { useEffect, useRef } from 'react';
export default function KakaoMap() {
const container = useRef();
useEffect(() => {
const script = document.createElement('script');
script.src = "https://dapi.kakao.com/v2/maps/sdk.js?autoload=false&appkey=앱키&libraries=services,clusterer";
document.head.appendChild(script);
script.onload = () => {
kakao.maps.load(function() {
const mapContainer = document.getElementById('map');
const mapOption = {
center: new kakao.maps.LatLng(33.450701, 126.570667),
level: 3
};
// 지도를 표시할 div와 지도 옵션으로 지도를 생성합니다
const map = new kakao.maps.Map(mapContainer, mapOption);
// geocorder 객체 생성합니다.
const geocorder = new kakao.maps.services.Geocoder();
console.log(geocorder);
});
};
}, [container]);
return (
<div id="map" style={{width: '100%', height: '600px'}} ref={container}></div>
)
}