๐Ÿ–ผ๏ธ 80. React Native ์„ฑ๋Šฅ ์ตœ์ ํ™” ์™„์ „ ์ •๋ฆฌ โ€” ๋ Œ๋”๋ง, ๋ฉ”๋ชจ๋ฆฌ, ๋„คํŠธ์›Œํฌ

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

React Native๋กœ ์•ฑ์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ ์ž˜ ๋™์ž‘ํ•˜์ง€๋งŒ, ์„ฑ๋Šฅ์ด ๋–จ์–ด์ ธ UX์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ณค ํ•œ๋‹ค. ์•ฑ ์ตœ์ ํ™”๋Š” ๋‹จ์ˆœํžˆ ๋น ๋ฅธ ์†๋„๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐฐํ„ฐ๋ฆฌ ์†Œ๋ชจ, ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ, UX ์•ˆ์ •์„ฑ๊นŒ์ง€ ์—ฐ๊ฒฐ๋œ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ•ต์‹ฌ ์š”์†Œ๋“ค์„ ์ •๋ฆฌํ–ˆ๋‹ค.


1. ๋ Œ๋”๋ง ์ตœ์ ํ™”

React Native ์•ฑ์€ React์˜ ๋ Œ๋”๋ง ์›๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฅธ๋‹ค. ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์€ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ์š” ์›์ธ์ด๋‹ค.

1) React.memo / useCallback / useMemo

  • React.memo : props ๋ณ€ํ™”๊ฐ€ ์—†์œผ๋ฉด ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€
  • useCallback : ํ•จ์ˆ˜๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•˜์—ฌ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€
  • useMemo : ๊ณ„์‚ฐ๋Ÿ‰ ๋งŽ์€ ์—ฐ์‚ฐ ์บ์‹ฑ
const Child = React.memo(({ onClick }: { onClick: () => void }) => {
  console.log("rendered");
  return <Button title="Click" onPress={onClick} />;
});

export default function App() {
  const [count, setCount] = useState(0);
  const handleClick = useCallback(() => setCount((c) => c + 1), []);
  return <Child onClick={handleClick} />;
}

2) FlatList ์ตœ์ ํ™”

  • keyExtractor ์ง€์ •
  • getItemLayout ์‚ฌ์šฉํ•ด ์Šคํฌ๋กค ์„ฑ๋Šฅ ๊ฐœ์„ 
  • initialNumToRender, windowSize ์กฐ์ ˆ
<FlatList
  data={list}
  keyExtractor={(item) => item.id.toString()}
  renderItem={({ item }) => <Text>{item.name}</Text>}
  initialNumToRender={10}
  windowSize={5}
/>

2. ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”

1) ์ด๋ฏธ์ง€ ์ตœ์ ํ™”

  • react-native-fast-image ์‚ฌ์šฉ
  • ์„œ๋ฒ„์—์„œ ์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ฆˆ ํ›„ ์ „๋‹ฌ
  • ํ•„์š” ์—†๋Š” ์ด๋ฏธ์ง€ ์บ์‹œ๋Š” ์ฆ‰์‹œ ํ•ด์ œ

2) ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ ๋ฐฉ์ง€

  • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ•ด์ œ ํ•„์ˆ˜
  • setInterval / setTimeout ์ •๋ฆฌ
  • useEffect cleanup ํ™œ์šฉ
useEffect(() => {
  const interval = setInterval(() => {
    console.log("running...");
  }, 1000);

  return () => clearInterval(interval); // cleanup
}, []);

3. ๋„คํŠธ์›Œํฌ ์ตœ์ ํ™”

1) ์บ์‹ฑ

  • REST API โ†’ Axios + ์บ์‹œ ์ „๋žต
  • GraphQL โ†’ Apollo Client ์บ์‹ฑ
  • Firebase โ†’ ์˜คํ”„๋ผ์ธ ํผ์‹œ์Šคํ„ด์Šค ํ™œ์šฉ

2) ๋ฐฐ์น˜ ์š”์ฒญ & ์ง€์—ฐ ๋กœ๋”ฉ

  • ์—ฌ๋Ÿฌ API ์š”์ฒญ์„ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌ
  • ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋Š” ์ฒซ ํ™”๋ฉด ์ดํ›„ ๋กœ๋”ฉ

3) CDN ํ™œ์šฉ

  • ์ด๋ฏธ์ง€, ์ •์  ํŒŒ์ผ์„ CDN์— ๋ฐฐํฌํ•ด ์‘๋‹ต ์†๋„ ๊ฐœ์„ 

4. ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ํ™œ์šฉ

JavaScript ๋ ˆ์ด์–ด์—์„œ ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์„ ํ•˜๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • ๋ณต์žกํ•œ ์—ฐ์‚ฐ์€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ๋กœ ์˜คํ”„๋กœ๋“œ
  • Expo ์•ฑ์—์„œ๋Š” expo-modules ํ™œ์šฉ ๊ฐ€๋Šฅ

์˜ˆ: ์˜์ƒ ์ฒ˜๋ฆฌ, ์•”ํ˜ธํ™”, ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์••์ถ• ๋“ฑ


5. ๋นŒ๋“œ/๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™”

  • Hermes ์—”์ง„ ํ™œ์„ฑํ™” โ†’ JS ์‹คํ–‰ ์†๋„ ๊ฐœ์„ 
  • Proguard & R8 โ†’ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ์šฉ๋Ÿ‰ ์ถ•์†Œ
  • Bitcode (iOS) โ†’ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ž๋™ ์ƒ์„ฑ
  • Bundle Split โ†’ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์ตœ์ ํ™”

๐Ÿ“ฆ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ฒดํฌ๋ฆฌ์ŠคํŠธ

๊ตฌ๋ถ„์ฒดํฌ๋ฆฌ์ŠคํŠธ
๋ Œ๋”๋งReact.memo / useCallback / FlatList ์ตœ์ ํ™”
๋ฉ”๋ชจ๋ฆฌ์ด๋ฏธ์ง€ ์บ์‹œ / useEffect cleanup
๋„คํŠธ์›ŒํฌAPI ์บ์‹ฑ / ๋ฐฐ์น˜ ์š”์ฒญ / CDN
๋„ค์ดํ‹ฐ๋ธŒ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ๋กœ
๋นŒ๋“œHermes / Proguard / ๋ฒˆ๋“ค ์ตœ์ ํ™”

๐Ÿง  ์ •๋ฆฌ

React Native ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ํ•œ ๋ฒˆ์— ๋๋‚˜๋Š” ์ผ์ด ์•„๋‹ˆ๋‹ค.

  • ๋ Œ๋”๋ง, ๋ฉ”๋ชจ๋ฆฌ, ๋„คํŠธ์›Œํฌ, ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ, ๋นŒ๋“œ ๋‹จ๊ณ„๊นŒ์ง€ ์ „์ฒด์ ์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.
  • ํŠนํžˆ Hermes ์—”์ง„ ํ™œ์„ฑํ™”์™€ FlatList ์ตœ์ ํ™”๋Š” ํšจ๊ณผ๊ฐ€ ํฌ๋‹ค.
  • ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๋งŒ ์ค„์—ฌ๋„ ์ฒด๊ฐ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ์ข‹์•„์ง„๋‹ค.

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

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