์ปดํฌ๋ํธ ์ฝ๋ ๋ถํ ์ ํตํ React ์ง์ฐ ๋ก๋ฉ ๊ตฌํ ๋ฐฉ๋ฒ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ, ์ฌ์ฉ์ ๊ฒฝํ, ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ํ๊ธฐ์ ์ผ๋ก ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
React ์ง์ฐ ๋ก๋ฉ: ์ปดํฌ๋ํธ ์ฝ๋ ๋ถํ ๋ก ์ฑ๋ฅ ํฅ์์ํค๊ธฐ
์ค๋๋ ์ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฑ๋ฅ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ฌ์ฉ์๋ค์ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ๊ณผ ๋ถ๋๋ฌ์ด ์ํธ์์ฉ์ ๊ธฐ๋ํฉ๋๋ค. ๋ณต์กํ React ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ, ํฐ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค์ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ๊ณผ ์ ๋ฐ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๊ธฐ์ ์ค ํ๋๊ฐ ๋ฐ๋ก ์ง์ฐ ๋ก๋ฉ(lazy loading), ํนํ ์ปดํฌ๋ํธ ์ฝ๋ ๋ถํ ์
๋๋ค. ์ด ๊ธ์์๋ React.lazy
์ Suspense
๋ฅผ ์ฌ์ฉํ์ฌ React ์ง์ฐ ๋ก๋ฉ์ ์ดํดํ๊ณ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ง์ฐ ๋ก๋ฉ๊ณผ ์ฝ๋ ๋ถํ ์ด๋ ๋ฌด์์ธ๊ฐ?
์จ๋๋งจ๋ ๋ก๋ฉ(on-demand loading)์ด๋ผ๊ณ ๋ ์๋ ค์ง ์ง์ฐ ๋ก๋ฉ์ ๋ฆฌ์์ค(์ด ๊ฒฝ์ฐ React ์ปดํฌ๋ํธ)์ ๋ก๋ฉ์ ์ค์ ๋ก ํ์ํ ๋๊น์ง ์ง์ฐ์ํค๋ ๊ธฐ์ ์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์ฝ๋๋ฅผ ํ ๋ฒ์ ๋ก๋ํ๋ ๋์ , ์ด๊ธฐ์ ํ์์ ์ธ ๋ถ๋ถ๋ง ๋ก๋ํ๊ณ ๋๋จธ์ง ์ฝ๋๋ ์ฌ์ฉ์๊ฐ ํน์ ๋ผ์ฐํธ๋ก ์ด๋ํ๊ฑฐ๋ ํน์ ์ปดํฌ๋ํธ์ ์ํธ์์ฉํ ๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํฉ๋๋ค. ์ด๋ ์ด๊ธฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ด๊ณ ์ํธ์์ฉ๊น์ง์ ์๊ฐ(TTI)์ ๊ฐ์ ํฉ๋๋ค.
์ฝ๋ ๋ถํ (Code splitting)์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋๋ฅผ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฒญํฌ(๋ฒ๋ค)๋ก ๋๋๋ ๊ณผ์ ์ ๋๋ค. ์ด ๋ฒ๋ค์ ๋ ๋ฆฝ์ ์ผ๋ก, ๊ทธ๋ฆฌ๊ณ ํ์์ ๋ฐ๋ผ ๋ก๋๋ ์ ์์ต๋๋ค. React ์ง์ฐ ๋ก๋ฉ์ ์ฝ๋ ๋ถํ ์ ํ์ฉํ์ฌ ์ปดํฌ๋ํธ๊ฐ ํ์ํ ๋๋ง ๋ก๋ํฉ๋๋ค.
์ง์ฐ ๋ก๋ฉ๊ณผ ์ฝ๋ ๋ถํ ์ ์ด์
- ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ ๊ฐ์ : ์ด๊ธฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์์ผ๋ก์จ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๊ธฐ์ ๋ค์ด๋ก๋ํ๊ณ ํ์ฑํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์์ด ์ค์ด๋ค์ด ํ์ด์ง ๋ก๋ฉ ์๊ฐ์ด ๋นจ๋ผ์ง๋๋ค. ์ด๋ ํนํ ๋๋ฆฐ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด๋ ์ ์ฌ์ ๊ธฐ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์๊ฒ ์ค์ํฉ๋๋ค.
- ์ฌ์ฉ์ ๊ฒฝํ ํฅ์: ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ์ ๋ ๋ฐ์์ด ๋น ๋ฅด๊ณ ์ฆ๊ฑฐ์ด ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ ธ ์ดํ๋ฅ ์ ์ค์ด๊ณ ์ฌ์ฉ์ ์ฐธ์ฌ๋ฅผ ๋์ ๋๋ค.
- ๋ฆฌ์์ค ์๋น ๊ฐ์: ํ์ํ ์ฝ๋๋ง ๋ก๋ํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ฌ์ฃผ๋ฉฐ, ์ด๋ ํนํ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์ ์ ์ฉํฉ๋๋ค.
- ๋ ๋์ SEO: ๊ฒ์ ์์ง์ ๋ก๋ฉ ์๊ฐ์ด ๋น ๋ฅธ ์น์ฌ์ดํธ๋ฅผ ์ ํธํ๋ฏ๋ก ์น์ฌ์ดํธ์ ๊ฒ์ ์์ง ์์๋ฅผ ํฅ์์ํฌ ์ ์์ต๋๋ค.
React.lazy
์ Suspense
๋ฅผ ์ฌ์ฉํ React ์ง์ฐ ๋ก๋ฉ ๊ตฌํ
React๋ React.lazy
์ Suspense
๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์ง์ฐ ๋ก๋ฉํ๋ ๋ด์ฅ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. React.lazy
๋ ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก importํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, Suspense
๋ ์ปดํฌ๋ํธ๊ฐ ๋ก๋ฉ๋๋ ๋์ ๋์ฒด UI๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
1๋จ๊ณ: React.lazy
๋ฅผ ์ฌ์ฉํ ๋์ import
React.lazy
๋ import()
๋ฅผ ํธ์ถํ๋ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค. import()
ํจ์๋ ๋์ import๋ก, ์ง์ฐ ๋ก๋ฉํ๋ ค๋ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๋ ๋ชจ๋๋ก resolve๋๋ Promise๋ฅผ ๋ฐํํฉ๋๋ค.
import React, { lazy, Suspense } from 'react';
const MyComponent = lazy(() => import('./MyComponent'));
์ด ์์ ์์ MyComponent
๋ ๋ ๋๋ง๋ ๋๊น์ง ๋ก๋๋์ง ์์ต๋๋ค. import('./MyComponent')
๊ตฌ๋ฌธ์ ./MyComponent
ํ์ผ์์ ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก ๊ฐ์ ธ์ต๋๋ค. ๊ฒฝ๋ก๋ ํ์ฌ ํ์ผ์ ๊ธฐ์ค์ผ๋ก ์๋ ๊ฒฝ๋ก์
๋๋ค.
2๋จ๊ณ: Suspense
๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋ฉ ์ํ ์ฒ๋ฆฌํ๊ธฐ
์ง์ฐ ๋ก๋ฉ์ ์ปดํฌ๋ํธ์ ๋น๋๊ธฐ ๋ก๋ฉ์ ํฌํจํ๋ฏ๋ก, ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋๋ ๋์ ๋ก๋ฉ ์ํ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋์ฒด UI๋ฅผ ํ์ํ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ์ด๋ Suspense
๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. Suspense
๋ ์์ ์ปดํฌ๋ํธ๊ฐ ์ค๋น๋ ๋๊น์ง ๋ ๋๋ง์ '์ผ์ ์ค๋จ'ํ ์ ์๊ฒ ํด์ฃผ๋ React ์ปดํฌ๋ํธ์
๋๋ค. ์์ ์ปดํฌ๋ํธ๊ฐ ๋ก๋ฉ๋๋ ๋์ ๋ ๋๋งํ UI๋ฅผ ์ง์ ํ๋ fallback
prop์ ๋ฐ์ต๋๋ค.
import React, { lazy, Suspense } from 'react';
const MyComponent = lazy(() => import('./MyComponent'));
function App() {
return (
Loading...
์ด ์์ ์์ Suspense
์ปดํฌ๋ํธ๋ MyComponent
๋ฅผ ๊ฐ์๋๋ค. MyComponent
๊ฐ ๋ก๋ฉ๋๋ ๋์ fallback
prop(
)์ด ๋ ๋๋ง๋ฉ๋๋ค. MyComponent
๊ฐ ๋ก๋๋๋ฉด ๋์ฒด UI๋ฅผ ๋์ฒดํ๊ฒ ๋ฉ๋๋ค.
์์: React Router ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ผ์ฐํธ ์ง์ฐ ๋ก๋ฉํ๊ธฐ
์ง์ฐ ๋ก๋ฉ์ React Router ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ผ์ฐํธ์ ํนํ ์ ์ฉํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ํ์ด์ง๋ ์น์ ์ ์ง์ฐ ๋ก๋ฉํ์ฌ ์น์ฌ์ดํธ์ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
import React, { lazy, Suspense } from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
const Contact = lazy(() => import('./pages/Contact'));
function App() {
return (
Loading...