본문 바로가기

React Native

React Native에서 ‘VirtualizedList’ 관련 성능 문제 해결하기

반응형

React Native 앱에서 'VirtualizedList'로 인해 발생하는 성능 문제를 해결하는 방법을 알아보겠습니다. 스크롤이 느려지고 메모리 사용량이 급증하는 이슈를 다루며, 효율적인 최적화 팁과 예시를 살펴보겠습니다.

 

VirtualizedList란 무엇인가?

VirtualizedList의 역할

React Native에서 'VirtualizedList'는 많은 양의 데이터를 효율적으로 렌더링하기 위해 사용되는 리스트 컴포넌트입니다. ListView와 FlatList, SectionList와 같은 컴포넌트들의 베이스 컴포넌트로, 이러한 컴포넌트들이 효율적인 렌더링을 할 수 있도록 기반 기능을 제공합니다.

VirtualizedList 사용의 장단점

VirtualizedList의 가장 큰 장점은 메모리 효율성을 높여 대량의 데이터를 처리할 수 있다는 점입니다. 하지만 사용이 까다롭고, 잘못 구현하면 성능 문제가 발생할 수 있습니다. 특히 스크롤이 느려지거나 항목 간의 부드러운 전환이 이루어지지 않는 문제는 많은 개발자들이 겪는 공통된 어려움 중 하나입니다.

 

VirtualizedList 성능 문제의 원인

React Native 앱에서의 스크롤 지연 현상

많은 개발자들이 VirtualizedList를 사용하면서 가장 먼저 마주치는 문제는 스크롤 성능 저하입니다. 아이템이 많아질수록 스크롤이 느려지거나, 버벅거림이 발생하기 쉽습니다. 이러한 현상은 아이템을 매번 렌더링하거나 불필요한 재렌더링이 발생할 때 나타납니다. 특히, 데이터가 복잡하거나 이미지가 포함된 경우 더욱 악화될 수 있습니다.

메모리 사용량 증가 문제

또 다른 문제는 메모리 사용량의 증가입니다. VirtualizedList가 대량의 데이터를 다룰 때 모든 데이터를 메모리에 유지하려고 시도하면, 메모리 부족 현상이 발생할 수 있습니다. 이는 앱의 안정성을 떨어뜨리고, 심지어 앱이 강제로 종료될 위험도 있습니다. 이러한 문제는 특히 저사양 기기에서 더욱 두드러집니다.

 

VirtualizedList 성능 문제 해결 방법

getItemLayout 사용하기

첫 번째로 소개할 최적화 방법은 getItemLayout을 사용하는 것입니다. 이 메서드를 사용하면 리스트 아이템의 높이를 미리 지정하여 React Native가 아이템의 위치를 빠르게 계산할 수 있도록 합니다. 이를 통해 스크롤 성능을 크게 향상시킬 수 있습니다. 예를 들어, 고정된 높이의 아이템을 렌더링할 때 getItemLayout을 사용하면 렌더링할 때 매번 위치를 재계산하지 않아도 되므로 성능 저하를 줄일 수 있습니다.

<VirtualizedList
	data={data}
	getItemLayout={(data, index) => ({ length: ITEM_HEIGHT, offset: ITEM_HEIGHT * index, index })}
	renderItem={renderItem}
	keyExtractor={(item) => item.id}
/>

 

keyExtractor 최적화

keyExtractor는 리스트 아이템의 고유한 키를 반환하는 함수로, 리스트 성능에 큰 영향을 미칩니다. keyExtractor를 최적화하면 React Native가 각 아이템의 변화를 더 쉽게 추적할 수 있어 불필요한 재렌더링을 방지할 수 있습니다. 가능한 한 아이템의 고유한 속성을 사용하여 키를 생성하는 것이 좋습니다.

keyExtractor={(item) => item.uniqueKey}

 

Windowing 활용하기

'Windowing' 기법은 화면에 보이는 아이템들만 렌더링하고, 나머지 아이템들은 필요할 때만 렌더링하는 방법입니다. VirtualizedList는 기본적으로 이 개념을 사용하여 성능을 최적화하지만, windowSize와 같은 옵션을 적절히 설정하면 더 나은 성능을 얻을 수 있습니다. windowSize를 조정함으로써 사용자가 스크롤할 때 더 자연스럽게 콘텐츠가 나타나게 할 수 있습니다.

<VirtualizedList
	data={data}
	renderItem={renderItem}
	windowSize={5}
/>

 

VirtualizedList 대신 사용할 수 있는 컴포넌트

VirtualizedList를 사용하는 대신, FlatList나 SectionList를 사용하는 것이 더 편리한 경우가 많습니다. 이들 컴포넌트는 VirtualizedList를 기반으로 하며, 보다 간편하고 직관적인 API를 제공하여 개발 생산성을 높여줍니다. 개발자가 리스트 렌더링의 복잡성을 직접 처리할 필요 없이, FlatList와 SectionList의 제공 기능을 통해 더 쉽게 효율적인 성능을 구현할 수 있습니다.

FlatList 사용이 적합한 경우

FlatList는 비교적 단순한 구조의 데이터 리스트를 렌더링할 때 사용하기 적합합니다. 데이터가 일렬로 나열된 형태일 때, FlatList는 VirtualizedList보다 더 사용하기 쉽고 코드도 간결합니다. FlatList는 내부적으로 VirtualizedList를 기반으로 하므로 성능은 비슷하지만, 더 직관적인 API를 제공하여 개발 편의성을 높입니다. 예를 들어, 사용자들이 단순히 스크롤할 수 있는 긴 목록을 필요로 할 때 FlatList를 사용하는 것이 좋습니다.

SectionList 사용이 적합한 경우

SectionList는 섹션별로 그룹화된 데이터를 렌더링할 때 적합합니다. 예를 들어, 알파벳 순으로 연락처를 그룹화하거나 날짜별로 목록을 나누어야 하는 경우 SectionList가 더 적합합니다. SectionList는 FlatList와 유사하지만, 데이터의 그룹화와 섹션 헤더를 추가로 관리할 수 있는 기능을 제공하여 더 복잡한 데이터를 처리하는 데 유용합니다. 따라서 데이터를 카테고리별로 분류하여 렌더링할 필요가 있을 때 SectionList를 사용하는 것이 이상적입니다.

 

마무리하며

React Native에서 'VirtualizedList'를 사용하다 보면 성능 문제에 직면하기 쉽습니다. 그러나 getItemLayout, keyExtractor 최적화, 'Windowing' 기법 등을 활용하여 성능 문제를 효과적으로 해결할 수 있습니다. 또한, 상황에 맞게 FlatList나 SectionList를 선택하여 사용하면 더욱 효율적인 개발이 가능합니다. 이 글에서 소개한 방법들이 앱 성능을 한층 더 개선하는 데 도움이 되기를 바랍니다. 성능 최적화는 단순한 선택이 아니라, 사용자 경험을 향상시키는 중요한 과정입니다. React Native에서 'VirtualizedList' 관련 성능 문제를 해결하여 더욱 부드럽고 빠른 앱을 만들어봅시다.

반응형