지난 시간에 튜터님과 이번주까지 마무리하기로 했던 작업은 얼추 완성이 되었다. 순조롭게 진행된 부분도 있고 막혀서 하루종일 삽질한 부분도 있지만, 그래도 완성되어 가는 모습을 보니 감회가 새롭다.
서버 - 프론트 페이지 구동 1차 완성!
(1) 기본적인 HTML 틀 잡기
(2) 구글 지도 서울을 중심으로 띄우기
(3) mongodb에 임시 DB 넣기
(4) 임시 DB API로 연결하기
(5) 임시 DB 장소들 지도에 마커 표시하기 (for문 활용)
(6) 카테고리 필터 적용하기 (조건문)
(7) 마커 클릭하면 나오는 인포윈도우 구현하기
(8) 인스타그램 해시태그 후기 크롤링하기
그날그날 개발일지를 쓰고 싶었지만, 한동안 밀렸던 이유 중 하나는 바로 인포윈도우 띄우는 작업 때문이다. 아래 링크를 참고하면 금방 끝나는 작업일거라 예상했지만, 생각보다 그렇게 호락호락한 건 없었다...
구글맵 API 이벤트 관련 자료:
https://developers.google.com/maps/documentation/javascript/reference/event#MapsEventListener
구글맵 API 인포윈도우 이벤트 자료:
https://developers.google.com/maps/documentation/javascript/infowindows
$.ajax({
type: 'GET',
url: url,
data: {},
success: function (response) {
if (response['result'] == 'success') {
let bakerys = response['bakerys_list']
for (let i = 0; i < bakerys.length; i++) {
var bakery = { lat: bakerys[i]['latitude'], lng: bakerys[i]['longitude'] }
var marker = new google.maps.Marker({ position: bakery, map: map, title: bakerys[i]['name'] });
//인포 윈도우 생성
contentString = `<div>
<h4>${bakerys[i]['name']}🍞</h4>
<hr>
<p>주소: ${bakerys[i]['address']}</p>
<p>영업시간: ${bakerys[i]['openinghours']}</p>
<p>연락처: ${bakerys[i]['contact']}</p>
<br>
<p><b>#${bakerys[i]['name']}</b></p>
</div>`
marker.addListener('click', function () {
infowindow.open(map, marker);
});
var infowindow = new google.maps.InfoWindow({
content: contentString
});
}
}
}
});
결론적으로는 반복문을 사용해서 하나의 마커에 하나의 인포윈도우를 생성해주려면, marker1, marker2 /infowindow1, infowindow2 이런식으로 고유의 변수값을 지정해서 marker1→infowindow1 요렇게 연결해야 한다는 것. 설명을 듣고 보니 참 간단한데, 왜 혼자할 때는 잘 안 보이는 건지 모르겠다. 여하튼 어찌저찌 튜터님의 도움을 받아 marker와 infowindow들을 리스트로 만들어주었고, 리스트에 담긴 변수를 하나하나 매칭해주는 식으로 코드를 수정하여 인포윈도우를 띄우는데 성공했다.
$.ajax({
type: 'GET',
url: url,
data: {},
success: function (response) {
if (response['result'] == 'success') {
let bakerys = response['bakerys_list'];
let markerList = [];
let infoWindowList = [];
for (let i = 0; i < bakerys.length; i++) {
var bakery = { lat: bakerys[i]['latitude'], lng: bakerys[i]['longitude'] }
var marker = new google.maps.Marker({ position: bakery, map: map, title: bakerys[i]['name'] });
//인포 윈도우 생성
let contentString = `<div>
<h4>${bakerys[i]['name']}🍞</h4>
<hr>
<p>주소: ${bakerys[i]['address']}</p>
<p>영업시간: ${bakerys[i]['openinghours']}</p>
<p>연락처: ${bakerys[i]['contact']}</p>
<br>
<p><b>#${bakerys[i]['name']}</b></p>
</div>`
var infowindow = new google.maps.InfoWindow({
content: contentString
});
markerList.push(marker);
infoWindowList.push(infowindow);
}
for (let i = 0; i < markerList.length; i++) {
markerList[i].addListener('click', function () {
infoWindowList[i].open(map, markerList[i]);
});
}
}
}
});
삽질하면서 느낀 첫 번째 교훈은 아주 당연하게도 기본기가 가장 중요하다는 점이다. 지금 프로젝트를 하면서는 일단 당장 기능 구현해내는데 급급해서, 이 기능이 어떻게 동작하는지 완전히 100% 이해하고 코드를 짜고 있다고 자신있게 말하기엔 무리가 있다. 아무래도 프로젝트 페이지를 완성하고 나면 사용한 코드들 개념을 하나하나 다시 정리하고, 개선할 부분 없는지 곱씹어 보는 시간이 필요할 것 같다.
두 번째 교훈은 정 안되겠을 때는 혼자 괜히 고집부리지 말고 물어보는게 해결책이라는 점이다. 물론 결국은 혼자 하는 작업이니 모든걸 다짜고짜 다 질문할 수는 없겠지만, 진짜 개념적으로 아무리 봐도 이해가 안 될 때는 도움을 청하자😀