Ajax 를 이용하여 db 에 저장된 위도, 경도 값을 받아와 모달창에서 지도를 불러오려는데 지도가 제대로 로드되지않습니다

[FAQ] 지도/로컬 API 문의 전 꼭 읽어 주세요.

$.ajax({
url : “/admin/tour/tourDetailPost”,
data : {
“tourId” : tourId
},
type : “post”,
dataType : “json”,
beforeSend : function (xhr) {
xhr.setRequestHeader(“${_csrf.headerName}”,“${_csrf.token}”);
},
success : function(success) {
if(success != null) {
let tourNm = success.tourNm; // 인포 윈도우에 표시할 여행지 이름
let lati = success.lati; // 여행지 위도
let longi = success.longi; // 여행지 경도

			var mapContainer = document.getElementById('map'), 	// 지도를 표시할 div 
				    mapOption = { 
				        center: new kakao.maps.LatLng(lati, longi), 	// 지도의 중심좌표
				        level: 2 										// 지도의 확대 레벨
				    };
		
			var map = new kakao.maps.Map(mapContainer, mapOption);
					
			var markerPosition  = new kakao.maps.LatLng(lati, longi); 
		
			var marker = new kakao.maps.Marker({
				    position: markerPosition
			});
			
			marker.setMap(map);
			
			var iwContent = '<div style="margin-left:17px; margin-top:2px; text-align:"center;"><h6 
                                                         class="card-title mb-0">'+tourNm+'</h6><br></div>',
    		         iwPosition = new kakao.maps.LatLng(lati, longi); 
			
			 var infowindow = new kakao.maps.InfoWindow({
		 	 position : iwPosition, 
			 content : iwContent 
			});
					  
			infowindow.open(map, marker); 
			map.relayout();
					
					
		}
	}
});

안녕하세요. 프로젝트 진행 중 막히는 부분이 있어 질문 올립니다.
위 코드처럼 ajax 를 이용해 db 로 부터 위도, 경도 값을 가져와 지도에 해당 위치에 대한 마커와 인포 윈도우를 찍으려고 하는데


본 이미지 처럼 마커 위치가 좌상단에 위치되도록 불러와질 뿐만 아니라 지도가 좌상단 일부만 로드되는 문제가 발생했습니다. 웹 브라우저는 크롬을 사용하고 있고 브라우저의 크기가 resize 되면 제대로 나오기는 합니다만 …
코드 상에서 .relayout() 을 호출해도 위 이미지와 같은 현상이 반복됩니다

사이트 디자인은 부트스트랩을 사용 중이고 해당 부트스트랩에서 지원하는 모달 컴포넌트를 사용하고 있습니다

혹시라도 해결 방법이 있다면 꼭 알려주시면 감사하겠습니다

map.relayout()이 실행되는 타이밍 보다,
지도가 그려질 화면이 확대되는 타이밍이 더 나중에 발생되서 위와 같은 현상이 발생하는 것으로 보입니다.

위 소스코드를 실행할 수 있는 환경이 구성되어 있지 않기 때문에, 확실한 테스트는 어려운데,
질문글에 적어주신, 페이지 자체가 resize가 되면 원래되로 돌아온다는 것이, 지도API내부적으로 resize이벤트 발생시 relayout을 실행하고 있기 때문에 그러합니다.

즉 현재 ajax로 데이터를 받고 지도 렌더링 하고 map을 relayout을 하고 있으나, 이게 실행되는 시점보다, 모달 컴포넌트에서 지도가 그려질 화면의 크기가 확정되는 순간이 더 나중이라 발생하는 것 같아요.
모달 컴포넌트에서 이 타이밍을 정확히 알 수 없는 상황이라면, 보톨 자바스크립트 단에서 자주 쓰는 방법이긴 한데,
setTimout을 이용해서 일정 시간 딜레이 후에 relayout이 실행되게 하면 동작할거에요. 적당한 값은 여러 환경 테스트해서 눈으로 봤을때 괜찮을 시간을 찾아서 결정하시면 됩니다.

한번 확인해 보세요~

1개의 좋아요

감사합니다 !! 원인이 뭔지 모르고 있었는데 relayout 이 실행되는게 모달창에 지도가 그려지는 타이밍보다 빨라서 그랬군요
친절한 답변 감사합니다 ㅎㅎㅎㅎ