6. 백엔드 마커시스템 문제점
진행사항과 걸린 시간은
github로 관리하고있다.
https://github.com/hdachan/real_modir
GitHub - hdachan/real_modir
Contribute to hdachan/real_modir development by creating an account on GitHub.
github.com
현재 프로젝트이다. 이거 mvvm 로 관리하면 좋긴 한데
이 페이지가 너무 많아지는 거 같다.. ㅋㅋㅋㅋ
슬슬 헷갈리기 시작
그리고 애매한 것들을 한 서비스단에 다 만들어서 수정도 필요하다..
또한 이름도 안 맞췄다. 전부 다 수정해야 될 내용이다.
전체적으로 이제 UI는 만든 거 같다.
근데 UI 기능들을 또 만들어야 된다.. 하아
확실히 백엔드는 이론을 알아서 쉽게 되는데
프런트엔드는 좀 어려운 거 같다.
오늘은 내가 겪었던 백엔드 오류에 대해서 설명해보려고 한다.
현재 코드설명
📌 코드 설명
1️⃣ buildMarkersFromList() (마커 리스트 생성)
Set<NAddableOverlay> buildMarkersFromList( List<Modir> dataList, String? selectedMarkerTitle, Function(Modir) onMarkerTap) {
- dataList: 마커를 생성할 데이터 목록 (Modir 리스트)
- selectedMarkerTitle: 현재 선택된 마커 (선택 여부에 따라 다른 아이콘 사용)
- onMarkerTap: 마커를 탭할 때 실행할 함수 (예: 바텀시트 표시)
마커 생성 과정
final bool isSelected = (modir.title == selectedMarkerTitle);
- 현재 마커가 선택된 상태인지 확인
→ 선택된 경우 다른 아이콘을 사용 (maker_on.png vs marker_off.png).
final marker = NMarker( id: modir.title, position: NLatLng(modir.latitude, modir.longitude), caption: NOverlayCaption(text: modir.title), icon: NOverlayImage.fromAssetImage(iconPath), size: Size(40, 40), );
- NMarker 객체를 생성
→ id는 modir.title, 위치는 modir.latitude/longitude, 아이콘은 선택 여부에 따라 다름.
marker.setOnTapListener((overlay) { onMarkerTap(modir); });
- 마커를 클릭했을 때 onMarkerTap(modir) 함수 실행
→ showMarkerBottomSheet() 같은 UI 동작을 실행할 수 있음.
2️⃣ updateMarkers() (마커 업데이트)
- mapController: 네이버 맵 컨트롤러
- dataProvider: 마커 데이터를 담고 있는 DataViewModel
- selectedMarkerTitle: 선택된 마커 제목
- onMarkerTap: 마커 클릭 시 실행할 함수
- showSnackbar: 마커가 없을 때 실행할 함수 (예: "검색된 마커가 없습니다." 메시지)
3️⃣ 현재 지도에 보이는 마커만 필터링
- 현재 지도의 보이는 영역 (bounds)를 가져옴.
- 만약 bounds가 없으면 (null) 바로 종료.
final filteredData = dataProvider.dataList.where((modir) {
return modir.latitude >= bounds.southWest.latitude &&
modir.latitude <= bounds.northEast.latitude &&
modir.longitude >= bounds.southWest.longitude &&
modir.longitude <= bounds.northEast.longitude;
}).toList();
- dataProvider.dataList에서 현재 지도 화면 안에 있는 마커만 필터링
→ 즉, 보이지 않는 마커는 표시하지 않음.
4️⃣ 기존 마커 삭제 후 새 마커 추가
final newMarkers = buildMarkersFromList(filteredData, selectedMarkerTitle, onMarkerTap);
- 현재 보이는 마커만 필터링한 후 buildMarkersFromList()를 사용해 새로운 마커 생성.
/// ✅ 기존 마커 삭제 후 새 마커 추가
await mapController.clearOverlays(); // ✅ overlays 제거
if (newMarkers.isEmpty) {
showSnackbar();
} else {
await mapController.addOverlayAll(newMarkers);
}
} catch (e) {
print("마커 업데이트 중 오류 발생: $e");
}
- 기존 마커를 모두 삭제한 후
- 마커가 없으면 showSnackbar() 실행 (예: "검색된 마커가 없습니다." 메시지 표시)
- 새로운 마커를 지도에 추가
문제 발견
현재 내 코드는 이러한 흐름인데
✔ 백엔드에서 데이터를 먼저 불러옴 (dataProvider.dataList)
✔ 지도에서 현재 보이는 영역에 있는 마커만 필터링
✔ 기존 마커를 모두 삭제하고, 새롭게 필터링된 마커만 추가
✔ 마커를 클릭하면 바텀시트 등을 띄울 수 있음 (onMarkerTap(modir))
내가 만들고 싶은 흐름
✔ 백엔드에서 모든 마커 데이터를 불러옴 (주소, 카테고리, 위도, 경도 포함).
✔ 지도에서 현재 보이는 영역 내의 마커만 남김.
✔ 추가로 사용자가 선택한 카테고리에 해당하는 마커만 남김.
✔ 필터링된 마커만 지도에 표시.
근데 여기서 문제점이 나는 데이터를 미리 먼저 다 받아온다. 이렇게 된다면
확장성을 고려했을 때는 2번이고
쉽고 빠른 건 1번인데
도저히 선택이 안돼서 계속 고민해서 나온 결론이
🚀 최적의 방법 (하이브리드 방식)
👉 1차 필터링: 서버에서 현재 보이는 지도 영역만 가져오고,
👉 2차 필터링: 클라이언트에서 카테고리·검색어를 적용하는 방식
현재 나는 한꺼번에 다 불러오고 있어서 로직 수정을 해야된다.
내일은 백엔드를 다 만들 예정이다.
내일 할일
1. 미리 만들어둔 네이버지도 넣고
2. UI 뺴고 마커만 불러오는 로직 작성
3. 로직마다 현재 보이는 지도영역만 가져오게 만들기
4. 클라이언트에서 카테고리 검색어를 적용
5. 현재 진행 중인 프로젝트에 넣기