๐ React Native Lazy Loading์ผ๋ก ์ฑ ์์ ์๋ ๊ฐ์ ํ๊ธฐ
์ด๋ฒ์ ํ์ฌ์์ ์ฑ ์ฑ๋ฅ ๊ฐ์ ์์
์
๋ฌด๋ฅผ ํ๋ฉฐ ์์ ์๋ ๊ฐ์ ์ ์ํด Lazy Loading์ ๋์
ํ์ต๋๋ค.
๊ทธ ๊ณผ์ ์์ ์ฑ ์์ ์๋๋ฅผ 2~3๋ฐฐ ๊ฐ์ ํ๋ ์ฑ๊ณผ๋ ์์๊ณ , ์ด๊ฑธ ์ธก์ ํ๊ณ ๋ถ์ํ๋๋ผ RN ๊ตฌ๋ ๋ฐฉ์์ ๋ํด์๋ ๊น๊ฒ ํ์
ํ๋ฉฐ ์ด๋ฆฌ์ ๋ฆฌ ๊ณต๋ถ๊ฐ ๋ง์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ผ react native์์์ Lazy Loading๊ณผ ์ ์ฉ์ ํตํ ์๋ ๊ฐ์ , ์ธก์ ๋ฐฉ์๊น์ง ์๊ฐ๋๋ฆฝ๋๋ค.
๐ React Native ์ฑ์ด ์คํ๋ ๋
React Native๋ก ๋น๋ํ ์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด๋ถ์ ๋จ์ผ ๋ฒ๋ค ํ์ผ์ด ์กด์ฌํฉ๋๋ค.
์ด ๋ฒ๋ค ํ์ผ์ ์ฑ์ ์คํํ ๋ entry point์ธ index.js์์๋ถํฐ ๋ชจ๋ import๋ฅผ ํ๊ณ ๋ค์ด๊ฐ ์ ์ฒด JS ์ฝ๋๋ฅผ ํ๊ฐํ๊ธฐ ์์ํฉ๋๋ค.
๊ทธ๋ ๊ฒ ์ฝ๋ ํ๊ฐ๊ฐ ๋๋ฌ๋ค๋ฉด ๊ทธ์ ์ผ ๋ฉ์ถฐ์๋ ํ๋ฉด์ด ํ๋ฆฌ๋ฉด์ ์ฒซ ๋ ๋๋ง์ด ์์๋ฉ๋๋ค.
๐ ์ฑ ์์ ์๋๋ฅผ ์ฌ๋ฆฌ๋ ๋ฐฉ๋ฒ
์ด ๋ฒ๋ค ์ฝ๋๋ฅผ ํ๊ฐํ๋๋ผ ์ฑ ์์ ์๊ฐ์ด ์ง์ฐ๋๋ค๋ ๊ฒ์ ์์๊ณ , ๊ทธ๋ผ ๋ฒ๋ค ์ฝ๋ ํ๊ฐ ์๊ฐ์ ์ํฅ์ ์ฃผ๋ ์์๋ ๋ฌด์์ผ๊น์?
๋น์ฐํ๊ฒ ์ง๋ง ๋ฐ๋ก ๋ฒ๋ค์ ์ฌ์ด์ฆ์
๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฐ์ ์คํ ๊ด์ ์ผ๋ก ๋ณธ๋ค๋ฉด ๋ฒ๋ค ๋ก๋๋ ํ๊ฐ ๋จ๊ณ์
๋๋ค.
๋ณต์กํ ์ฐ์ฐ ๊ฐ์ ๊ฒ๋ค์ ์คํ ๋จ๊ณ์ ํฌํจ์ด ๋๋๊น ์ฑ ์์ ์๊ฐ์ ์ํฅ์ ์ฃผ์ง ์๊ณ , ๊ทธ์ ๋ง์ JS ์ฝ๋๋๊ณผ ๋ฒ๋ค ์ฉ๋์ด ํ๊ฐ ๋จ๊ณ์ ์ํฅ์ ์ค ์์ ์๊ฐ์ ๋๋ฆฌ๋ ์์๊ฐ ๋ฉ๋๋ค.
๊ทธ๋ผ ์ฑ ์์ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ค๋ฉด ๋ฒ๋ค ์ฌ์ด์ฆ๋ฅผ ์ค์ด๊ฑฐ๋ ํ๊ฐํ ์ฝ๋๋ฅผ ์ค์ด๋ฉด ๋๊ฒ ์ฃ ?
ํ์ง๋ง ๋ฒ๋ค ์ฌ์ด์ฆ๋ฅผ ํ์คํ๊ฒ ์ค์ด๋ ๊ฑด ๋๋ฌด ์ด๋ ค์ด ์ผ์
๋๋ค.
์ ์ด์ Metro ๋ฒ๋ค๋ฌ๋ Tree Shaking์ ์ง์ํ์ง ์๊ธฐ๋ ํ๊ณ , ํ์์ด๋ ๋ณธ์ธ์ด ์์ฑํ ๋ถํ์ํ ์ฝ๋๋ฅผ ์ค์ด๋ ๊ฑด ๋ฒ๋ค ์ฌ์ด์ฆ์ ํฐ๋ ์ ๋ฉ๋๋ค. ๊ฒฐ๊ตญ ์ฉ๋์ด ํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๋ฆฌํ๋ ๊ฒ ๊ฐ์ฅ ํ์คํ ๋ฐฉ๋ฒ์ธ๋ฐ, ์ด๊ฑด ๋ ๋ง์ด๊ทธ๋ ์ด์
ํด์ผ ํ๋ ๋ฆฌ์์ค๊ฐ ํ์ํด์ ์ฝ์ง ์์ฃ .
๊ฒฐ๊ตญ ์ฝ๋ ํ๊ฐ๋ง ๋จ๊ฒ ๋์๋๋ฐ, ์ด๊ฑด ๋น๊ต์ ์ฝ์ต๋๋ค.
๋ฐ๋ก Lazy Loading์ ํตํด์์.
๐ React Native์ Lazy Loading
const LazyComponent = React.lazy(() => import("../Component"))
React์์๋ ์์ ๊ฐ์ด React.lazy๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์ปดํฌ๋ํธ ์ฝ๋์ ๋ก๋๋ฅผ ๋ ๋ ์ ๊น์ง ์ง์ฐ์ํฌ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์คํ ์์ ๊น์ง ์ฝ๋ ํ๊ฐ๋ฅผ ์ง์ฐ์์ผ ์ด๊ธฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๊ฒ ๋์ด์ "์ฑ ์์ ํ ์ฒซ ์ฝํ
์ธ ๋ ๋๋ง ์์ ์๊ฐ"์ธ "First Contentful Paint(FCP)"์ ๊ฐ์ ํ ์ ์๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ๊ฐ์ React์ง๋ง ์น์์ ์ฌ์ฉํ ๋์ RN์ ํตํด ์ฑ์์ ์ฌ์ฉํ ๋์ ๋ช๊ฐ์ง ์ฐจ์ด์ ์ด ์กด์ฌํฉ๋๋ค.
- React Web (Webpack, Vite)
- lazy๊ฐ ์ ์ฉ๋ ์ฝ๋๋ ๋ฒ๋ค๋ฌ๊ฐ ๋ฒ๋ค์ ๋ณ๋์ ์ฒญํฌ๋ก ๋ถ๋ฆฌํด์ค๋๋ค.
- ์ฝ๋์ ์คํ ์์ ์ ๋คํธ์ํฌ ์์ฒญ์ ํตํด ์ฒญํฌ๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
- ๋ฒ๋ค์ด ์ฌ๋ฌ ๊ฐ๋ก ์ชผ๊ฐ์ง๊ณ ๋ฒ๋ค ์ฌ์ด์ฆ์ ์ฐจ์ด๊ฐ ์๊น๋๋ค.
- React Native (Metro)
- lazy๊ฐ ์ ์ฉ๋์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋์ JS ๋ฒ๋ค ํ์ผ๋ก ๋ฒ๋ค๋ง ๋ฉ๋๋ค.
- ์คํ์์ ์ ์ฝ๋๋ฅผ ๋ฒ๋ค์์ ๋ถ๋ฌ์ ํ๊ฐํฉ๋๋ค.
- ๋จ์ผ ๋ฒ๋ค์ด๋ฉฐ ๋ฒ๋ค ์ฌ์ด์ฆ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
์ฌ์ฉํ๊ธฐ์ ํฌ๊ฒ ์ด๋ ต์ง๋ ์์ผ๋ ๋ฐ๋ก ์ ์ฉ ์ ๊ณผ ํ์ ์ฐจ์ด๋ฅผ ํ์ธํด ๋ณด์์ฃ .
๐ Lazy Loading ์ - ํ ์ฐจ์ด ์ธก์ ํ๊ธฐ
GitHub - devlasbe/rn-lazy-loading: React Native์์ Lazy Loading์ ํตํด ์ฑ ์์ ์๋๋ฅผ ์ธก์
React Native์์ Lazy Loading์ ํตํด ์ฑ ์์ ์๋๋ฅผ ์ธก์ . Contribute to devlasbe/rn-lazy-loading development by creating an account on GitHub.
github.com
react-native-performance๋ก ์ฑ ์์ ์๊ฐ ์ธก์ ํ๊ธฐ
๐ react-native-performance๋ก ์ฑ ์์ ์๊ฐ ์ธก์ ํ๊ธฐ์ด๋ฒ์ ํ์ฌ์์ ์ฑ ์ฑ๋ฅ ๊ฐ์ ์ ๋ฌด๋ฅผ ๋งก์ ์ ๋ง ์ด์ฌํ ํ์ต๋๋ค.๊ทธ ๊ณผ์ ์์ ์ฑ ์์ ์๋๋ ์ ๋ง ํฌ๊ฒ ๊ฐ์ ๋์๋๋ฐ, ์์น๋ก ๋ณด์ฌ์ฃผ์ง ์์ผ๋ฉด
lasbe.tistory.com
์ ์ฒด ์์ ์ฝ๋์ ์๊ฐ ์ธก์ ๋ฐฉ๋ฒ์ ์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์.
๊ทธ๋ผ Lazy Loading์ ์ ์ฉํ์ ๋ ์ผ๋ง๋ ์ฑ ์์ ์๊ฐ์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋์ง ์์ ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๐ ๋ฌด๊ฑฐ์ด ์ฝ๋ ๋ง๋ค๊ธฐ
Lazy Loading์ ํจ๊ณผ๋ฅผ ํ์ธํ๊ธฐ ์ํด์๋ ์ฐ์ ์ ๋ง ๋ฌด๊ฑฐ์ด ์ฝ๋๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
๊ทธ๋์ ์ ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค.
1. ๋ฌด์์ ์ฝ๋ ์ ๋๋ฆฌ๊ธฐ

