Next.js에서 Leaflet Marker 이미지 로딩하기
React-leaflet에서 제공하는 기본 설정 방법에 따라 leaflet 코드를 구현하여도 맵은 표시되지만 Marker 이미지는 깨져서 표시됩니다.
Next.js에서 이미지는 Next/image와 이미지 상대 주소를 import하여 사용하면 잘 로딩이 되지만 상대 경로 url을 직접 사용하면 작동하지 않습니다.
예를 들면 다음과 같은 상황입니다.
import Image from "next/image";
import logo from "../../styles/images/logo.png";
//작동함
<Image src={logo} alt="logo />
//작동하지 않음
<Image src={"../../styles/images/logo.png"} alt="logo" width="100px" height="100px" />
이는 Next.js에 정해진 폴더 규칙이 있기 때문인데요. 만약 경로를 사용해 이미지나 파일을 가져오고 싶다면 public 폴더를 이용해야 합니다.
빌드 후 기본 폴더는 public이므로 public 폴더 내 logo.png 파일을 넣는 경우 /logo.png로 접근이 가능합니다.
import Image from "next/image";
<Image src={"/logo.png"} alt="logo" width={"100px"} height={"100px"} />
Marker 이미지 표시하기
이를 참고하면 Marker 이미지 부분도 icon을 사용해서 응용할 수 있습니다.
public 폴더 내 images 폴더를 만들고 logo.png 파일을 넣은 뒤 다음과 같이 사용합니다.
import { MapContainer, TileLayer, useMap, Marker, Popup } from "react-leaflet";
import "leaflet/dist/leaflet.css";
import { icon } from "leaflet";
const Icon = icon({
iconUrl: "images/logo.png",
iconSize: [24, 24],
iconAnchor: [12, 24],
});
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]} icon={Icon} >
<Popup>서울 시청</Popup>
</Marker>
</MapContainer>
);
};
export default MyMap;