위의 기능 중에 필요한 기능을 선택하면 된다.
일단 테스트 용으로 입력해두었다.
이따가 사용할 인증 KEY이다. 그냥 직접 사용하지말고 .env
에 저장해서 사용하고 .env
는 .gitignore
에 추가해서 다른사람들은 사용할 수 없게 해놓자. api 호출이 일정 이상되면 요금이 부과되기 때문에 github에 노출되지 않게 조심해야함.
<script type="text/javascript" defer src="https://openapi.map.naver.com/openapi/v3/maps.js?ncpClientId=본인clientID"></script>
NCP 지도 문서, 다른 블로그를 참고하는데 분명 똑같이 해도 안되다가 위 script
에 defer
넣어서 해결했다.. 1시간 정도 해맸다.
typescript에서는 window.naver
를 사용할 때 바로 오류가 나기 때문에 타입을 설치해줘야 한다.
npm install @types/navermaps
import React, { useEffect, useRef } from "react";
import RecordHeader from "../common/components/RecordHeader";
import "./MapPage.scss";
import park from "./park.jpg";
function MapPage() {
const mapElement = useRef(null);
useEffect(() => {
if(!mapElement.current || !naver) return;
const location = new window.naver.maps.LatLng(37.5656, 126.9769);
const mapOptions: naver.maps.MapOptions = {
center: location,
zoom: 17,
zoomControl: true,
// zoomControlOptions: {
// position: window.naver.maps.Position.TOP_RIGHT,
// },
};
const map = new naver.maps.Map(mapElement.current, mapOptions);
const markerOptions = {
position: location,
map,
icon: {
content: [
`<div class="pin">`,
`<img src=${park} alt="pin"/>`,
`</div>`
].join(''),
size: new naver.maps.Size(100, 100),
origin: new naver.maps.Point(0, 0),
}
};
const marker = new naver.maps.Marker(markerOptions);
}, []);
const mapStyle = {
width: '100vw',
height: '80vh',
}
return <div>
<RecordHeader/>
<div ref={mapElement} style={mapStyle} />
</div>
}
export default MapPage;
html방식으로 marker를 띄우려면 content
속성을 사용하고 문자열 배열 형식으로 태그를 넣어주면 된다. 각 태그의 style은 외부 css파일로 커스텀이 가능하다.
.pin{
width: 100px;
height: 100px;
display: flex;
justify-content: center;
align-items: center;
border: 1px solid black;
border-radius: 100%;
background-color: white;
z-index: 2;
img{
width: 90px;
height: 90px;
border-radius: 100%;
z-index: 3;
}
&::after{
border-top: 10px solid white;
z-index: 1;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-bottom: 0px solid transparent;
content: "";
position: absolute;
top: 100px;
}
&::before{
border-top: 10px solid black;
z-index: 1;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-bottom: 0px solid transparent;
content: "";
position: absolute;
top: 101px;
}
}
marker의 꼬리(삼각형)에 테두리를 주기 위해 before, after 둘다 사용했다.