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;