๐Ÿ“„ 47. React Native ๋ฆฌ์ŠคํŠธ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋žต โ€” FlatList, SectionList, memo๊นŒ์ง€

JM_Devยท2025๋…„ 6์›” 10์ผ
0
post-thumbnail

React Native์—์„œ ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง์€
๋‰ด์Šค ํ”ผ๋“œ, ๋ฉ”์‹œ์ง€, ์ƒํ’ˆ ๋ชฉ๋ก ๋“ฑ
์•ฑ์˜ ๊ฑฐ์˜ ๋ชจ๋“  ์ฃผ์š” ๊ธฐ๋Šฅ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋งŽ์•„์ง€๊ณ  ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก
์Šคํฌ๋กค์ด ๋Š๊ธฐ๊ฑฐ๋‚˜, ์ด๋ฏธ์ง€๊ฐ€ ๊นœ๋นก์ด๊ฑฐ๋‚˜, ์•ฑ์ด ๋А๋ ค์ง€๋Š” ํ˜„์ƒ์ด ์ƒ๊ธด๋‹ค.

์ด๋ฒˆ ๊ธ€์€ ์‹ค์ œ๋กœ ์ž์ฃผ ๊ฒช๋Š” ๋ฆฌ์ŠคํŠธ ์„ฑ๋Šฅ ์ด์Šˆ์™€ ํ•ด๊ฒฐ ์ „๋žต์„ ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ค.


โœ… FlatList vs ScrollView

ํ•ญ๋ชฉScrollViewFlatList
๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜์ ์€ ์ˆ˜๋งŽ์€ ์ˆ˜
๋ Œ๋”๋ง ๋ฐฉ์‹์ „์ฒด ๋ Œ๋”๋งํ™”๋ฉด์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋ง
์„ฑ๋Šฅ๋‚ฎ์Œ๋†’์Œ (๊ฐ€์ƒํ™”)

๐Ÿง  ๋ฆฌ์ŠคํŠธ์— 10๊ฐœ ์ด์ƒ ์•„์ดํ…œ์ด ์žˆ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด FlatList๋ฅผ ์“ฐ์ž!


๐Ÿงฉ FlatList ๊ธฐ๋ณธ ๊ตฌ์กฐ

<FlatList
  data={data}
  renderItem={({ item }) => <ItemCard item={item} />}
  keyExtractor={(item) => item.id.toString()}
  initialNumToRender={10}
  maxToRenderPerBatch={10}
/>

์ฃผ์š” ์†์„ฑ

  • data: ๋ Œ๋”๋งํ•  ๋ฐฐ์—ด
  • renderItem: ์•„์ดํ…œ ํ•˜๋‚˜์”ฉ ๊ทธ๋ฆฌ๋Š” ํ•จ์ˆ˜
  • keyExtractor: ๊ฐ ์•„์ดํ…œ์˜ ๊ณ ์œ  key ์„ค์ • (ํ•„์ˆ˜!)
  • initialNumToRender: ์ฒ˜์Œ ๋ Œ๋”๋งํ•  ์•„์ดํ…œ ์ˆ˜
  • maxToRenderPerBatch: ์ถ”๊ฐ€ ๋ Œ๋”๋งํ•  ์ตœ๋Œ€ ์ˆ˜

๐Ÿง  ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋žต

์ „๋žต์„ค๋ช…
keyExtractor ์ตœ์ ํ™”๊ณ ์œ ํ•œ string ๋˜๋Š” id ๋ฐ˜ํ™˜
shouldComponentUpdate or memo()๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€
getItemLayout๊ณ ์ • ๋†’์ด์ผ ๊ฒฝ์šฐ ์œ„์น˜ ๊ณ„์‚ฐ ์ตœ์ ํ™”
removeClippedSubviewsํ™”๋ฉด ๋ฐ– ์ปดํฌ๋„ŒํŠธ ์ œ๊ฑฐ
windowSize๋ Œ๋”๋ง ๋ฒ”์œ„ ์กฐ์ ˆ (๊ธฐ๋ณธ๊ฐ’: 21)

โœจ ์ปดํฌ๋„ŒํŠธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜

const ItemCard = React.memo(({ item }) => {
  return <Text>{item.name}</Text>;
});

โœ… ๊ฐ™์€ ์•„์ดํ…œ์ด๋ฉด ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Œ
โœ… ๋ฆฌ์ŠคํŠธ์— ๋งŽ์€ ์•„์ดํ…œ์ด ์žˆ์„์ˆ˜๋ก ํšจ๊ณผ ํผ


๐Ÿงฉ SectionList๋„ ์ ๊ทน ํ™œ์šฉ

<SectionList
  sections={[
    { title: '์˜ค๋Š˜', data: todayItems },
    { title: '์–ด์ œ', data: yesterdayItems },
  ]}
  renderItem={({ item }) => <Text>{item.name}</Text>}
  renderSectionHeader={({ section }) => <Text>{section.title}</Text>}
/>

โœ… ๋‚ ์งœ๋ณ„, ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋ถ„๋ฆฌ
โœ… ๋‚ด๋ถ€์ ์œผ๋กœ๋„ FlatList ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ ์„ฑ๋Šฅ ์ข‹์Œ


๐Ÿ’ก ์‹ค์ „ ํŒ

์ƒํ™ฉ์ „๋žต
์ด๋ฏธ์ง€๊ฐ€ ๊นœ๋นก์ธ๋‹คFastImage ์‚ฌ์šฉ + memo ์ ์šฉ
๋ Œ๋”๋ง์ด ๋А๋ฆฌ๋‹คgetItemLayout ์„ค์ •
์Šคํฌ๋กค์ด ๋ฒ„๋ฒ…์ธ๋‹คinitialNumToRender, maxToRenderPerBatch ์กฐ์ •
๋ฆฌ์ŠคํŠธ ๋‚ด๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ์–ด๋ ต๋‹คZustand๋กœ ์ƒํƒœ ๋ถ„๋ฆฌ

๐Ÿ“ ๋‚ด๊ฐ€ ๋А๋‚€ ์ 

์ดˆ๊ธฐ์— ScrollView๋งŒ ์จ์„œ ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ,
์Šคํฌ๋กค์ด ๋„ˆ๋ฌด ๋ฒ„๋ฒ…์ด๊ณ  ์ด๋ฏธ์ง€๊ฐ€ ๊ณ„์† ๊นœ๋นก์˜€๋‹ค.
FlatList๋กœ ๋ฐ”๊พธ๊ณ , memo + keyExtractor ์ตœ์ ํ™”๋งŒ ํ–ˆ๋Š”๋ฐ
์‚ฌ์šฉ์ž ๋ฐ˜์‘ ์†๋„, ์Šคํฌ๋กค ๋ถ€๋“œ๋Ÿฌ์›€์ด ์ฒด๊ฐ๋  ์ •๋„๋กœ ์ข‹์•„์กŒ๋‹ค.

์ด์ œ๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ 10๊ฐœ๋งŒ ๋„˜์–ด๊ฐ€๋„ FlatList + ์„ฑ๋Šฅ ์ „๋žต์„ ๊ธฐ๋ณธ์œผ๋กœ ๊น”๊ณ  ๊ฐ„๋‹ค.


๐Ÿ“„ โ€œ์•ฑ์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ์€ ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง์—์„œ ๊ฐˆ๋ฆฐ๋‹ค.โ€


profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€