
React Native๋ก ์ฑ์ ๋ง๋ค๋ค ๋ณด๋ฉด ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ ๋์ํ์ง๋ง, ์ฑ๋ฅ์ด ๋จ์ด์ ธ UX์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ณค ํ๋ค. ์ฑ ์ต์ ํ๋ ๋จ์ํ ๋น ๋ฅธ ์๋๊ฐ ์๋๋ผ ๋ฐฐํฐ๋ฆฌ ์๋ชจ, ๋ฉ๋ชจ๋ฆฌ ํจ์จ, UX ์์ ์ฑ๊น์ง ์ฐ๊ฒฐ๋๋ค. ์ด๋ฒ ๊ธ์์๋ ์ฑ๋ฅ ์ต์ ํ ํต์ฌ ์์๋ค์ ์ ๋ฆฌํ๋ค.
React Native ์ฑ์ React์ ๋ ๋๋ง ์๋ฆฌ๋ฅผ ๊ทธ๋๋ก ๋ฐ๋ฅธ๋ค. ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ฑ๋ฅ ์ ํ์ ์ฃผ์ ์์ธ์ด๋ค.
React.memo / useCallback / useMemoconst 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} />;
}
keyExtractor ์ง์ getItemLayout ์ฌ์ฉํด ์คํฌ๋กค ์ฑ๋ฅ ๊ฐ์ initialNumToRender, windowSize ์กฐ์ <FlatList
data={list}
keyExtractor={(item) => item.id.toString()}
renderItem={({ item }) => <Text>{item.name}</Text>}
initialNumToRender={10}
windowSize={5}
/>
react-native-fast-image ์ฌ์ฉsetInterval / setTimeout ์ ๋ฆฌuseEffect cleanup ํ์ฉuseEffect(() => {
const interval = setInterval(() => {
console.log("running...");
}, 1000);
return () => clearInterval(interval); // cleanup
}, []);
JavaScript ๋ ์ด์ด์์ ๋ฌด๊ฑฐ์ด ์ฐ์ฐ์ ํ๋ฉด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋ค.
expo-modules ํ์ฉ ๊ฐ๋ฅ ์: ์์ ์ฒ๋ฆฌ, ์ํธํ, ๋์ฉ๋ ๋ฐ์ดํฐ ์์ถ ๋ฑ
| ๊ตฌ๋ถ | ์ฒดํฌ๋ฆฌ์คํธ |
|---|---|
| ๋ ๋๋ง | React.memo / useCallback / FlatList ์ต์ ํ |
| ๋ฉ๋ชจ๋ฆฌ | ์ด๋ฏธ์ง ์บ์ / useEffect cleanup |
| ๋คํธ์ํฌ | API ์บ์ฑ / ๋ฐฐ์น ์์ฒญ / CDN |
| ๋ค์ดํฐ๋ธ | ๋ฌด๊ฑฐ์ด ์ฐ์ฐ์ ๋ค์ดํฐ๋ธ ๋ชจ๋๋ก |
| ๋น๋ | Hermes / Proguard / ๋ฒ๋ค ์ต์ ํ |
React Native ์ฑ๋ฅ ์ต์ ํ๋ ํ ๋ฒ์ ๋๋๋ ์ผ์ด ์๋๋ค.