์ปดํฌ๋ํธ๊ฐ ๊ฝค ๋ง์์ง๋ฉด์ (๋ฉ์ธ ์ปดํฌ๋ํธ 6๊ฐ..ใ
ใ
..๋ง๋?..) ์ปดํฌ๋ํธ๋ฅผ ํ๋ฒ์ ๋ค ๊ฐ์ ธ์ค์ง ์๊ณ ๋๋์ด์ importํด์ค๋ฉด ์ข๊ฒ ๋ค ๋ผ๊ณ ์๊ฐ์ ํ๋ค.
๊ทธ๋์ ๋์ ์ธ Import๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ React.Lazy๋ฅผ ์ฌ์ฉํด๋ดค๋ค.
Lazy Loading ์ด๋? ๊ฒ์ผ๋ฅธ ๋ก๋ฉ?
์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๊ธฐ์ ์ค ํ๋๋ก ์น ํ์ด์ง๊ฐ ์ฒ์ ๋ก๋ ๋ ๋ ํ์ํ์ง ์์ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ์ง ์๋ ๋ฐฉ์์ด๋ค! ๋์ ์ฌ์ฉ์๊ฐ ๊ทธ๊ฒ์ ์ค์ ๋ก ํ์ํ ๋ (Ex ํน์ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ถ์๋) ๋ก๋๋ ์ ์๋ค.
์ฅ์ ?
"์ด๊ธฐ ๋ก๋ฉ์ ์ค์ผ ์ ์๋ค." + "์ดํ๋ฆฌ์ผ์ด์
์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ ํฅ์"
์ฆ, ๊ผญ ์ปดํฌ๋ํธ๊ฐ ์๋๋๋ผ๋ ์ด๋ฏธ์ง๋ Lazy Loading์ ํตํด ์ํ๋ ๋งํผ๋ง ๊ฐ์ ธ์ฌ ์ ์๋ค.
;;๐์ฌ๊ธฐ;;
์คํ๋ ค ๊ณผ๊ฑฐ์๋ ํฐ ์ด๋ฏธ์ง, ํฐ ํ์ผ์ ์ ์ฉ๋๋ ๊ธฐ์ ์ด์์ผ๋ ํ์ฌ๋ ์ปดํฌ๋ํธ๊น์ง ๋์ ์ผ๋ก ๋ก๋ฉํ ์ ์๋ค.
React.lazy๋ ์ผ๋จ ๋์ ์ผ๋ก importํ ์ ์๋ ๋ฉ์๋์ด๋ค.
์ด๋ Promise๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค. ํด๋น Promise๊ฐ ํด๊ฒฐ๋๋ฉด ๋ก๋๋ ํ์ผ์ด ๋ฐํ์ด ๋๋ค!
์ด๋ ์ค์ํ๊ฑด Suspense์ด๋ค.
Suspense๋ ์ ๋์์์ ํด๋น Promise๊ฐ pending์ธ์ง fullfill์ธ์ง๋ฅผ ์๊ณ loader๋ฅผ ์ ๊ณตํด์ค๋ค.
์ฆ ReactLazy๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ Suspense๋ก ํด๋น ์์ ์ด ์ ์ด๋ฃจ์ด์ก๋์ง ํ์ธํด์ผํ๋ค.
import React from "react";
import { Suspense } from "react";
import { Loader } from "./Loader";
const Title = React.lazy(() => import("./Title/Title.jsx"));
const ArtistView = React.lazy(() => import("./Artist/View.jsx"));
const PosterView = React.lazy(() => import("./Poster/View.jsx"));
const MapView = React.lazy(() => import("./Map/View.jsx"));
function App() {
//useEffect๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ์์
์ ์คํํ ์ ์๋๋ก ํ๋ Hook
// ๋ง์ฝ []๋ฅผ ๋ฃ์ผ๋ฉด ์ต์ด 1๋ฒ ๋ ๋๋ง๋ ๋ ์คํ
// []๋ฅผ ๋ฃ์ง ์์ผ๋ฉด ๋ฆฌ๋ ๋๋งํ ๋๋ง๋ค ์คํ
// ๋ง์ฝ ํน์ ๊ฐ์ด ์
๋ฐ์ดํธ ๋ ๋ ์คํํ๊ณ ์ถ๋ค๋ฉด []์ ํด๋น ์
๋ฐ์ดํธ ๋ณ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด๋๋ค.
return (
<div className="App">
<Suspense fallback={<Loader />}>
<Title />
</Suspense>
<Suspense fallback={<Loader />}>
<ArtistView />
</Suspense>
<Suspense fallback={<Loader />}>
<PosterView />
</Suspense>
<Suspense fallback={<Loader />}>
<MapView />
</Suspense>
</div>
);
}
์ ์ฒ๋ผ ํ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก ๋ฐ์์๋ค. ์ฌ์ค ์ด๋ ๊ฒ ํ ๊ฑฐ๋ผ๋ฉด Loader์ ์ค์ผ๋ ํค UI๋ฅผ ์ง์ด๋ฃ์ด์ฃผ๋๊ฒ ๋ ์ข์ ๊ฑฐ ๊ฐ๋ค.
์ ๋ ๊ฒ ํ๋ ์ฑ๋ฅ์ ์ด๋ค ์ฐจ์ด๋ฅผ ๋ณด์์๊น?
์ฝ๋ ์คํ๋ฆฌํ ํ๊ธฐ์ (React.lazy๋ก ๋์ ์ผ๋ก ๋ฐ์์ค๊ธฐ์ )
ํด๋น ํ์ผ์ ๋ฐ์์ค๊ธฐ ๊น์ง 14.24ms๊ฐ ๊ฑธ๋ ธ๊ณ
(๊ทธ๋ฅ ํธ๋ํฐ์ผ๋ก ์ฐ์ด๋ฒ๋ฆผ ;;)
๋ค์๊ณผ ๊ฐ์ด Total Blocking Time์ 360ms
First Contentful Paint ์ฆ, ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ด 1.9s๊ฐ ๋์๋ค.
์ฝ๋ ์คํ๋ฆฌํ
์ ํ ํ
ํด๋น ํ์ผ์ ๋ฐ์์ค๊ธฐ ๊น์ง 9.84ms๊ฐ ๊ฑธ๋ ธ๊ณ
Total Blocking Time์ ์ ๋ฐ ์ด์ ๊ฐ์ํ 160ms๊ฐ ๊ฑธ๋ ธ๊ณ
First Contentful Paint ์ฆ, ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ด 1.8s๊ฐ ๊ฑธ๋ ธ๋ค. ๊ทธ๋ ๊ฒ ๊ทน์ ์ด์ง ์์ง๋ง.. ๋ ธ๋๋ถ์ด ์ด๋ก๋ถ๋ก ๋ฐ๋๋๊ฒ ์ ๊ธฐํ๊ณ ๋ณด๋์๋ค.