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 ์ด๋ฏธ์ง๊ฐ ๊นจ์ง๋ ํ์์ด๋ ์ธ์ด ์ค์ ๋ฑ ์ถ๊ฐํ ๋ถ๋ถ์ด ๋ง์ต๋๋ค.
ํด๋น ๋ด์ฉ์ ๋ค๋ฅธ ํฌ์คํธ์์ ๋ค๋ฃจ๋๋ก ํ๊ฒ ์ต๋๋ค.