사실 카카오 api 개발자 센터에 가면 정말 친절하게 사용법을 정리해놔서 따라치는 게 거의 대부분이었지만
첫 외부 api를 사용해봤고 다른 팀원들이 요구했던 기능들을 추가로 구현해서 기록해놓고 싶다.
/*global kakao*/
import React, { Component } from "react";
import "./KaKaoMap.scss";
class KaKaoMap extends Component {
constructor(props) {
super(props);
this.state = {
clicked: false,
map: null
};
}
componentDidMount() {
const script = document.createElement("script");
script.async = true;
script.src =
"//dapi.kakao.com/v2/maps/sdk.js?appkey=4739d49844352d17f62f36925fe6908b&autoload=false&libraries=services";
document.head.appendChild(script);
script.onload = () => {
kakao.maps.load(() => {
const option = {
center: new kakao.maps.LatLng(0, 0),
level: 4
};
const el = this.mapRef;
//지도생성
const map = new kakao.maps.Map(el, option);
//geocoder라이브러리
const geocoder = new kakao.maps.services.Geocoder();
//좌표변환 함수
const handleAddress = (result, status) => {
if (status === kakao.maps.services.Status.OK) {
const coords = new kakao.maps.LatLng(result[0].y, result[0].x);
//마커이미지
const imageSrc = "https://www.spacecloud.kr/_nuxt/img/cace91f.png", // 마커이미지의 주소
imageSize = new kakao.maps.Size(36, 47), // 마커이미지의 크기
imageOption = { offset: new kakao.maps.Point(27, 69) };
const markerImage = new kakao.maps.MarkerImage(
imageSrc,
imageSize,
imageOption
);
console.log(coords);
//마커를 생성
const marker = new kakao.maps.Marker({
position: coords,
image: markerImage
});
//마커가 지도 위에 표시되도록 설정
marker.setMap(map);
//최초 잠금설정
map.setZoomable(this.state.clicked);
//현재 지도 스테이트에서 관리
this.setState({
map
});
//중심값 변경
map.setCenter(coords);
}
};
//geocoder 라이브러리 addressSearch 메서드 사용
geocoder.addressSearch(this.props.address, handleAddress);
});
};
}
//잠금
handleClick = () => {
this.setState(
{
clicked: !this.state.clicked
}, //setstate는 비동기라서 두번째 콜백함수에서 줌인 아웃 처리
() => {
this.state.map.setZoomable(this.state.clicked);
}
);
};
//줌인 줌아웃
zoomIn = () => {
this.setState({
clicked: true
});
this.state.map.setLevel(this.state.map.getLevel() - 1);
};
zoomOut = () => {
this.setState({
clicked: true
});
this.state.map.setLevel(this.state.map.getLevel() + 1);
};
render() {
const mapWidth = {
width: this.props.width,
height: this.props.height
};
return (
<div className="map_wrap" style={mapWidth}>
<div className="map" id="map" ref={ref => (this.mapRef = ref)}></div>
<div className="custom_zoomcontrol radius_border">
<span
className={
this.state.clicked
? "custom_zoomcontrol_lock"
: "custom_zoomcontrol_unlock"
}
onClick={this.handleClick}
></span>
<span className="custom_zoomcontrol_in" onClick={this.zoomIn}></span>
<span
className="custom_zoomcontrol_out"
onClick={this.zoomOut}
></span>
</div>
</div>
);
}
}
export default KaKaoMap;
css
.map {
width: 100%;
height: 100%;
}
.map_wrap {
position: relative;
overflow: hidden;
width: 764px;
height: 640px;
}
.custom_zoomcontrol {
position: absolute;
top: 20px;
right: 20px;
width: 36px;
height: 120px;
overflow: hidden;
z-index: 1;
}
.custom_zoomcontrol span {
display: block;
width: 36px;
height: 36px;
text-align: center;
cursor: pointer;
}
.custom_zoomcontrol_unlock {
background-image: url("https://www.spacecloud.kr/_nuxt/img/08341ee.png");
background-position: -41px -507px;
margin-bottom: 10px;
}
.custom_zoomcontrol_lock {
background-image: url("https://www.spacecloud.kr/_nuxt/img/08341ee.png");
background-position: -241px -507px;
margin-bottom: 10px;
}
.custom_zoomcontrol_in {
background-image: url("https://www.spacecloud.kr/_nuxt/img/08341ee.png");
background-position: -321px -507px;
}
.custom_zoomcontrol_out {
background-image: url("https://www.spacecloud.kr/_nuxt/img/08341ee.png");
background-position: -349px -380px;
}
.custom_zoomcontrol span img {
width: 15px;
height: 15px;
padding: 12px 0;
border: none;
}
.custom_zoomcontrol span:first-child {
border-bottom: 1px solid #bfbfbf;
}
첫술에 배부를 수는 없지만 많이 아쉬운 프로젝트였다. 많이 구현하지 못한 기능들, 구현하는 데만 급급했던 코드들 등등... 그중 가장 크게 느껴졌던 부분이 프로젝트 발표할 때 내가 만들어온 모든 결과물들이 눈으로 보인다는 것에 대한 부담이 느껴지면서 한편으로는 부끄러웠다. 시간을 핑계로 넘겨버린 별거 아니라고 생각했던 결점들이 몇 배는 크게 보였다.
모든 일이 그렇고 모든 프로그래머들이 그러겠지만 더 성숙한 자세로 책임감을 갖고 코드를 작성해야겠다.