const NestedNavigation = () => {
return (
<NestedStack.Navigator>
<NestedStack.Screen name="HeavyPage1" component={HeavyPage1} />
<NestedStack.Screen name="HeavyPage2" component={HeavyPage2} />
<NestedStack.Screen name="HeavyPage3" component={HeavyPage3} />
<NestedStack.Screen name="HeavyPage4" component={HeavyPage4} />
<NestedStack.Screen name="HeavyPage5" component={HeavyPage5} />
</NestedStack.Navigator>
);
};
export default NestedNavigation;
๊ทธ๋ฅ ์๋ง ๋๋ฆฌ๊ธฐ ์ํด Text ์ปดํฌ๋ํธ๋ฅผ 1000๊ฐ๊ฐ๋ ๋๋ ค ๋ฐ์ ํ์ด์ง๋ฅผ 5๊ฐ ๋ง๋ค์์ต๋๋ค.
ํ์ง๋ง 1000๊ฐ ์ ๋๋ก๋ ์ฉ๋์๋ ํฌ๊ฒ ์ฐจ์ด๊ฐ ์์๊ณ , ๋ฌด์์ ์๋ง ๋๋ ธ๋ค๊ฐ ํ์ผ์ ์๋ชป ์ด์์ ๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ผ๋ก IDE๊ฐ ํฐ์ ธ๋ฒ๋ ค ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ ํํ์ต๋๋ค.
2. ๋ฌด๊ฑฐ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์นํ๊ธฐ
$ yarn add @faker-js/faker lodash mathjs moment ramda
์ฉ๋์ด ํฌ๊ธฐ๋ก ์ ๋ช
ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์น ๋ค ์ค์นํด ์ค ๋ค.
import React from 'react';
import { Text, ScrollView } from 'react-native';
// @ts-ignore
import _ from 'lodash';
// @ts-ignore
import * as Ramda from 'ramda';
import moment from 'moment';
import * as MathJs from 'mathjs';
import * as fakeJs from '@faker-js/faker';
console.log(_);
console.log(moment);
console.log(Ramda);
console.log(MathJs);
console.log(fakeJs);
const ImportHeavyPackagePage = () => {
return (
<ScrollView>
<Text>ImportHeavyPackagePage</Text>
</ScrollView>
);
};
export default ImportHeavyPackagePage;
๋
๋ค ์ ์ฒด ์ฝ๋๋ฅผ import ํด๋ฒ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์ ํํ๊ณ , ๋ฒ๋ค ์ฉ๋์ ํ๊ธฐ์ ์ผ๋ก ๋๋ฆฌ๋ ๋ฐ ์ฑ๊ณตํ์ต๋๋ค.

