TIL

카카오 지도 연동

nana-log 2023. 7. 22. 07:59

카카오 맵 API (Kakao Map API)

카카오 맵 API 를 이용해서 내 프로젝트 안에 지도를 직접 구현해보자

 

카카오 개발자 (Kakao Developers)

카카오 개발자 페이지에 들어가보면 카카오 맵 뿐만 아니라 카카오 로그인, 카카오톡 소셜 등 다양한 API가 제공되는 것을 확인할 수 있다

https://developers.kakao.com/

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

카카오에서 제공하는 개발자 API를 사용하기 위해서는 애플리케이션 추가가 필요하다

로그인 후 내 애플리케이션 메뉴에 접속해보자

애플리케이션 추가하기 버튼을 클릭하면, 추가할 애플리케이션 정보를 입력하는 모달이 열린다

 

여기에 앱 이름사업자명을 필수로 입력해준 후 저장 버튼을 클릭하면 새로운 애플리케이션이 생성된 것을 확인할 수 있다

카카오 맵 구현

카카오 맵을 구현하기 위해 필요한 카카오 맵 API 를 먼저 받아와 보자

문서 > 지도 항목에서, 좌측 사이드바지도를 클릭하면 카카오에서 제공하고 있는 카카오 지도 API 페이지에 접속할 수 있다

 

페이지에 접속했다면, 어떤 브라우저에서 카카오 맵 API를 사용할 건지 선택해야한다

웹 서비스를 개발하는 중이므로 가운데에 있는 Web 을 클릭하자

 

Web 홈페이지에 접속한 후, 왼쪽 하단의 메뉴바에서 [ 키 발급 ] 메뉴를 클릭해서 발급 페이지로 들어간다

 

키 발급 메뉴에 들어가 보면 아까 생성한 애플리케이션 목록을 확인할 수 있다

방금 생성한 애플리케이션을 클릭하면 해당 애플리케이션의 앱 키를 목록을 볼 수 있다

이 중 JavaScript Key를 이용할 것이다

 

Kakao maps API 페이지의 Guide 페이지로 이동하면 카카오 맵을 적용하는 방법이 상세하게 정리돼있다

 

Guide 페이지로 들어왔다면, [ 지도를 띄우는 코드 작성 ] 부분에서 카카오 맵을 설정하는 가이드 라인을 찾을 수 있다

다음 코드를 이용하면 프로젝트에 카카오 맵을 적용할 수 있다

var container = document.getElementById('map'); //지도를 담을 영역의 DOM 레퍼런스
var options = { //지도를 생성할 때 필요한 기본 옵션
	center: new kakao.maps.LatLng(33.450701, 126.570667), //지도의 중심좌표.
	level: 3 //지도의 레벨(확대, 축소 정도)
};

var map = new kakao.maps.Map(container, options); //지도 생성 및 객체 리턴

위의 가이드 라인은 바닐라 (Original) JavaScript와 HTML 기준으로 만들어진 코드다

React 에서, 특히 Next JS 에서는 HTML에 접근할 수 있는 방법이 한정적이기 때문에 위의 가이드라인 만으로는 구현할 수 없다

 

무엇보다 가이드라인에서 사용하고 있는 document 객체는

서버사이드 렌더링을 지원하는 Next.js 에서는 화면을 렌더하기 전까지 생성되지 않은 값 (=undefiend)을 가진다

그렇기 때문에 가이드라인의 코드를 그대로 입력하면 오류가 발생한다

 

그렇다면, 어떻게 해야 Next.js에서 오류 없이 카카오 맵을 불러올 수 있을까?

차근차근 Next.js 에서 카카오 맵을 구현해보자

Head 설정

카카오 맵 그리기

내 애플리케이션에 사이트 도메인 등록

페이지 이동 후 지도 출력해보기 (SPA와 CSR의 이해)


SPA는 서비스에 처음 접속할때 모든 페이지의 데이터를 다 받아오는 방법으로, 페이지 간 이동 시간이 짧은 장점이 있다.

a 태그를 이용하면 오류가 해결되지만, 페이지 이동 시 페이지 자체가 새로 로딩돼서 SPA 프레임워크인 next.js를 사용하는 의미가 없어진다.

이 경우 next.js에서 제공하는 Link 태그를 이용하면 된다.

 

import { useEffect } from "react"

declare const window: typeof globalThis & {
  kakao: any
}

export default function KakaoMapPage() {
  useEffect(() => {
    const script = document.createElement("script")
    script.src =
      "//dapi.kakao.com/v2/maps/sdk.js?autoload=false&appkey=f11887ac006351d52e2ac59b193d4ce2"
    document.head.appendChild(script)

    script.onload = () => {
      window.kakao.maps.load(function () {
        const container = document.getElementById("map") // 지도를 담을 영역의 DOM 레퍼런스
        const options = {
          // 지도를 생성할 때 필요한 기본 옵션
          center: new window.kakao.maps.LatLng(37.462381, 126.813369), // 지도의 중심좌표.
          level: 3, // 지도의 레벨(확대, 축소 정도)
        }

        const map = new window.kakao.maps.Map(container, options) // 지도 생성 및 객체 리턴
      })
    }
  }, [])
  return (
    <>
      {/* <script
        type="text/javascript"
        src="//dapi.kakao.com/v2/maps/sdk.js?appkey=f11887ac006351d52e2ac59b193d4ce2"
      ></script> */}
      <div id="map" style={{ width: 500, height: 400 }}></div>
    </>