2023년 현대 모비스 해커톤 참여시에 카카오맵 API를 활용하여 지도를 사용하였다. 이것 저것 시도해보며 나름대로 성공한 방법을 공유(?), 정리하였다.
관련 설명은 여기에서 확인할 수 있다.
우선 다음과 같이 입력해 kakao maps sdk
를 install
한다.
// npm일 경우
npm install react-kakao-maps-sdk
// yarn일 경우
yarn add react-kakao-maps-sdk
카카오맵 API를 사용하기 위해서는 키 발급이 필요하다. 키 발급은 여기서 가능하다.
우측 상단에 APP KEY 발급
을 클릭해 key를 발급받을 수 있다.
애플리케이션 추가하기
를 클릭해 관련 정보를 입력하자. 단순한 프로젝트라면 크게 신경쓰지 않고 자유롭게 입력해도 된다.
해당 애플리케이션 페이지 좌측 탭에서 앱 키
페이지를 통해 key
를 확인할 수 있다. 유출되지 않도록 주의하자. (이와 관련해서는 .env
로 관리할 예정)
key
만 받았다고 바로 사용할 수 있는건 아니다. 하단에 Web 플랫폼 등록
을 통해 사이트 도메인을 추가해야 정상적으로 api 사용이 가능하다. local에서 작업할 경우, 보통 http://localhost:3000
이니 다음과 같이 입력해주도록 하자.
발급한 key
를 적용해보자. JavaScript 키
를 복사해서 프로젝트 파일의 public/index.html
에 아래를 추가하자.
<script
type="text/javascript"
src="//dapi.kakao.com/v2/maps/sdk.js?appkey=여기에키값입력&libraries=services"
></script>
필자는 다음과 같이 추가했다.
여기서 키값 위치 뒤에 &libraries=services
는 Kakao 지도 API에서 추가로 제공하는 라이브러리를 사용한다는 의미로, 뒤에서 다룰 기능을 사용하기 위해서는 추가해야 한다. 이와 관련된 내용은 여기를 참고하자.
추가적으로 키값을 환경변수로 관리하고 싶다면, package.json
이 존재하는 경로에 .env
파일을 생성한 이후, 다음과 같이 입력해 저장한다.
REACT_APP_KAKAO_API=여기에 키값 입력
github에 .env
가 올라가는 것을 방지하기 위해 gitignore
에 .env
를 추가 작성한다.
환경변수 값을 수정했다면 재실행하는 것을 잊지 말자.
우선 지도를 띄우고 싶은 페이지 최상단에 다음을 추가한다.
/* global kakao */
그리고 다음을 import
한다.
import { Map, MapMarker } from "react-kakao-maps-sdk";
const { kakao } = window;
여기서 Map
이 지도를 표시하고, MapMarker
가 지도상에 마커를 찍는 역할을 한다. styled-component
를 이용하여 다음과 같이 작성하였다.
const StyledMap = styled(Map)`
width: 310px;
height: 310px;
border-radius: 15px;
border: 1px solid #bdbdbd;
`;
위 component를 이용하여 아래와 같이 작성해 맵을 화면상에 띄울 수 있다.
<StyledMap center={{ lat: latitude, lng: longitude }} isPanto={true}>
<MapMarker position={{ lat: latitude, lng: longitude }} />
</StyledMap>
여기서 latitude
와 longitude
는 다음과 같이 state
로 관리하였다.
const [latitude, setLatitude] = useState(37.44937029089704);
const [longitude, setLongitude] = useState(126.65436049042351);
즉, 특정 위치에 지도와 마커만 띄운다면, 원하는 위치의 위도와 경도를 바로 넘겨주어도 상관없다. 이러한 경우에는 지도의 확대와 축소 등을 막아야할 경우도 있을 것이다. 이와 관련된 내용은 여기를 확인해보자.
최종적으로 이를 위해 경도와 위도를 state
로 관리하였다. input
태그에서 onKeyPress
이벤트를 이용하여 다음과 같이 함수를 작성하였다.
const checkEnter = (e) => {
let ps = new kakao.maps.services.Places();
const placesSearchCB = function (data, status, pagination) {
if (status === kakao.maps.services.Status.OK) {
const newSearch = data[0];
setLatitude(newSearch.y);
setLongitude(newSearch.x);
}
};
if (e.key === "Enter") {
e.preventDefault();
ps.keywordSearch(location, placesSearchCB);
}
};
여기서 하단의 if문은 input
창에서 Enter
를 눌렀는지를 판단하기 위함이며, 눌렀을 때, 입력한 키워드를 바탕으로 검색한 결과 중에, 최상단 결과에 대한 위치의 위도와 경도 state
를 업데이트해준다. location
은 input
태그에 입력된 내용을 저장하는 state
이며, 이 또한 별도로 다음과 같은 함수를 통해 업데이트 해준다.
const locationChanged = () => {
setLocation(locationRef.current.value);
};
최종적으로 다음과 같은 결과창을 확인할 수 있다.
잘 보고 갑니다~