Skip to content

๐Ÿš€ FlatList์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ๋‹ค๋ฃฌ React Native ํ”„๋กœ์ ํŠธ

Notifications You must be signed in to change notification settings

react-native-seoul/flatlist-optimization

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

26 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

FlatList ์ตœ์ ํ™”

๊ฐœ์š”

FlatList์—์„œ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ, ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”๋ฅผ ์ „ํ–‰ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ ํ™” ๋ฐฉ๋ฒ• 1. memo, useCallback์˜ ์‚ฌ์šฉ

  • react-native ํ”„๋กœ์ ํŠธ์—์„œ FlatList ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด๋ฉด ์ˆœ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ FlatList๋ฅผ ๊ฐ์‹ธ๊ณ ์žˆ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋‚ด๋ ค์ฃผ๋Š” props๋“ค ์ค‘ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ •์˜ํ•˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋“ค์„ ์ต๋ช…ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ useCallback์œผ๋กœ ๊ฐ์‹ธ์ฃผ๋ฉด, ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์œผ๋กœ ์ธํ•œ FlatList์˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด ์ตœ์ ํ™”์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ FlatList์˜ ์•„์ดํ…œ์ด ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์— memo๋ฅผ ์ ์šฉํ•˜์—ฌ ์ˆœ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์–ด์ฃผ์–ด, ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
memo ์‚ฌ์šฉ ์˜ˆ์‹œ
  • memo๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ(HOC)์ž…๋‹ˆ๋‹ค. ์ธ์ž๋กœ ๋“ค์–ด์˜จ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ˆœ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋Š” props๊ฐ€ ๋ณ€ํ•˜๊ฑฐ๋‚˜ ๋‚ด๋ถ€ state๊ฐ€ ๋ณ€ํ•  ๋•Œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.
const PhotoView = memo(({photo, onPress, selected}: PhotoViewProps) => {
 //
}
useCallBack ์‚ฌ์šฉ ์˜ˆ์‹œ
  • PhotoView์˜ props์ธ onPress์— ์ „ํ•ด์ง€๋Š” onPressPhoto ์ฝœ๋ฐฑํ•จ์ˆ˜ ์—ญ์‹œ useCallback์œผ๋กœ ๊ฐ์‹ธ์ฃผ์–ด์„œ,PhotoView์˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์•„์ค๋‹ˆ๋‹ค.
const onPressPhoto = useCallback((photo: Photo) => {
  setPhotoIds(([...draft]) => {
    const idx = draft.indexOf(photo.id);

    if (idx > -1) {
      draft.splice(idx, 1);
    } else {
      draft.push(photo.id);
    }

    return draft;
  });
}, []);

const renderItem: ListRenderItem<Photo> = useCallback(
  ({item}) => (
    <PhotoView
      selected={photoIds.indexOf(item.id) > -1}
      photo={item}
      onPress={onPressPhoto}
    />
  ),
  [photoIds, onPressPhoto],
);

์ตœ์ ํ™” ๋ฐฉ๋ฒ• 2. FlatList์—์„œ ์ œ๊ณตํ•˜๋Š” props ์‚ฌ์šฉ

2-1. removeClippedSubviews

  • SubView(์ž์‹)๊ฐ€ SuperView(๋ถ€๋ชจ)์˜ ์˜์—ญ๊ณผ ๊ฒน์น˜๋Š” ์˜์—ญ์ด ์—†๋‹ค๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ๊ณ„์ธต ๋“œ๋กœ์–ด์—์„œ ํ•ด๋‹น SubView๋ฅผ ์ œ๊ฑฐ(detach)ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ๊ฑฐ๋œ SubView์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ deallocated ๋˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค.

2-2. keyExtractor

  • ์ปดํฌ๋„ŒํŠธ ๋ฆฌ์ŠคํŠธ์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ•  ๋•Œ ์ตœ์ ํ™”๋œ ์ž‘์—…์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ Œ๋”๋ง๋œ ์•„์ดํ…œ์˜ ๋†’์ด๋ฅผ ์ €์žฅํ•˜๋Š” ํ‚ค๋กœ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2-3. getItemLayout

  • ๋ฆฌ์ŠคํŠธ์˜ ๋†’์ด์™€ ๋„ˆ๋น„๋ฅผ ๋ฏธ๋ฆฌ ํ™•์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. getItemLayout์ด ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด ๊ฐ Cell ์ปดํฌ๋„ŒํŠธ์— onLayout ํ•จ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. onLayout ํ•จ์ˆ˜๋Š” ๋ Œ๋”๋ง ๋˜๋Š” Cell ์ปดํฌ๋„ŒํŠธ์˜ ๋†’์ด๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ฆฌ์ŠคํŠธ ์ •๋ณด๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฌด๊ฑฐ์šด ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ ์•„์ดํ…œ์ด ๋ Œ๋”๋ง ๋  ๋•Œ ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ ๊ณผ์ •์ด ์ค„์–ด๋“ค์–ด ์ตœ์ ํ™”์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

2-4 windowSize

  • ํ˜„์žฌ viewport ๋†’์ด๋ฅผ 1๋กœ ์žก๊ณ  ์•„์ดํ…œ์„ ๋ Œ๋”๋งํ•  ๋ฒ”์œ„๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๋ Œ๋”๋ง์„ ์‹œ๋„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ์ˆซ์ž๋ฅผ ์ค„์ž„์œผ๋กœ์จ ํ•œ๋ฒˆ์— ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ˆซ์ž๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2-5 maxToRenderPerBatch

  • FlatList ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” VirtualizedList์˜ props์ž…๋‹ˆ๋‹ค. batch ๋‹น ๋ Œ๋”๋ง๋  ์•„์ดํ…œ์˜ ์ˆ˜๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2-6 initialNumToRender

  • ์ฒ˜์Œ ๋ Œ๋”๋งํ•  FlatList ์•„์ดํ…œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋””๋ฐ”์ด์Šค ํฌ๊ธฐ๊ฐ€ ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๋ฏ€๋กœ, ํ•œ ํ™”๋ฉด์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์•„์ดํ…œ์˜ ์ˆ˜๋„ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํ•œ ๊ฐœ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ ํ™” ๋ฐฉ๋ฒ• 3. react-native-fast-image์˜ ์‚ฌ์šฉ

  • FlatList์—์„œ Render window๋ฅผ ๋ฒ—์–ด๋‚œ ์ปดํฌ๋„ŒํŠธ๋Š” ์–ธ๋งˆ์šดํŠธ๋ฉ๋‹ˆ๋‹ค. ์–ธ๋งˆ์šดํŠธ๋œ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹ค์‹œ Render window์— ๋“ค์–ด์™”์„ ๋•Œ ๋งˆ์šดํŠธ๋ฉ๋‹ˆ๋‹ค. FlatList์˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŒ์•ฝ ์ด๋ฏธ์ง€๋ฅผ ํฌํ•จํ•œ๋‹ค๋ฉด ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค. FastImage๋ฅผ ์ ์šฉํ•˜๋ฉด ์บ์‹œ๋œ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๊ฑด๋„ˆ๋›ฐ๊ณ , ๋น ๋ฅธ ์ด๋ฏธ์ง€ ๋กœ๋”ฉ์œผ๋กœ JS Thread์˜ ๋ถ€ํ•˜๋ฅผ ๊ฐ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

About

๐Ÿš€ FlatList์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ๋‹ค๋ฃฌ React Native ํ”„๋กœ์ ํŠธ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •