아래 사진과 같이 react-kakao-maps-dsk를 이용해 지도를 구현하고 주소에 해당하는 부분(충청북도 단양군 단양읍 고수동굴길 8)에 마커 표시를 구현할 것이다.

1. 카카오 개발자 어플 등록
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
위 링크로 들어가 로그인을 한 후, 내 어플리케이션으로 이동해 어플리케이션을 추가해준다.
등록 후, 아래과 같이 플랫폼으로 이동해 Web에 http://localhost:3000을 추가해준다.

앱 키로 이동해 JavaScript 키를 복사해준다.

2. react에 카카오 Map설치
프로젝트로 이동해 public에 있는 index.html에서 script부분에 아래와 같이 발급받은 javascript 앱 키를 추가해준다.
여기서 주의할 점은 반드시 libraries=services를 추가해줘야 한다.
<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=앱 키&libraries=services"></script>
그리고 터미널에 아래 명령어를 입력해 sdk를 설치해준다.
npm install react-kakao-maps-sdk
3. 지도 불러오기 + 주소에 해당하는 마커 표시하기
먼저 코드에 대한 설명을 하자면, DetailMap은 다른 컴포넌트에서 address라는 값을 전달 받아 그 주소에 해당하는 위치에 마커를 표시한다.
const [state, setState] = useState({
// 지도의 초기 위치
center: { lat: null, lng: null },
// 지도 위치 변경시 panto를 이용할지(부드럽게 이동)
isPanto: true,
});
state는 마커를 표시할 좌표값을 저장하는 변수이다. 그 안에는 center라는 위도, 경도 값을 저장하는 값과, isPanto라는 지도 변경시 어떻게 이동하는지를 결정하는 값이 있다.
const [searchAddress, SetSearchAddress] = useState(address);
searchAddress는 주소이다. 다른 컴포넌트에서 전달 받은 address값을 searchAddress에 저장한다. 테스트를 할 때 useState(" 충청북도 단양군 단양읍 고수동굴길 8 ") 이런 식으로 주소값을 주어 마커가 잘 찍히는지 테스트해보면 된다.
const geocoder = new kakao.maps.services.Geocoder();
주소를 좌표로 변환해주는 함수이다. 정확히는 services 라이브러리를 사용하는 것이다. Geocoder는 주소를 좌표로 변환하거나, 좌표를 주소로 변환하는 기능을 제공하는 객체이다.
// 주소를 좌표로 변환하여 state에 저장
let callback = function(result, status) {
if (status === kakao.maps.services.Status.OK) {
const newSearch = result[0]
setState({
center: { lat: newSearch.y, lng: newSearch.x }
})
}
};
geocoder.addressSearch(`${searchAddress}`, callback);
callback함수는 주소를 좌표로 변환한 결과(result)와 변환이 성공했는지를 나타내는 상태(status)를 인수로 받는 함수이다.
result매개변수는 변환된 좌표 정보를 담고 있는 배열 변수이다. 변환된 주소가 여러 개일 수 있기 때문에 배열로 반환한다. 참고하자면 여러 개 일 때는 키워드로 지도에 여러 개의 마커를 표시할 때 사용한다.
나는 주소에서 한 개의 마커만 표시하므로 첫 번째로 반환된 값인 result[0]만 newSearch에 저장하여 마커를 표시하는 좌표를 저장하는 state의 center값에 위도, 경도 값을 저장해준다.
<KakaoMap
center={state.center}
isPanto={state.isPanto}
style={{
width: "100%",
height: "200px",
}}
level={2}
>
카카오 지도를 표시한다. 중심좌표 값인 center를 반환된 위도, 경도 값으로 지정해주고, isPanto값도 저장해준다. level은 확대된 정도로 숫자가 작을 수록 많이 확대된 지도가 출력된다.
<MapMarker position={state.center}/>
지도에 중심위치에 해당하는 마커를 표시한다.
전체 코드는 다음과 같다.
import { useEffect, useMemo, useState } from "react";
import { Map as KakaoMap, MapMarker } from "react-kakao-maps-sdk";
import { useNavigate } from 'react-router-dom';
const {kakao} = window;
function DetailMap({ address }) {
const [state, setState] = useState({
// 지도의 초기 위치
center: { lat: null, lng: null },
// 지도 위치 변경시 panto를 이용할지(부드럽게 이동)
isPanto: true,
});
// 주소 변수
const [searchAddress, SetSearchAddress] = useState(address);
// 주소에 해당하는 마커 표시
useEffect(() => {
// 주소를 좌표로 변환한는 함수
const geocoder = new kakao.maps.services.Geocoder();
// 주소를 좌표로 변환하여 state에 저장
let callback = function(result, status) {
if (status === kakao.maps.services.Status.OK) {
const newSearch = result[0]
setState({
center: { lat: newSearch.y, lng: newSearch.x }
})
}
};
geocoder.addressSearch(`${searchAddress}`, callback);
}, [])
return (
<div>
<KakaoMap
center={state.center}
isPanto={state.isPanto}
style={{
width: "100%",
height: "200px",
}}
level={2}
>
{!state.isLoading && (
<MapMarker position={state.center}/>
)}
</KakaoMap>
</div>
)
}
export default DetailMap;
참고
https://react-kakao-maps-sdk.jaeseokim.dev/docs/sample/overlay/geolocationMarker/
geolocation으로 마커 표시하기 | react-kakao-maps-sdk docs
HTML5 GeoLocation을 이용해 접속위치를 얻어오고 접속위치에 마커와 인포윈도우를 표시합니다.
react-kakao-maps-sdk.jaeseokim.dev
React / 카카오 지도 API - 주소 검색
지도를 가져오고 나서 첫번째로 해야 될 것은주소를 검색했을 때 그 위치로 지도를 움직이는 기능이었다ReactKakaoMapSDK에는 키워드 장소 검색 기능만 있고주소 검색기능이 없어서 kakaoMapApi 의 주
velog.io
'🌐 Web > React' 카테고리의 다른 글
[React] 로컬에서 HTTPS 환경 설정하기(Windows) (0) | 2024.07.02 |
---|---|
[React + TypeScript] select 직접 구현하기(2) (1) | 2024.01.24 |
[React + TypeScript] select 직접 구현하기(1) (1) | 2024.01.22 |
[React + Spring Boot] Spring Boot(eclipes)와 React 연결(2) (0) | 2023.04.08 |
[React + Spring Boot] Spring Boot(eclipes)와 React 연결(1) (0) | 2023.04.07 |