[Next.js] 카카오 지도 안뜨는 현상(흰 화면) 해결

SuJin·2023년 11월 12일
0

Error 해결

목록 보기
3/7

전에 했던 프로젝트에서는 react+typescript로만 카카오 지도 API와 연결을 해보았는데
이번 프로젝트에서는 next.js에서 카카오 지도 API를 사용하게 되었다.

next로는 처음 사용해보니까 이것 저것 찾아보면서 했는데
https://velog.io/@mogulist/use-nextjs-with-kakao-map-declaratively
여기에 나온 방법처럼

// KakaoMap.tsx
import Script from "next/script";
import { Map } from "react-kakao-maps-sdk";

const KAKAO_SDK_URL = `//dapi.kakao.com/v2/maps/sdk.js?appkey=${process.env.NEXT_PUBLIC_KAKAO_MAP_KEY}&autoload=false`;

interface Position {
  latitude: number;
  longitude: number;
}

const KakaoMap = ({ latitude, longitude }: Position) => {
  return (
    <>
      <Script src={KAKAO_SDK_URL} strategy="beforeInteractive" />
      <Map
        center={{ lat: latitude, lng: longitude }}
        level={5}
        style={{ width: "100%", height: "100%" }}
      ></Map>
    </>
  );
};

export default KakaoMap;

이 방식으로 코드를 작성했더니

이런식으로 해당 페이지에 처음 접속할때는 흰화면만 떠서 새로고침을 해야지만 지도가 로딩되는 문제가 발생했었다.

지도 api 사용할 때 흰 화면이 뜨는건 전에 사용해볼때도 경험했던 흔히 발생하는 문제라 검색하면 해결방법은 꽤 많이 나왔지만 custom marker를 사용한 내 코드에는 다 적용이 되지 않았다....

custom marker는 무조건 <Map> 컴포넌트 안에 있어야 해서 <div id="map"> 방식을 사용한 코드는 아예 적용이 되지 않았고 useEffect()도 방식도 해결해주지 못했다....

며칠동안 고민을 했었는데 진짜 생각보다 간단하게 갑자기 에러를 읭? 하고 고쳐버렸다~
https://mycodings.fly.dev/blog/2023-06-26-howto-nextjs-react-kakao-map-api
여기에서 말해준것처럼 _document.tsx 파일에 script 코드를 추가해주면 된다

// _document.tsx
import { Html, Head, Main, NextScript } from "next/document";
import Script from "next/script";

export default function Document() {
  return (
    <Html lang="en">
      <Head />
      <body>
        <Script
          strategy="beforeInteractive"
          src={`//dapi.kakao.com/v2/maps/sdk.js?appkey=${process.env.NEXT_PUBLIC_KAKAO_MAP_KEY}&libraries=services&autoload=false`}
        ></Script>
        <Main />
        <NextScript />
      </body>
    </Html>
  );
}

분명 이 방법을 전에 사용했었는데 이 방법을 사용할때는 useEffect() 를 사용해서 만들었었다. 근데 useEffect()는 div id를 map으로 해야했기에 여러 방법을 고민해보다가 _document.tsx 내용을 그대로 냅두고 처음으로 되돌아가서 KakaoMap.tsx 내용을

// KakaoMap.tsx
import Script from "next/script";
import { Map } from "react-kakao-maps-sdk";

const KAKAO_SDK_URL = `//dapi.kakao.com/v2/maps/sdk.js?appkey=${process.env.NEXT_PUBLIC_KAKAO_MAP_KEY}&autoload=false`;

interface Position {
  latitude: number;
  longitude: number;
}

const KakaoMap = ({ latitude, longitude }: Position) => {
  return (
    <>
      <Script src={KAKAO_SDK_URL} strategy="beforeInteractive" />
      <Map
        center={{ lat: latitude, lng: longitude }}
        level={5}
        style={{ width: "100%", height: "100%" }}
      ></Map>
    </>
  );
};

export default KakaoMap;

이걸로 되돌렸는데 성공했다.

여기에 script를 생성한게 문제였던것 같다.
그래서 저 코드에서 script를 다 삭제하고

// KakaoMap.tsx
import { Map } from "react-kakao-maps-sdk";
import { ReactNode } from "react";

interface Position {
  latitude: number;
  longitude: number;
  children: ReactNode;
}

const KakaoMap = ({ latitude, longitude, children }: Position) => {
  return (
    <Map
      center={{ lat: latitude, lng: longitude }}
      level={5}
      style={{ width: "100%", height: "100%" }}
    >
      {children}
    </Map>
  );
};

export default KakaoMap;

순수하게 이 내용만 적어줬더니 문제가 해결되었다.

나의 오류 해결과정기를 다 적고 나서 발견했는데
https://react-kakao-maps-sdk.jaeseokim.dev/docs/setup/next
react kakao maps sdk / next.js example에서 정말 정확히 내가 말한 이 방법을 사용하고 있다.
공식문서를 잘 확인하자 ^^

profile
Anyone can be anything.

0개의 댓글