react-native

React-native FlatList 에서 getItemLayout 이란?

프론트엔드개발자치키닝 2025. 2. 23. 20:37

getItemLayout에 대해 gpt에게 물어보니 다음과 같이 답변해주었습니다.

getItemLayoutFlatList가 각 아이템의 크기와 위치를 미리 알 수 있도록 하여 스크롤 성능을 개선합니다. 이 prop을 사용하면 FlatList가 불필요한 크기 계산을 줄이고 렌더링 효율성을 높일 수 있습니다.


보통 getItemLayout을 포함한 FlatList는 아래와 같이 작성됩니다.

const getItemLayout = (data, index) => ({
  length: ITEM_HEIGHT, // 아이템 높이
  offset: ITEM_HEIGHT * index, // 오프셋
  index, // 인덱스
});

<FlatList
  data={data}
  renderItem={renderItem}
  getItemLayout={getItemLayout}
/>


이때 아이템의 높이값을 우선적으로 제시하여 최적화된 렌더링에 도움을 준다고 알려져 있는데요. 이때 offset이 무엇인지 헷갈리는 경우가 있습니다.

오프셋(offset)은 리스트의 맨 위(시작점)부터 특정 아이템이 시작되는 위치까지의 거리를 의미합니다. 이 값은 픽셀 단위로 계산되며, FlatList가 스크롤할 때 아이템의 위치를 빠르게 파악할 수 있도록 도와줍니다. 결과적으로 렌더링 성능이 개선되고 스크롤이 더 부드러워집니다.


오프셋의 역할과 계산 방식


getItemLayout은 다음과 같은 세 가지 값을 반환합니다:


  • length: 각 아이템의 높이(또는 가로 스크롤이라면 너비)를 나타냅니다. 여기서는 ITEM_HEIGHT로 고정된 값이 사용됩니다.
  • offset: 리스트 시작점부터 해당 아이템이 시작되는 지점까지의 거리입니다. 코드에서 offset: ITEM_HEIGHT * index로 계산됩니다.
  • index: 아이템의 순서를 나타내는 인덱스입니다.

오프셋은 인덱스와 아이템 높이를 곱해서 구합니다. 예를 들어, ITEM_HEIGHT가 50픽셀이라고 가정하면:


  • 첫 번째 아이템 (index 0): offset = 50 * 0 = 0
  • 두 번째 아이템 (index 1): offset = 50 * 1 = 50
  • 세 번째 아이템 (index 2): offset = 50 * 2 = 100

즉, 오프셋은 각 아이템이 리스트의 맨 위에서 얼마나 떨어져 있는지를 나타내는 값입니다.


예시로 이해하기


만약 리스트에 3개의 아이템이 있고, 각 아이템의 높이가 50픽셀이라면:


  • 첫 번째 아이템은 맨 위에서 시작하므로 오프셋이 0입니다.
  • 두 번째 아이템은 첫 번째 아이템의 높이(50)만큼 떨어져 있으므로 오프셋이 50입니다.
  • 세 번째 아이템은 첫 번째와 두 번째 아이템의 높이 합(100)만큼 떨어져 있으므로 오프셋이 100입니다.

왜 오프셋이 중요한가?


FlatList는 기본적으로 아이템의 크기와 위치를 동적으로 계산합니다. 하지만 getItemLayout을 사용해 오프셋을 미리 알려주면, 이 계산 과정을 생략할 수 있습니다. 특히 긴 리스트나 빠른 스크롤이 필요한 경우, 오프셋을 통해 아이템 위치를 즉시 파악하므로 성능이 최적화되고 사용자 경험이 개선됩니다.