마커클러스터 에서 커스텀오버레이 적용 문제 문의

안녕하세요!
카카오맵 API로 구현하고자 하는 페이지에 적용하려고 하는데 잘 안되는 부분이 있어서 이렇게 문의 드립니다.

마커클러스터는 예제를 보면서 구현은 잘 되었습니다.
커스텀오버레이도 예제를 보면서 구현이 되어 있습니다.

개별적으로 적용을 할때는 잘 되는데 마커클러스터랑 함께 사용할때는 잘 안되더라구요…ㅠㅠ

  1. 클러스터 이벤트
    kakao.maps.event.addListener( clusterer, ‘clusterclick’, function( cluster ) 적용후 클러스터 클릭스 오버레이가 한번에 다 띄워짐 단, 마커클릭시에는 오버레이가 뜨지 않음
    띄워진 오버레이는 정상적으로 닫힘

클러스터

  1. kakao.maps.event.addListener(marker, ‘click’, function() 적용후 마커클릭시 오버레이 뜨지않음

마커

원하는 구현방식은 마커클러스터 클릭시에는 줌인되어서 마커가 보이고, 마커클릭시에는 오버레이가 뜨게 하려고 합니다.
커스텀 오버레이 부분은 php로 for문에서 반복 수행하도록 처리 했습니다.

고수님들의 도움 부탁드리겠습니다.
초보자이므로 쉽게 설명을 해주시면 감사하겠습니다.
좋은 하루 되세요~

<script>
    var mapContainer = document.getElementById('map'), // 지도를 표시할 div 
        mapOption = {
            center: new kakao.maps.LatLng(<?php echo $lat ?>, <?php echo $lng ?>), // 지도의 중심좌표
            level: 6 // 지도 초기 확대레벨
        };

    var map = new kakao.maps.Map(mapContainer, mapOption);

    // 마커 클러스터러를 생성합니다
    // 마커 클러스터러를 생성할 때 disableClickZoom 값을 true로 지정하지 않은 경우
    // 클러스터 마커를 클릭했을 때 클러스터 객체가 포함하는 마커들이 모두 잘 보이도록 지도의 레벨과 영역을 변경합니다
    // 이 예제에서는 disableClickZoom 값을 true로 설정하여 기본 클릭 동작을 막고
    // 클러스터 마커를 클릭했을 때 클릭된 클러스터 마커의 위치를 기준으로 지도를 1레벨씩 확대합니다
    var clusterer = new kakao.maps.MarkerClusterer({
        map: map, // 마커들을 클러스터로 관리하고 표시할 지도 객체
        averageCenter: true, // 클러스터에 포함된 마커들의 평균 위치를 클러스터 마커 위치로 설정
        minLevel: 4, // 클러스터 할 최소 지도 레벨
        disableClickZoom: true // 클러스터 마커를 클릭했을 때 지도가 확대되지 않도록 설정한다
    });

    // 데이터를 가져오기 위해 jQuery를 사용합니다
    // 데이터를 가져와 마커를 생성하고 클러스터러 객체에 넘겨줍니다
    $.get("/wm_include/main_map/data.json", function(data) {
        // 데이터에서 좌표 값을 가지고 마커를 표시합니다
        // 마커 클러스터러로 관리할 마커 객체는 생성할 때 지도 객체를 설정하지 않습니다
        var markers = $(data.positions).map(function(i, position) {
            return new kakao.maps.Marker({
                position : new kakao.maps.LatLng(position.lat, position.lng)
            });
        });

        // 클러스터러에 마커들을 추가합니다
        clusterer.addMarkers(markers);
    });

    // 마커 클러스터러에 클릭이벤트를 등록합니다
    // 마커 클러스터러를 생성할 때 disableClickZoom을 true로 설정하지 않은 경우
    // 이벤트 헨들러로 cluster 객체가 넘어오지 않을 수도 있습니다
    kakao.maps.event.addListener(clusterer, 'clusterclick', function(cluster) {

        // 현재 지도 레벨에서 1레벨 확대한 레벨
        var level = map.getLevel()-1;

        // 지도를 클릭된 클러스터의 마커의 위치를 기준으로 확대합니다
        map.setLevel(level, {anchor: cluster.getCenter()});
    });
 
                
    <?php 
    
    $gu = str_replace("/","",$_GET['gubun']); 

        if($_GET['gubun']=="") {
	       $sql = " select * from g5_write_".$bo_table." order by wr_id asc ";
        } else {
        $sql = " select * from g5_write_".$bo_table." where ca_name='".$gu."' order by wr_id asc ";
        }

        $result = sql_query($sql);
        $cnt = 0;
        while ($row = sql_fetch_array($result)) { 
            if($row['wr_5'] && $row['wr_6']) {
                $thumb = get_list_thumbnail($board['bo_table'], $row['wr_id'], $board['bo_gallery_width'], $board['bo_gallery_height'], false, true);
                if($thumb['src']) {
                    $img_content = $thumb['src'];
                }
    ?>
    
    // 커스텀 오버레이에 표시할 컨텐츠 입니다
    var content = '<div class="wrap">' + 
            '    <div class="info">' + 
            '        <div class="title">' + 
            '            <?php echo $row['wr_subject']; ?>' + 
            '            <div class="close" onclick="closeOverlay_<?php echo $row['wr_id'] ?>()" title="닫기"></div>' + 
            '        </div>' + 
            '        <div class="body">' + 
            '            <div class="img">' +
            '                <?php if($thumb['src']) { ?><img src="<?php echo $img_content ?>" width="75" height="73">' +
            '                <?php } ?>' +
            '           </div>' + 
            '            <div class="desc">' + 
            '                <div class="ellipsis"><?php echo $row['wr_3']; ?></div>' + 
            '                <div class="jibun ellipsis"><?php echo $row['wr_4']; ?></div>' + 
            '                <div><a href="<?php echo $row['wr_link1']; ?>" target="_blank" class="link">홈페이지</a></div>' + 
            '            </div>' + 
            '        </div>' + 
            '    </div>' +    
            '</div>';

    // 마커 위에 커스텀오버레이를 표시합니다
    var position = new kakao.maps.LatLng(<?php echo $row['wr_5'] ?>, <?php echo $row['wr_6'] ?>);

    // 마커를 중심으로 커스텀 오버레이를 표시하기위해 CSS를 이용해 위치를 설정했습니다
    var overlay_<?php echo $row['wr_id'] ?> = new kakao.maps.CustomOverlay({
        content: content,
        map: map,
        position: position,
        yAnchor: 1
    });

    // 마커를 클릭했을 때 커스텀 오버레이를 표시합니다
    kakao.maps.event.addListener( clusterer, 'clusterclick', function( cluster ) {
        overlay_<?php echo $row['wr_id'] ?>.setMap(map);      
    });

    // 커스텀 오버레이를 닫기 위해 호출되는 함수입니다 
    function closeOverlay_<?php echo $row['wr_id'] ?>() {

        overlay_<?php echo $row['wr_id'] ?>.setMap(null);
    }

    overlay_<?php echo $row['wr_id'] ?>.setMap(null);


    <?php
        $cnt++;
    }
}

?>

</script>    
// 마커를 클릭했을 때 커스텀 오버레이를 표시합니다
    kakao.maps.event.addListener( clusterer, 'clusterclick', function( cluster ) {
        overlay_<?php echo $row['wr_id'] ?>.setMap(map);      
    });

위 코드 부분을 보면 클러스터를 클릭했을 때 커스텀 오버레이가 활성화 되도록 한 것으로 보여집니다.
때문에 클러스터안에 있는 모든 커스텀 오버레이가 노출이 된 것이구요.
클러스터 클릭 이벤트가 아닌 마커 클릭이벤트를 적용하셔야 할 것 같습니다.

kakao.maps.event.addListener(marker, 'click', function() {
    alert('marker click!');
});

문서 링크

https://apis.map.kakao.com/web/documentation/#Marker_click

안녕하세요! 오전 일찍 답변을 주셔서 감사드립니다.
클러스터 클릭 이벤트 및 마커 클릭 이벤트도 다해봤는데 마커클릭시 커스텀 오버레이가 출력이 되지 않습니다.
마커클러스터는 잘 동작이 되는거 같은데 어디서 문제가 있는 걸까요?

일반지도에서는 커스텀 오버레이는 잘동작합니다.
마커클러스터랑 같이 사용하려고 이리저리 수정을 해보고 문서도 찾아서 적용을 해봤는데 잘 안되네요…ㅠㅠ
도움 부탁드리겠습니다.

테스트중인 페이지 링크 올려봅니다.

테스트 중인 페이지

저같은 경우는 이런 식으로 처리를 했습니다.
커스텀 오버레이를 선언할 때 아래 주석 부분을 봐주세요.

var overlay_<?php echo $row['wr_id'] ?> = new kakao.maps.CustomOverlay({
        content: content,
        // map: map, <== 이 부분을 선언해주지 않고 마커 클릭 이벤트에서 .setMap(map)으로 설정합니다.
        position: position,
        yAnchor: 1
    });

그 후 마커가 저장된 배열을 반복문으로 돌면서 각각의 마커에 클릭 이벤트를 부여했습니다.

for (let i = 0; i < markers.length; i++) {
  kakao.maps.event.addListener(markers[i], 'click', () => {
    if (infoWindows[i].getMap() === null) {
      for (let j = 0; j < infoWindows.length; j++) {
        infoWindows[j].setMap(null);
      }
      infoWindows[i].setMap(map);
    } else {
      infoWindows[i].setMap(null);
    }
  })
}

먼저 마커 클릭 이벤트를 적용하시고 console.log로 클릭한 마커의 데이터가 정상적으로 넘어오는지 확인을 하셔야 할 것 같습니다.

알려주신데로 적용을 해봤는데… 여전히 적용이 안되는군요

    // 마커 위에 커스텀오버레이를 표시합니다
    var position = new kakao.maps.LatLng(<?php echo $row['wr_5'] ?>, <?php echo $row['wr_6'] ?>);


    for (let i = 0; i < markers.length; i++) {
  kakao.maps.event.addListener(markers[i], 'click', () => {
    if (infoWindows[i].getMap() === null) {
      for (let j = 0; j < infoWindows.length; j++) {
        infoWindows[j].setMap(null);
      }
      infoWindows[i].setMap(map);
    } else {
      infoWindows[i].setMap(null);
    }
  })
}      
    // 마커를 중심으로 커스텀 오버레이를 표시하기위해 CSS를 이용해 위치를 설정했습니다
    var overlay_<?php echo $row['wr_id'] ?> = new kakao.maps.CustomOverlay({
        content: content,
        //map: map,
        position: position,
        yAnchor: 1
    });

개발자모드로 확인했을때는 에러는 없습니다. ㅠㅠ
바쁘신데 귀찮게 해드려서 죄송합니다.

코드에 마커 클릭 이벤트가 등록되어 있지 않고 클러스터러 클릭이벤트만 등록되어 있는데요.
마커, 오버레이 생성 - 마커 클릭 - 오버레이 표시까지 로직을 정리해서 다시 구현하면 좋을 것 같아요.

데이터가 어떤 상황인지 몰라서 만약 jQuery로 가져오는 데이터 정보로 커스텀 오버레이를 생성할 수 있다면
콜백 함수에서 마커와 커스텀 오버레이를 같이 생성하고 마커 이벤트를 등록해서 확인해주세요.
이전 유사 게시글도 함께 참고해주세요.
https://devtalk.kakao.com/t/topic/96966/4?u=lea.ju