네이버지도 Cannot read properties of undefined (reading 'maps') 해결방법

bebrain·2023년 7월 15일
1

사용자 위치를 가져와서 현 위치 지도를 띄워주는데 이런 에러가 발생했다.

초기 렌더링시 지도를 불러오지 못하고 에러가 발생, 리렌더링해야 지도가 정상적으로 떴다. 그리고 새로고침을 하면 또 에러가 발생했다.
됐다가안됐다가 미치는상황

Cannot read properties of undefined (reading 'maps')

해결방법

네이버지도api를 불러올때 new naver.maps.Map이라는 형태의 코드를 사용하는데 이 때 아직 api를 콜하기 전, 그러니까 script태그에서 src로 openapi.map.naver를 불러오기 전에 div 안에 지도를 만들려고 해서 발생한 에러였다.

import { useEffect, useRef, useState } from "react";
import { MAP_ID } from "src/assets/constant/HTML_ID";
import styles from "./ModifyPostType.module.scss";
import useGeolocation from "src/util/hooks/useGeolocation";

const NAVER_CLIENT_KEY = import.meta.env.VITE_NAVER_CLIENT_KEY;

function CurrentMap() {
  const mapElement = useRef(null);
  const [map, setMap] = useState<naver.maps.Map | null>(null);
  const { coords } = useGeolocation();

  useEffect(() => {
    const script = document.createElement("script");
    script.id = MAP_ID;
    script.src = `https://openapi.map.naver.com/openapi/v3/maps.js?ncpClientId=${NAVER_CLIENT_KEY}&callback=maps`;
    script.async = true;
    document.head.appendChild(script);

    const { naver } = window;
    if (!mapElement.current || !naver) return;

    // 지도에 표시할 위치의 위도와 경도 좌표를 파라미터로 넣어줍니다.
    // ex) const location = new naver.maps.LatLng(37.5656, 126.9769);
    
    const location = new naver.maps.LatLng(coords.latitude, coords.longitude);
    const mapOptions: naver.maps.MapOptions = {
      center: location,
      zoom: 17,
    };
    const maps = new naver.maps.Map(mapElement.current, mapOptions);
    setMap(maps);
  }, [mapElement.current]);

  return <div ref={mapElement} className={styles.map} />;
}

export default CurrentMap;

구글링을 아무리 해도 클라이언트키 얘기나 도메인등록 얘기만 나와서 골머리를 앓았는데 생각해보니 '그럼 될때까지 리렌더링시켜주면 되잖아...?'싶어서 dependency array에 참조ref를 넣어주니 해결되었다. 누군가는 이 글을 보고 나처럼 삽질하지 않기를😄


는 그냥 카카오맵 쓰세요

1개의 댓글

comment-user-thumbnail
2023년 7월 16일

아.. 진짜 스트레스 받고 있었는데 너무 감사합니다 ㅠㅠ 한 생명(?)을 살리셨어요

답글 달기