Vue.js에서 카카오맵 api 클러스터 사용시 에러

안녕하세요.

vue에서 카카오맵 api를 테스트 해보던 중 문제가 생겨서 질문드립니다. 해당 예제를 따라하는 데에 https://github.com/okchangwon/vue-daum-map 의 라이브러리를 사용했습니다.


  1. 클러스터 예제를 그대로 따라서(데이터만 다른 json 파일을 만들어서 썼습니다.) 했는데, 클러스터가 화면에 표시는 되지만 에러가 1개 뜹니다. (저 클러스터를 화면에서 확인한 이후에는 맵을 움직일 수 없고 휠로 확대/축소만 됩니다.)
    K-001

  2. 거기서 휠을 돌려서 확대를 하면 아래와 같이 무언가를 찾을 수 없다고 에러가 계속해서 뜹니다.
    K-002

주소의 위도와 경도를 가지고 따로 마커를 띄우는 건 문제 없이 되는데 마커 클러스터를 띄우려고 하니 이런 오류가 발생하네요. 참고하실 수 있도록 해당 컴포넌트의 코드와 json 코드를 첨부합니다.
(아래 코드에서 json 데이터는 console.log()로 찍어보니 데이터가 잘 나오는 것까진 확인했습니다.)

// Home.vue
<template>
  <div class="home">
    <vue-daum-map
      :appKey="appKey"
      :center="center"
      :level="level"
      :mapTypeId="mapTypeId"
      :libraries="libraries"
      @load="onLoad"
      style="width:500px;height:400px;"
    />
  </div>
</template>

<script>
import VueDaumMap from 'vue-daum-map';

export default {
  name: 'Home',
  components: {
    VueDaumMap,
  },
  data: () => ({
    appKey: process.env.VUE_APP_KAKAO_API_KEY,
    center: { lat: 33.450701, lng: 126.570667 },
    level: 3,
    mapTypeId: VueDaumMap.MapTypeId.NORMAL,
    libraries: ['services', 'clusterer', 'drawing'],
    map: null,
  }),
  methods: {
    onLoad(map) {
      this.map = map;
      const addressData = require('@/address.json');
      this.setMarkerClusterer(addressData);
    },
    setMarkerClusterer(data) {
      let clusterer = new window.kakao.maps.MarkerClusterer({
        map: this.map,
        averageCenter: true,
        minLevel: 10,
      });

      let markers = data.map(
        d =>
          new window.kakao.maps.Marker({
            position: new window.kakao.maps.LatLng(d.latitude, d.longitude),
          }),
      );

      clusterer.addMarkers(markers);
    },
  },
};
</script>


// address.json
[
  {
    "name": "테스트",
    "address": "서울 강남구 역삼로 165",
    "latitude": 37.4954107018262,
    "longitude": 127.03716802144
  },
  {
    "name": "와쿠와쿠PC방 (test)",
    "address": "서울 강남구 역삼로 149",
    "latitude": 37.4948954901706,
    "longitude": 127.035461246887
  },
  {
    "name": "섬데이PC방 (test)",
    "address": "서울 강남구 논현로 79길 69",
    "latitude": 37.4958220624121,
    "longitude": 127.033375863236
  },
  {
    "name": "bom PC방 (test)",
    "address": "서울 강남구 논현로79길 62",
    "latitude": 37.4962758238801,
    "longitude": 127.033957316936
  }
]

내용 추가: 저 상태에서 클러스터를 클릭하면 확대되고 화면이 잘 나오긴 하는데 드래그하여 맵의 다른 부분으로 이동하려고 하면 화면이 로딩이 안되면서 2번과 같이 에러가 무수하게 많이 나오네요

코드에는 문제가 없습니다.
어느 api를 호출할 때 나온 에러인지 파악이 필요해 보입니다.

클러스터러에 마커를 추가하고 나서 생긴 에러라면 markers와 데이터를 다시 확인해주세요.