react-native-bundle-visualizer๋ฅผ ํ์ธํด ๋ณด๋ ๋ฒ๋ค์ ์ฉ๋๊ณผ ์ํ๋ ์์ ๊ฐ์์ต๋๋ค.
์ฉ๋์ 7mb๋ก ์ค์ ํ๋ก๋ํธ ์ฑ ๋ฒ๋ค๊ณผ๋ ํ์ฐธ ์ฐจ์ด๋์ง๋ง, ์ด ์ ๋๋ง ๋์ด๋ ์คํํ๋ ๋ฐ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๐ ์ ์ฉ ์ - ํ ์๊ฐ ์ธก์ ํ๊ธฐ
import { createStackNavigator } from '@react-navigation/stack';
import Home from '../pages/Home';
import { NavigationContainer } from '@react-navigation/native';
import React from 'react';
import { PerformanceMeasureView } from '@shopify/react-native-performance';
// import NestedNavigation from './NestedNavigation';
const NestedNavigation = React.lazy(() => import('./NestedNavigation'));
const RootStack = createStackNavigator();
const PerformanceHomeScreen = () => {
return (
<PerformanceMeasureView screenName="Home" interactive={true}>
<Home />
</PerformanceMeasureView>
);
};
const RootNavigation = () => {
return (
<NavigationContainer>
<RootStack.Navigator initialRouteName="Home">
<RootStack.Screen name="Home" component={PerformanceHomeScreen} />
<RootStack.Screen name="Nested" component={NestedNavigation} />
</RootStack.Navigator>
</NavigationContainer>
);
};
export default RootNavigation;
๋ฌด๊ฑฐ์ด ์ปดํฌ๋ํธ๋ค์ ๋ชจ์๋์ Navigation์ Lazy Loading ํ๋ ๋ฐฉ์์ผ๋ก ์ธก์ ํ์ผ๋ฉฐ, ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Lazy Loading ๋ฏธ์ ์ฉ



