개발자

네이버 지도 api 라우팅이 궁금합니다 ㅠㅠ

2024년 02월 18일조회 97

마커를 생성하고 마커를 클릭시 페이지 이동을 하고 싶은데 아무런 미동조차 없어서 해결하고자 올려봅니다 ㅠㅠ 페이지 구조는 넥스트 앱라우터 /dashboard/[shipId]/page.tsx 로 되어있습니다. 클릭시 아무런 반응도 없고 지피티나 구글을 찾아봐도 저렇게 이벤트를 주는 방법 말고는 보이지가 않아서 질문드립니다 ㅠㅠ

1'use client'
2import { Marker, NaverMarker } from '@/types/mapType';
3import { useRouter } from 'next/navigation';
4import { useEffect, useState } from 'react';
5
6export const createLatLng = (lat: number, lng: number) => {
7  // 네이버 객체를 가져옴
8  const { naver } = window;
9  return new naver.maps.LatLng(lat, lng);
10};
11
12export const useMarkers = ({
13  shipLocations,
14  location,
15  map,
16  shipIconUrl,
17  homeIconUrl,
18}: Marker) => {
19  const [markers, setMarkers] = useState<NaverMarker[]>([]);
20  const router = useRouter();
21
22  useEffect(() => {
23    if (location && map) {
24      const currentLocation = createLatLng(location.lat, location.lng);
25      const homeMarker = new naver.maps.Marker({
26        position: currentLocation,
27        map,
28        icon: {
29          url: homeIconUrl,
30          scaledSize: new naver.maps.Size(25, 25),
31          origin: new naver.maps.Point(0, 0),
32          anchor: new naver.maps.Point(19, 58),
33        },
34      });
35
36      const shipMarkers = shipLocations.map((ship) => {
37        const naverDataLocation = createLatLng(ship.lat, ship.lng);
38        const marker = new naver.maps.Marker({
39          position: naverDataLocation,
40          map,
41          title: `위도: ${ship.lat}, 경도: ${ship.lng}`,
42          // animation: naver.maps.Animation.BOUNCE,
43          icon: {
44            url: shipIconUrl,
45            scaledSize: new naver.maps.Size(25, 25),
46            origin: new naver.maps.Point(0, 0),
47            anchor: new naver.maps.Point(19, 58),
48          },
49        });
50
51        naver.maps.Event.addListener(marker, 'click', () => {
52          router.push(`/dashboard/${ship.id}`);
53        });
54
55        return marker;
56      });
57      setMarkers([homeMarker, ...shipMarkers]);
58    }
59  }, [map, shipLocations]);
60
61  return markers;
62};
이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

ssngkom님의 프로필 사진

naver.maps.Event.addListener(marker, 'click', async () => { try { window.location.href = `/dashboard/${ship.id}`; // router.push(`/dashboard/${ship.id}`); } catch (error) { console.error('Failed to navigate:', error); } }); 넥스트 라우터로 안하고 브라우저걸로 하니까 되는데... 이게 대체 이유가 뭘까요 ㅠㅠ

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 02월 18일

코드 자체는 큰 문제가 보이지 않습니다. 몇 가지 생각해볼 수 있는 원인을 제안하겠습니다. 1. useRouter은 Next.js의 hook입니다. 때문에 이를 사용하는 Component가 반드시 React Functional Component여야 합니다. 2. useRouter의 반환값으로 redirect를 실행하는 중 에러가 발생할 수 있습니다. 예를 들어, `/dashboard/[shipId]/page.tsx`의 동적 라우팅 주소로 이동하려 하나 실제 파일 경로가 존재하지 않거나, `ship.id` 값이 null 또는 undefined인 경우에 페이지 이동이 일어나지 않을 수 있습니다. 3. 브라우저 Console 탭에서 어떤 에러 메세지가 출력되는지 확인해보세요. 4. useEffect 안에서 비동기 작업을 처리할 때에는 cleanup 함수를 꼭 반환해주셔야 합니다. 아래와 같이 Event Listener를 해제하는 코드를 추가해보세요. ```typescript useEffect(() => { // ... 기존 코드 return () => { // marker 클릭 이벤트 리스너 제거 shipMarkers.forEach(marker => { naver.maps.Event.removeListener(marker, 'click'); }); }; }, [map, shipLocations]); ``` 위 사항들을 확인하여도 문제가 해결되지 않는다면, 구체적인 오류 메시지나 환경 정보(Next.js 버전 등)와 함께 다시 질문해주세요.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!