데이터의 문제는 아닌것 같습니다. 혹시나 해서 가이드에 있는 json 데이터로 치환해봤는데도 같은 에러가 나네요.
에러가 나는 상황은 본문의 코드대로 그대로 돌린게 다이고 다른 것은 건든게 없습니다.
markers 변수를 생성할 때 람다를 쓰는 방식만 조금 바뀌었고(jquery를 쓰지 않기에) 나머진 가이드에 있는 코드를 그대로 복사해서 쓴것이라 오타의 문제는 아닌것 같은데 어떤 API 호출 시에 문제가 생긴건지 확인해보려고 에러가 뜰 때 크롬의 network 창을 확인해보아도 큰 문제는 찾을 수가 없습니다.
죄송하지만 어떻게 체크를 해야할지 알려주실 수 있나요?

아, 추가로 클러스터를 클릭해서 확대하면 그래도 화면은 보이길래 마커가 찍힌 장소까지 확대해봤더니 4개의 json 데이터중 제일 첫번째 데이터만 마커가 안찍히고 3개만 찍히네요. 3개로 데이터를 줄여도 또 첫번째 데이터가 사라지고 2개만 마커가 찍힙니다.

혹시라도 이 라이브러리가 클러스터를 사용할 수 없는 버그가 있는거면 라이브러리를 사용하지 않고 그대로 사용하는것이 좋을까요? 이전 포럼 글을 확인해보니 전에 어떤 분이 컴포넌트를 만들어 쓰시던데 그 방식이 낫다면 그걸로 변경하려고 합니다.

혹시 제가 접근하고 있는 window.kakao 객체와 저 라이브러리 내에서 쓰고 있는 kakao 객체가 가지고 있는 어떤 상태들이 달라지는 경우도 있나요?

아니요 새로운 객체를 만들어서 사용하는 거라 상태가 변경되진 않습니다.
vue-daum-map 라이브러리는 저희가 제공하고 있는 라이브러리가 아니기 때문에
자세한 설명을 드리기 어려운 점 참고 바랍니다.

먼저, 마커가 잘 생성되는 건지 확인이 필요해 보입니다.
4개의 마커를 생성해서 모두 표출되는지 확인 부탁드리고,
그다음 클러스터에 마커를 등록해서 4개의 마커와 에러가 출력되는지 다시 확인 부탁드립니다.

바쁘실텐데 죄송합니다.

우선 이 화면에서 클릭 & 마우스 휠로 확대해봤습니다.
K-001

그러면 아래와 같이 마커는 3개가 생성되었습니다.
K-002

지금 주소가 안나와서 상세한것은 표시가 안되어있지만, 아래의 json 파일에서 첫 번째인 주소인 테스트(역삼로 165)에 해당하는 장소가 표시가 안되었습니다.
K-007

이 json 파일에서 테스트가 들어있는 객체만 지우고 밑의 3개 주소만 남기고 다시 테스트를 하면,
K-006

이번에는 3번째에 해당하는 주소 빼고 1번(와x와x), 2번(섬x이) 주소만 마킹이 됩니다.
K-004

현재 사용중인 vue-daum-map라이브러리로 해결이 안될 것 같으면 아래의 방법으로 다시 시도를 해보려고 하는데 그 방법이 훨씬 나을까요?

음… 해당 라이브러리와 위 코드로 테스트할 때 에러도 없이 마커가 모두 정상 표출이 돼서
저렇게 마커 하나만 표시가 안 되는 이유를 잘 모르겠네요.

마커만 생성할 때도 모든 마커가 표출이 안된다면
vue-daum-map 라이브러리 대신 스크립트를 로드해서 구현하는 게 나을 것 같습니다.

vue에서 사용하는 방법은 아래 답글과 codesandbox 링크 참고해주세요.

1개의 좋아요

아…해결됐습니다;;
vue에서 프로젝트 만들 때 vue create {project-name} 명령어에서 가장 밑에 있는 커스텀하는 방식으로 만들었는데 (router라던지 eslint라던지 추가하는 방식으로) 그렇게 안하고 아예 default 방식으로 프로젝트를 만들고 나서 라이브러리를 써보니 잘 되네요.
아무래도 vue 자체의 버그인것 같습니다.
저랑 같은 문제가 있으신 분들은 참고하시길

아무튼 답변 감사합니다!

1개의 좋아요