- Lazy Loading ์ ์ฉ



ํธ๋ํฐ์ด ์ฑ ์คํ ์ ๋ฒ๋ค์ ํ๊ฐํ๋ ์๊ฐ์ JS Boot Time์
๋๋ค.
release ๋ชจ๋๋ก ๋น๋ํ apk ํ์ผ์ ์๋๋ก์ด๋ ์๋ฎฌ๋ ์ดํฐ์ ์ง์ ์ค์นํด ๊ฐ๊ฐ 3ํ์ฉ ์๊ฐ์ ์ธก์ ํ์ผ๋ฉฐ, ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
| ๋ฏธ์ ์ฉ | ์ ์ฉ | |
| 1ํ์ฐจ | 578ms | 123ms |
| 2ํ์ | 501ms | 88ms |
| 3ํ์ฐจ | 540ms | 84ms |
๊ฐ๋จํ ์คํ์ธ๋ฐ๋ ์์ฒญ๋ ์ฐจ์ด๊ฐ ๋๊ปด์ง๋๋ค.
์ด๋ฒ์ ์
๋ฌด๋ก ํ๋ก๋ํธ ์ฑ ๋ก๋ ์๊ฐ์ ์ฝ 5์ด์์ 1.5์ด๋ก ์ค์์ผ๋ ๋ฒ๋ค ์ฌ์ด์ฆ๊ฐ ํฌ๋ฉด ํด์๋ก, ํธ๋ํฐ ์ฌ์์ด ๋ฎ์ผ๋ฉด ๋ฎ์์๋ก ์ ์ฉ ์ ํ์ ์ฐจ์ด๊ฐ ํ์ฐํ๊ฒ ๋ํ๋๊ฒ ๋ฉ๋๋ค.
๐ ์ฃผ์ํ ์
๊ทธ๋ ์ง๋ง ๋ก๋ ์๊ฐ์ด ์ค์ด๋ ๋ค๊ณ ๋ฌด์์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์ Lazy Loading ํ ์ ์์ต๋๋ค.
์๋ํ๋ฉด ์ฌ์ฉํ๊ฒ ๋ ์ฝ๋๋ค์ ์ด์ฐจํผ ์คํ ์์ ์ ๋ก๋๋๊ธฐ์, ํ๋ฉด ์ด๋ํ ๋๋ง๋ค ๋ก๋ฉ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ฉด ์ฌ์ฉ์์๊ฒ ๋ถํธํจ์ ์ผ๊ธฐํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ ๊ธฐ์ ์ ๋ต์ ์ผ๋ก 1ํ์ฑ ํ๋ฉด์ด๋ ์ฌ์ฉ ๋น๋๊ฐ ๋ฎ์ ํ์ด์ง๋ค์ ์ค์ ์ผ๋ก ์ ์ฉํ๋ฉฐ ์ ์ง์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ ํ์๊ฐ ์์ต๋๋ค.
'React-Native' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| react-native-performance๋ก ์ฑ ์์ ์๊ฐ ์ธก์ ํ๊ธฐ (0) | 2025.05.17 |
|---|---|
| react-native ๋ฒ์ ์ ๊ทธ๋ ์ด๋ ๊ฐ์ด๋, v0.69 to v0.78 (2) | 2025.04.19 |
| 2025๋ React Native ํํฉ๊ณผ CLI vs Expo ๋น๊ต๋ถ์ (2) | 2025.01.15 |
| [React Native] Android Native-Module Event Listener ๋ง๋ค๊ธฐ (0) | 2025.01.10 |
| [React-Native] ScrollView ์คํฌ๋กค ๋ฒ๋ฒ ์ ์ต์ ํํ๊ธฐ (2) | 2023.10.14 |
์คํ ์ฑํ
๋๊ธ