리액트

[네이버지도] 새로고침 해야만 지도가 뜨는 이슈,,

elfinana 2024. 12. 16. 10:46

처음 화면 들어왔을 때 지도가 딱 생겨야 하는데 새로고침 해야만 뜨고있다

 

지도를 그려주는 Script는 페이지가 렌더링 된 후, 비동기적으로 로드되는데, 처음 화면 진입 시, useEffect가 먼저 실행됨

 

그래서 Script 가 다 그려진 후 useEffect가 실행되도록 하여야 함

 
  React.useEffect(() => {
    // 스크립트 로드 여부 확인
    if (!isScriptLoaded) {
      return;
    }


    // 네이버 지도 초기화
    if (window.naver && window.naver.maps) {
      if (!mapRef.current) {
        return;
      }

      mapInstance.current = new window.naver.maps.Map(mapRef.current, {
        center: new window.naver.maps.LatLng(37.5665, 126.978),
        zoom: 13,
      });
      console.log('네이버 지도 초기화 완료');
    } else {
      console.error('네이버 지도 API가 준비되지 않았습니다.');
    }
  }, [isScriptLoaded]);
 
 return (
    <div className="relative h-screen flex flex-col">
      <Script
        src={`https://openapi.map.naver.com/openapi/v3/maps.js?ncpClientId=`}
        strategy="beforeInteractive"
        onLoad={() => {
          setIsScriptLoaded(true); 
        }}
        onError={(error) => {
          console.error('네이버 지도 API 스크립트 로드 실패:', error);
        }}
      />

이렇게 해도 스크립트 로드 완료 시점이랑 지도 초기화 시점이랑 불일치해서 안되었다

 

결론은,, Script를 사용하지 않고 document.createElement를 사용해서 스크립트를 수동으로 로드하였음

 React.useEffect(() => {
    
    // 스크립트 로드
    const script = document.createElement('script');
    script.src = `https://openapi.map.naver.com/openapi/v3/maps.js?ncpClientId=`;
    script.async = true;

    script.onload = () => {
      // 지도 초기화
      if (window.naver && window.naver.maps) {
        if (!mapRef.current) {
          console.error('mapRef가 존재하지 않습니다.');
          return;
        }
        
        mapInstance.current = new window.naver.maps.Map(mapRef.current, {
          center: new window.naver.maps.LatLng(37.5665, 126.978),
          zoom: 13,
        });
    };

되었당