성능 최적화
react-native-naver-map 성능 최적화 가이드
성능 최적화
네이버 지도 라이브러리를 사용할 때 렌더링 성능과 메모리 사용량을 최적화하는 방법을 설명합니다.
마커 최적화
커스텀 뷰 대신 이미지 사용
커스텀 React 뷰를 마커 아이콘으로 사용하면 성능 비용이 큽니다. 가능하면 이미지 방식을 사용하세요.
// 권장하지 않음 - 성능 비용 높음<NaverMapMarkerOverlay latitude={lat} longitude={lng} width={60} height={30}><View style={{ width: 60, height: 30, backgroundColor: 'blue' }}><Text>텍스트</Text></View></NaverMapMarkerOverlay>// 권장 - 성능 우수<NaverMapMarkerOverlaylatitude={lat}longitude={lng}image={{ symbol: 'blue' }}caption={{ text: '텍스트' }}/>
width와 height 명시
마커의 width와 height를 항상 명시하면 레이아웃 계산 비용을 줄일 수 있습니다.
// 권장<NaverMapMarkerOverlaylatitude={lat}longitude={lng}image={require('./marker.png')}width={32}height={40}/>
불필요한 마커 렌더링 방지
React의 useMemo와 key를 활용하여 불필요한 마커 재렌더링을 방지합니다.
const markerComponents = useMemo(() => (markers.map((marker) => (<NaverMapMarkerOverlaykey={marker.id}latitude={marker.latitude}longitude={marker.longitude}image={{ symbol: 'red' }}caption={{ text: marker.name }}/>))), [markers]);
클러스터링 활용
대량의 마커를 표시할 때는 NaverMapMarkerOverlay를 개별 렌더링하는 대신 클러스터링을 사용하세요.
// 수천 개의 마커도 효율적으로 처리<NaverMapViewclusters={[{markers: largeMarkerArray, // 수천 개 가능screenDistance: 200,animate: true,},]}/>
클러스터링은 네이티브 레벨에서 처리되므로 React Native의 JS 스레드 부하를 최소화합니다.
클러스터링 성능 튜닝
clusters={[{markers: largeMarkerArray,screenDistance: 150, // 너무 작으면 클러스터 효과 감소animate: false, // 애니메이션 비활성화로 성능 향상minZoom: 0,maxZoom: 16, // 고줌에서 클러스터 해제},]}
라이트 모드
단순한 지도 표시가 목적이라면 라이트 모드를 활성화하면 로딩 속도와 메모리 사용량을 크게 줄일 수 있습니다.
<NaverMapViewisLiteModeEnabled={true}// 라이트 모드 제약:// - 화질 하락// - Navi 지도 유형 불가// - 레이어 그룹 불가// - 실내지도/야간 모드 불가// - 심벌 클릭 이벤트 불가// - 마커-심벌 겹침 처리 불가/>
라이트 모드는 기능 제약이 많습니다. 마커 클릭, 심벌 숨김 처리 등이 필요하다면 사용하지 마세요.
FPS 제한 (Android)
배터리 소모를 줄이기 위해 지도의 최대 FPS를 제한할 수 있습니다. Android 전용이며 초기화 시에만 적용됩니다.
<NaverMapViewfpsLimit={30} // 초당 30프레임으로 제한 (기본: 0 = 무제한)/>
Android TextureView
기본적으로 Android에서는 SurfaceView를 사용합니다. 지도를 다른 뷰와 겹쳐야 하는 경우 TextureView로 전환할 수 있지만, 성능이 약간 저하됩니다.
<NaverMapViewisUseTextureViewAndroid={true} // 초기화 시에만 적용/>
카메라 이벤트 최적화
onCameraChanged는 카메라가 조금이라도 움직일 때마다 호출됩니다. 부담스러운 작업은 onCameraIdle에서 처리하세요.
// 권장하지 않음 - 매 프레임마다 API 호출onCameraChanged={({ latitude, longitude }) => {fetchDataForCoord(latitude, longitude); // 부하 큼}}// 권장 - 카메라 이동이 완전히 멈춘 후 한 번 호출onCameraIdle={({ latitude, longitude }) => {fetchDataForCoord(latitude, longitude); // 적절}}
오버레이 수 제한
한 화면에 너무 많은 오버레이를 렌더링하면 성능이 저하됩니다.
| 오버레이 종류 | 권장 최대 수 |
|---|---|
| 개별 마커 (NaverMapMarkerOverlay) | ~100개 |
| 커스텀 뷰 마커 | ~20개 |
| 클러스터링 마커 | 수천 개 가능 |
| 경로선/폴리곤 | ~50개 |
줌 레벨별 오버레이 가시성
minZoom과 maxZoom을 활용하여 특정 줌 레벨에서만 오버레이를 표시하면 렌더링 부하를 줄일 수 있습니다.
// 줌 14 이상에서만 상세 마커 표시<NaverMapMarkerOverlaylatitude={lat}longitude={lng}minZoom={14}caption={{ text: '상세 정보', minZoom: 15 }}/>
메모리 관리
- 지도 화면을 벗어날 때 마커 배열을 비우거나 컴포넌트를 언마운트하면 메모리가 해제됩니다.
- 이미지 캐싱이 지원되는 마커 타입(
symbol,require,httpUri)을 우선 사용하세요. - 커스텀 뷰 마커는 캐싱이 지원되지 않아 마커마다 별도의 뷰가 생성됩니다.