Next.js와 leaflet이 만나기 위해서는 참고해야 할 사이트가 많습니다.
leafletjs.com
react-leaflet.js.org
openstreetmap.org
간략하게 정리해보겠습니다.
1. 라이브러리 설치
Next.js + Typescript는 설치되었다고 가정하겠습니다.(관련 포스팅 클릭)
npm i leaflet react-leaflet
Typescript 지원을 위한 라이브러리도 설치합니다.
npm i -D @types/leaflet
2. 코드 구현하기
다음과 같이 컴포넌트를 생성합니다.
import “leaflet/dist/leaflet.css”; 를 설정하지 않으면 맵이 깨져서 표시가 되고 style에 사이즈를 설정하지 않으면 하얀 화면만 나오니 두 부분 모두 주의해야 합니다.
scrollWheelZoom은 스크롤 확대/축소 기능을 설정합니다.
import { MapContainer, TileLayer, useMap, Marker, Popup } from "react-leaflet";
import "leaflet/dist/leaflet.css";
const MyMap = () => {
return (
<MapContainer
center={[37.56675, 126.97842]}
zoom={10}
scrollWheelZoom={true}
style={{ width: "500px", height: "500px" }}
>
<TileLayer
attribution='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
<Marker position={[37.56675, 126.97842]}>
<Popup>서울 시청</Popup>
</Marker>
</MapContainer>
);
};
export default MyMap;
별도의 컴포넌트를 생성하는 이유는 관리를 위한 분리도 있지만 Next.js의 특성상 서버 렌더링 시 window 전역 객체에 접근할 수 없는 문제로 인해 발생하는 에러를 해결하기 위해서입니다.
DOM이 생성된 뒤 실행되는 useEffect를 사용하거나 레이지 로딩 기능인 dynamic을 사용할 수 있으며 여기서는 dynamic 기능을 사용하겠습니다.
같은 위치에 다음 컴포넌트를 생성합니다.
import dynamic from "next/dynamic";
const MyMap = dynamic(() => import("./MyMap"), { ssr: false });
const ShowMap = () => {
return <MyMap />;
};
export default ShowMap;
이것으로 기본 구현은 완료되었으며 다음과 같이 맵을 호출하면 됩니다.
<ShowMap />
결과는 다음과 같습니다.
이것으로 Next.js에서 Leaflet을 사용하기 위한 설정이 완료되었지만 Marker 이미지가 깨지는 현상이나 언어 설정 등 추가할 부분이 많습니다.
해당 내용은 다른 포스트에서 다루도록 하겠습니다.