이번 검색에서는 react가 아닌 nextjs에서 사용을 했었는데, react에서 사용하는 라이브러리인 react-kakao-maps-sdk를 처음에 사용했었다.
하지만 nextjs에서 맵을 좌표로 띄울때는 편했지만, 검색 기능 사용법을 몰라서 기본적인 API로 검색하게 되었다.
방식은 카카오톡에 나와있는 방식 그대로 사용하였다.
kakaoMap 컴포넌트를 따로 만들었고,
import React, { useEffect, useState } from "react";
// 카카오 api에서 받아온 token값을 입력해주고, 뒤의 libraries=services를 입력해줘야지 검색 기능을 사용할 수 있다.
const KAKAO_SDK_URL = `//dapi.kakao.com/v2/maps/sdk.js?appkey=${process.env.NEXT_PUBLIC_MAP_TOKEN}&libraries=services,clusterer&autoload=false`;
const KakaoMap = ({ location }: { location: string }) => {
useEffect(() => {
const kakaoMapScript = document.createElement("script");
kakaoMapScript.async = false;
kakaoMapScript.src = KAKAO_SDK_URL;
document.head.appendChild(kakaoMapScript);
const onLoadKakaoAPI = () => {
window.kakao.maps.load(() => {
var infowindow = new kakao.maps.InfoWindow({ zIndex: 1 });
var container = document.getElementById("map") as HTMLElement;
var options = {
center: new window.kakao.maps.LatLng(33.450701, 126.570667),
level: 3,
};
var map = new window.kakao.maps.Map(container, options);
var ps = new kakao.maps.services.Places();
// 이함수에서 location에 주소를 입력하면 위치를 새로 등록한다.
ps.keywordSearch(location, placesSearchCB);
// 키워드 검색 완료 시 호출되는 콜백함수 입니다
function placesSearchCB(data: any, status: any, pagination: any) {
if (status === kakao.maps.services.Status.OK) {
// 검색된 장소 위치를 기준으로 지도 범위를 재설정하기위해
// LatLngBounds 객체에 좌표를 추가합니다
var bounds = new kakao.maps.LatLngBounds();
if (data.length) {
displayMarker(data[0]);
bounds.extend(new kakao.maps.LatLng(data[0].y, data[0].x));
}
// 검색된 장소 위치를 기준으로 지도 범위를 재설정합니다
map.setBounds(bounds);
}
}
// 지도에 마커를 표시하는 함수입니다
function displayMarker(place: any) {
// 마커를 생성하고 지도에 표시합니다
var marker = new kakao.maps.Marker({
map: map,
position: new kakao.maps.LatLng(place.y, place.x),
});
// 마커에 클릭이벤트를 등록합니다
kakao.maps.event.addListener(marker, "click", function () {
// 마커를 클릭하면 장소명이 인포윈도우에 표출됩니다
infowindow.open(map, marker);
});
}
});
};
kakaoMapScript.addEventListener("load", onLoadKakaoAPI);
}, [location]);
return (
<>
<div id="map" style={{ width: "100%", height: "100%" }}></div>
</>
);
};
export default KakaoMap;
위와 같이 미리 token 값을 받아서 api url을 등록하고 document에 id를 map으로 지정하고 지도를 만든 후 검색으로 위치를 새로 잡아 지도에 마커를 띄어주고 마지막에 div에 id로 map을 입력하여 div에 지도를 띄워줄 수 있는 방식이다.
위와 같은 방식으로 location에 주소나 검색이 들어갈 경우 지도에 표시해 줄수 있다.