
Lazy loading์ ํ๋ฉด์์ ํด๋ฝํ ์๊ฐ ๋ชจ๋ฌ์ ๊ด๋ จ๋ ํ์ผ๋ค์ ๋ถ๋ฌ์ค๊ณ ๋ชจ๋ฌ์ ๊ด๋ จ๋ ํ์ผ๋ค์ด ๋ชจ๋ ๋ถ๋ฌ์์ง๋ฉด Javascript๋ฅผ Evaluateํ๊ณ ๋ชจ๋ฌ์ด ๋จ๋๋ก ์ฝ๋๋ฅผ ์คํํ๊ณ ๋ชจ๋ฌ์ด ์คํ๋๋ค.
์ฆ ์ต์ด ๋ก๋ฉ ์์ ์์๋ ํ์ด์ง ๋ก๋ฉ์ด ๋นจ๋ผ์ก์ง๋ง ๋ชจ๋ฌ์ ๋์ธ๋๋ ์คํ๋ ค ์ฑ๋ฅ์ด ๋ ๋๋ ค์ง๊ฒ์ ๋ณผ ์ ์๋ค.
์ปดํฌ๋ํธ preload๋ก ์ฑ๋ฅ ๊ฐ์ ํ๊ธฐ
๋ฒํผ์ ๋๋ฌ ๋ชจ๋ฌ์ ์ด๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ๋ชจ๋ฌ๊ณผ ๊ด๋ จ๋ ์ฝ๋๋ค์ ๋ก๋ํด ๋๋๋ค. ๋ชจ๋ฌ์ ๊ด๋ จ๋ ์ฝ๋๋ ๋ฏธ๋ฆฌ ๋ก๋๊ฐ ๋์์ผ๋ฏ๋ก ํด๋ฆญํ ์๊ฐ์ ๋ฐ๋ก ๋ชจ๋ฌ์ ํ๋ฉด์ ํ์ธ ํ ์ ์๋ค.
๐ ๋ฒํผ์์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ค ๋จ์๋ ๋ชจ๋ฌ์ ๋ก๋ฉ ํ๋ ๋ฐฉ๋ฒ
const handlerMouseEnter = () => { const lazyModalComponent = import('./components/ImageModal'); }
๐ ์ต์ด ํ์ด์ง ๋ก๋์์ ์ค์ ํ์ผ๋ค์ ๋ก๋๊ฐ ์๋ฃ ๋ํ ๋ชจ๋ฌ ๋ก๋ฉ
์ค์ ํ์ผ๋ค์ ์ปดํฌ๋ํธ๊ฐ ๋ชจ๋ ๋ง์ดํธ ๋ ํ์ ๋ชจ๋ฌ์ import ํด์ฃผ๋๋ก ํ๋ค.
useEffect(()=> { const lazyModalComponent = import('./components/ImageModal'); },[])
๐ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ํ๋ฆฌ๋ก๋ ํด์ค์ผ ํ ๊ฒฝ์ฐ
๋งค๋ฒ import๋ฅผ ์จ์ฃผ๊ธฐ๋ ๋ฒ๊ฑฐ๋ก์ธ๋ ํฉํ ๋ฆฌ ํจํด์ผ๋ก ํจ์๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๋๋ก ํ๋ ๋ฐฉ๋ฒ.
function lazyWidthPreload(importFunction){ const Component = React.lazy(importFunction); Component.preload = importFunction; return Component; } const lazyImageModal = lazyWidthPreload(() => import('./components/ImageModal')); useEffect(()=> { lazyImageModal.preload(); },[])
๐ 1. lazyWidthPreload ํจ์
function lazyWidthPreload(importFunction) { const Component = React.lazy(importFunction); Component.preload = importFunction; return Component; }
React์ React.lazy๋ฅผ ํ์ฅํ์ฌ, ์ปดํฌ๋ํธ๋ฅผ ์ง์ฐ ๋ก๋ฉํ๋ฉด์๋ ํ์ํ ๋ ๋ฏธ๋ฆฌ ๋ก๋(preload)ํ ์ ์๋๋ก ๊ธฐ๋ฅ์ ์ถ๊ฐํฉ๋๋ค.
- importFunction: ๋์ ์ํฌํธ๋ฅผ ์ํ ํจ์ (์: () => import('./someComponent')).
- React.lazy(importFunction): ์ฃผ์ด์ง importFunction์ ์ฌ์ฉํด ์ปดํฌ๋ํธ๋ฅผ ์ง์ฐ ๋ก๋ฉํ๋๋ก ์ค์ ํฉ๋๋ค. ์ด๋ก ์ธํด ์ปดํฌ๋ํธ๋ ์ฒ์ ๋ ๋๋ง ์ ๋ก๋๋์ง ์๊ณ , ํ์ํ ๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋๋ฉ๋๋ค.
- Component.preload = importFunction: Component์ preload ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ฌ, ๊ฐ๋ฐ์๊ฐ ์ํ ๋ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ํ ์ ์๋๋ก ํฉ๋๋ค.
- return Component: ์ง์ฐ ๋ก๋ฉ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ฉฐ, preload ๋ฉ์๋๊ฐ ์ถ๊ฐ๋ ์ํ์ ๋๋ค.
๐ 2. lazyImageModal ์์ฑ
const lazyImageModal = lazyWidthPreload(() => import('./components/ImageModal'));
- ์ค๋ช : lazyWidthPreload๋ฅผ ์ฌ์ฉํ์ฌ ./components/ImageModal ์ปดํฌ๋ํธ๋ฅผ ์ง์ฐ ๋ก๋ฉํ๋๋ก ์ค์ ํฉ๋๋ค.
- ๊ฒฐ๊ณผ: lazyImageModal์ React.lazy๋ก ์์ฑ๋ ์ง์ฐ ๋ก๋ฉ ์ปดํฌ๋ํธ์ด๋ฉฐ, ์ถ๊ฐ๋ก preload ๋ฉ์๋๋ฅผ ํตํด ImageModal์ ๋ฏธ๋ฆฌ ๋ก๋ํ ์ ์์ต๋๋ค.
- ์ฅ์ : ์ด๊ธฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ , ImageModal์ด ํ์ํ ๋๋ง ๋ก๋ํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
๐ 3. useEffect๋ก preload ํธ์ถ
useEffect(() => { lazyImageModal.preload(); }, []);
์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ lazyImageModal์ preload ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ImageModal ์ปดํฌ๋ํธ๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๊ณง ImageModal์ ์ด ๊ฐ๋ฅ์ฑ์ด ๋์ ๊ฒฝ์ฐ, ๋ฏธ๋ฆฌ ๋ก๋ํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- useEffect๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ํ ์คํ๋๋ฉฐ, ์์กด์ฑ ๋ฐฐ์ด []๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
- lazyImageModal.preload(): ImageModal ์ปดํฌ๋ํธ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ์ฌ, ์ดํ ๋ ๋๋ง ์ ์ง์ฐ ์์ด ์ฌ์ฉํ ์ ์๋๋ก ์ค๋นํฉ๋๋ค.
์ ๋ฆฌ
- ์ง์ฐ ๋ก๋ฉ: React.lazy๋ฅผ ํตํด ImageModal ์ปดํฌ๋ํธ๋ฅผ ์ด๊ธฐ ๋ก๋์์ ์ ์ธํ์ฌ ํ์ด์ง ๋ก๋ฉ ์๋๋ฅผ ํฅ์์ํต๋๋ค. ์น ์ฑ์ด ๋ก๋๋ ๋ ImageModal์ ๋ก๋๋์ง ์์ (์ด๊ธฐ ๋ก๋ฉ ์๋ ๊ฐ์ ).
- ๋ฏธ๋ฆฌ ๋ก๋: preload ๋ฉ์๋๋ฅผ ํตํด ํ์ํ ์์ ์ ์ปดํฌ๋ํธ๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ํ์ฌ, ์ฌ์ฉ์๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์์ฒญํ ๋ ๋๊ธฐ ์๊ฐ์ ์ค์ ๋๋ค. ์ปดํฌ๋ํธ ๋ง์ดํธ ์ useEffect๊ฐ lazyImageModal.preload()๋ฅผ ํธ์ถํ์ฌ ImageModal์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ก๋.
- ์ฑ๋ฅ ์ต์ ํ: ์ด๊ธฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ , ํ์ํ ์ปดํฌ๋ํธ๋ง ๋ก๋ํ๋ฉฐ, ์ฌ์ฉ์ ์ธํฐ๋์ ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ImageModal์ ์ด ๋, ์ด๋ฏธ ๋ก๋๋ ์ปดํฌ๋ํธ๊ฐ ์ฆ์ ๋ ๋๋ง๋์ด ๋ถ๋๋ฌ์ด ๊ฒฝํ ์ ๊ณต.
Suspense
React.lazy๋ก ๋ก๋๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ค๋ฉด ๋ก ๊ฐ์ธ์ผ ํ๋ฉฐ, ๋ก๋ฉ ์ํ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด fallback UI๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
<Suspense fallback={<div>Loading...</div>}> <lazyImageModal /> </Suspense>
- ๋คํธ์ํฌ ์ํ ๊ณ ๋ ค: preload๋ ๋คํธ์ํฌ ์์ฒญ์ ๋ฐ์์ํค๋ฏ๋ก, ๋คํธ์ํฌ๊ฐ ๋๋ฆฐ ํ๊ฒฝ์์๋ ํ์ด๋ฐ์ ์กฐ์ ํ๊ฑฐ๋ ์กฐ๊ฑด๋ถ๋ก ํธ์ถํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ์์กด์ฑ ๋ฐฐ์ด: useEffect์ []๋ ํ ๋ฒ๋ง ์คํ๋๋๋ก ๋ณด์ฅํ์ง๋ง, ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ preload๋ฅผ ํธ์ถํ๋ ค๋ฉด ์์กด์ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.