카카오맵 api 이용시 맵 일부 잘림 현상

안녕하세요, vue.js로 vue-daum-map를 이용하여 화면에 카카오맵을 뿌려주는 부분까지 완성하였는데요,
카카오맵 일부 화면이 다음과 같이 계속 잘린체로 나오지 않고 있습니다…

맵 잘림 현상

혹시 동일 현상 겪으신 분이 계실까요…?
아니면 해결법을 알고 계신 분이 있으실까요?

<template>
...
<vue-daum-map
:appKey=“appKey”
:center="{ lat: lttd, lng: lngtd }"
:level.sync=“level”
:mapTypeId=“mapTypeId”
:libraries=“libraries”
@load=“onLoad”
@center_changed=“onMapEvent(‘center_changed’, $event)”
@zoom_start=“onMapEvent(‘zoom_start’, $event)”
@zoom_changed=“onMapEvent(‘zoom_changed’, $event)”
@bounds_changed=“onMapEvent(‘bounds_changed’, $event)”
@click=“onMapEvent(‘click’, $event)”
@dblclick=“onMapEvent(‘dblclick’, $event)”
@rightclick=“onMapEvent(‘rightclick’, $event)”
@mousemove=“onMapEvent(‘mousemove’, $event)”
@dragstart=“onMapEvent(‘dragstart’, $event)”
@drag=“onMapEvent(‘drag’, $event)”
@dragend=“onMapEvent(‘dragend’, $event)”
@idle=“onMapEvent(‘idle’, $event)”
@tilesloaded=“onMapEvent(‘tilesloaded’, $event)”
@maptypeid_changed="onMapEvent(‘maptypeid_changed’, $event)"
style=“width:100%;height:100%;”
/>
...
</template>
<script>
...
`export default {
components: {
VueDaumMap
},
data: function() {
return {

  appKey: "본인의appKey",
  level: 3,
  mapTypeId: VueDaumMap.MapTypeId.NORMAL,
  libraries: [],
  mapObject: null
};

},
...
</script>

위는 제가 사용한 코드입니다.

아래 링크에 답변한 현상에 대한 내용과 방법 참고 부탁드립니다.
https://devtalk.kakao.com/t/topic/97418

vue-daum-map 은 공식적으로 저희가 제공한 vue component가 아니므로
해당 문제에 대해 답변드리기 어렵습니다.

vue-daum-map을 쓰지 않은 테스트 코드를 첨부해 드리며
지도 중심을 잡아주는 코드를 중점으로 구현된 코드임을 감안하시고 직접 손 보아 사용하시길 바랍니다.

KakaoMap.vue:

<template>
    <div ref="map"></div>
</template>

<script>
/* global kakao */

export default {
    name: 'KakaoMap',
    props: {
        appkey: {
            type: String,
            required: true
        },
        width: {
            type: Number,
            default: 400
        },
        height: {
            type: Number,
            default: 300
        },
        center: {
            type: Array,
            required: true
        },
        level: {
            type: Number
        },
        isShowing: {
            type: Boolean
        }
    },

    mounted() {
        if (window.kakao && window.kakao.maps) {
            this.initMap();
        } else {
            const script = document.createElement('script');
            script.onload = () => kakao.maps.load(this.initMap);
            script.src = 'http://dapi.kakao.com/v2/maps/sdk.js?autoload=false&appkey=326e38503f420e1f0088dab1f46dc0c7';
            document.head.appendChild(script);
        }
    },

    data() {
        return {
            map: null,
            mapCenter: this.center
        }
    },

    watch: {
        isShowing(val) {
            if (val) {
                this.relayout();
            }
        },
        width(val) {
            this.$refs.map.style.width = val + 'px';
            this.relayout();
        },
        height(val) {
            this.$refs.map.style.height = val + 'px';
            this.relayout();
        }
    },

    methods: {
        initMap() {
            const container = this.$refs.map;
            container.style.width = this.width + 'px';
            container.style.height = this.height + 'px';

            const options = {
              center: new kakao.maps.LatLng(...this.mapCenter)
            };

            const map = new kakao.maps.Map(container, options);
            map.setMapTypeId(kakao.maps.MapTypeId.HYBRID);
            kakao.maps.event.addListener(map, 'center_changed', this.onCenterChanged);
            this.map = map;
        },
        relayout() {
            kakao.maps.event.removeListener(this.map, 'center_changed', this.onCenterChanged);
            this.map.relayout();
            const latlng = new kakao.maps.LatLng(...this.mapCenter);
            this.map.setCenter(latlng);
            kakao.maps.event.addListener(this.map, 'center_changed', this.onCenterChanged);
        },
        onCenterChanged() {
            const center = this.map.getCenter();
            this.mapCenter = [center.getLat(), center.getLng()];
        }
    }
}
</script>

App.vue:

<template>
  <div id="app">
      <button @click="toggle">{{ showMap ? "hide" : "show" }}</button>
      <button @click="changeMapWidth">change map width</button>
      <button @click="changeMapHeight">change map height</button>
      <KakaoMap
        v-show="showMap"
        :appkey="appkey"
        :center="center"
        :width="mapWidth"
        :height="mapHeight"
        :isShowing="showMap"
      ></KakaoMap>
  </div>
</template>

<script>
import KakaoMap from './components/KakaoMap';
export default {
    data() {
        return  {
            showMap: false,
            appkey:'xxxxxxxx',
            center:[33.450701, 126.570667],
            mapWidth: 200,
            mapHeight: 300
        }
    },

    components: {
        KakaoMap
    },

    // for test
    methods: {
        toggle() {
            this.showMap = !this.showMap;
        },
        changeMapWidth() {
            this.mapWidth = this.mapWidth > 200 ? 200 : 500;
        },
        changeMapHeight() {
            this.mapHeight = this.mapHeight > 300 ? 300 : 800;
        }
    }
}
</script>

질문이 올라온지 시간이 좀 지나서 이미 해결하셨을듯 싶지만 혹시 몰라서 제가 해결한 방식을 적어봅니다

저도 Vue에서 카카오맵을 사용 중인데 vue-daum-map은 사용하지 않고 Kakaomap.vue 컴포넌트를 생성하여 사용중입니다
버튼 클릭 시 모달창이 나오고 이 모달창에 카카오맵이 로드되는 형식인데
맨 처음 지도 생성은 잘 실행되지만 모달창을 닫고 다시 열면 지도가 잘리는 현상이 발생했습니다

   mounted () {
    this.getCenter()
    if (window.kakao && window.kakao.maps) {
      setTimeout(() => { this.initMap() }, 100)
    } else {
      const script = document.createElement('script')
      /* global kakao */
      script.onload = () => kakao.maps.load(this.initMap)
      script.src = 'http://dapi.kakao.com/v2/maps/sdk.js?autoload=false&appkey=~~'
      document.head.appendChild(script)
    }
  },

mounted에서 window.kakao && window.kakao.maps 일 때 initMap() 메서드가 실행이 되고,
아닐시 script 엘리먼트를 생성하여 이에 로드하는 방식인데 처음 지도 생성시
window.kakao을 콘솔창에 출력해보면 undefined가 나오고 엘리먼트 생성으로 넘어갑니다.
두번째실행 시 window.kakao가 undefined가 아니게 되어 바로 initMap() 메서드가 실행되는데 여기서 지도가 잘리는 걸로 파악되었습니다.
script 엘리먼트는 onload가 되었을 시 initMap() 을 실행하지만 아닐 시에는 바로 initMap()을 실행하게 되는데
Vue에서 다른 라이브러리를 사용할 때에도 겪었던 렌더링 속도 문제라 생각하여 지도 생성시점을 잠시 늦추어 보았는데
문제 없이 지도가 생성되었습니다.

저도 생각지도 못하게 찾은거라 다른 해결법이 있겠지만 일단은 임시방편으로 오류만 없에고 다른 방법을 찾아보려합니다

2개의 좋아요

감사합니다. 덕분에 3일동안 해결못한거 해결했습니다 ㅠㅠ

1개의 좋아요

오우 도움이 되었다니 기분이 좋네요