지도를 얼마나 잘 활용하는지가 이번 프로젝트에서의 핵심이다. 흔히 알려진 api로는 구글맵,kakao map, naver map이 있다. 이번에는 비교적 친숙한 naver map을 사용하기로 했다.
naver map api는 html과 javascript를 바탕으로 안내가 되어 있어, react에 적용해야 하는 것도 함께 고려하면서 api 문서를 활용해야 했다.
<html lang="en">
<head>
<script
type="text/javascript"
src="https://openapi.map.naver.com/openapi/v3/maps.js?ncpClientId=########"
></script>
<title>Go Camp</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
import { useEffect, useRef } from "react";
const { naver } = window;
const Map = () => {
const mapRef = useRef(null);
const initialZoomLevel = 10;
useEffect(() => {
if (mapRef.current === null) {
// map 생성
mapRef.current = new naver.maps.Map("map", {
// 맵 로드 시 최초 위치(위,경도 순으로 작성)
center: new naver.maps.LatLng(latitude, longitude),
// 축소할 수 있는 최대 zoom level
minZoom: 9,
// 맵 로드 시의 zoom level
zoom: initialZoomLevel,
});
}, []);
return (
<>
<div id="map" style={{ width: "100vw", height: "100vh" }}></div>
</>
);
};
export default Map;
// 위치 초기화 함수.
const setInitialLocation = (set, zoomLevel) => {
// 브라우저에서 위치 공유를 허용한 경우, 전달 받은 setState 함수를 통해 내 위치 정보를 state에 넣는다.
const success = (position) => {
set({
lat: position.coords.latitude,
lng: position.coords.longitude,
zoom: zoomLevel,
});
};
// 실패할 경우, 특정 위치의 위경도를 직접 넣어준다.
const failed = () => {
set({
lat: 37.579838,
lng: 126.9770517,
zoom: zoomLevel,
});
};
// 브라우저 위치 공유 기능 설정
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(success, failed);
}
};
setInitialLocation
을 통해 현재 내 위치를 초기화시킨다. useRef.current.map
을 통해 DOM을 관리한다. 순서
렌더링 > useEffect : setIntialLocation (내 위치 초기화) > myLocation 상태값 변경 > useEffect : 맵 로드
import { useRecoilState } from "recoil";
const Map = () => {
const mapRef = useRef({ map: null, markerList: [], marker: null });
const [myLocation, setMyLocation] = useRecoilState(myLocationState);
const initialZoomLevel = 10;
// 현재 위치 초기화
useEffect(() => {
setInitialLocation(setMyLocation, initialZoomLevel);
}, []);
//
useEffect(() => {
if (!myLocation.lat) return;
if (mapRef.current.map === null) {
mapRef.current.map = new naver.maps.Map("map", {
// 내 위치 설정
center: new naver.maps.LatLng(myLocation.lat, myLocation.lng),
minZoom: 9,
zoom: initialZoomLevel,
});
}
}, [myLocation]);