๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

react

React / lazy, Suspense

 

React์—์„œ๋Š” SPA(Single Page Application)์œผ๋กœ ๊ตฌํ˜„๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๋„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์žˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ Œ๋”๋ง ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•œ๋‹ค. 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด lazy์™€ Suspense๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

 

lazy

์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ”๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ  ์‹ค์ œ๋กœ ๊ทธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

lazy์˜ ์ธ์ž๋กœ import ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

* lazy๋Š” ๋ณดํ†ต ๋ชจ๋“ˆ์˜ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ์„ ์–ธ๋˜์–ด์•ผ ๋ Œ๋”๋ง ์‹œ ๋ชจ๋“  ์ƒํƒœ๊ฐ€ ์žฌ์„ค์ •๋˜๋Š” ํ˜„์ƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค

// ๊ธฐ์กด import ๋ฐฉ์‹
import Main from "./Main.jsx"

// lazy ์‚ฌ์šฉ ์‹œ
const Main = lazy(()=>import("./Main.jsx"));

 

Suspsense

lazy๋ฅผ ํ†ตํ•ด import๋ฅผ ํ•˜๋Š” ๋™์•ˆ ํ™”๋ฉด์— ๋Œ€์ฒด UI๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ, ๋Œ€์ฒด๋˜๋Š” ์ž„์‹œ ํ™”๋ฉด์„ fallback์˜ ๊ฐ’์œผ๋กœ ๋„ฃ์–ด์ฃผ๋ฉด fallback์ด ๋Œ€์‹  ๋ Œ๋”๋ง๋œ๋‹ค.

๋กœ๋”ฉ์ด ๋๋‚˜๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ (importํ•˜๋ ค๋Š” lazy์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ๋„ฃ์–ด์ค˜์•ผํ•œ๋‹ค.)๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š” ํŒจํ„ด์ด๋‹ค. 

<Suspense fallback={"๋กœ๋”ฉ์ค‘"}><Main /></Suspense>

 

 

 

 


 

 

 

์˜ˆ์‹œ

 

์ด์ „์— ์‹ค์Šตํ–ˆ๋˜ ๋™๋ฌผ์ข‹์•„ ํ”„๋กœ์ ํŠธ๋ฅผ lazy, suspense๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค... https://hydeveloper.tistory.com/195 

 

๋จผ์ € ๊ธฐ์กด Import๋ฌธ์„ lazy๋ฅผ ์‚ฌ์šฉํ•ด ์ˆ˜์ •ํ–ˆ๋‹ค.

/* // ์ด์ „ ๋ฐฉ์‹
import Main from './page/Main';
import Detail from './page/Detail';
import Search from './page/Search';
*/

// lazy ์‚ฌ์šฉ
const Main = lazy(() => import('./page/Main'));
const Detail = lazy(() => import('./page/Detail'));
const Search = lazy(() => import('./page/Search'));

 

 

๊ทธ ๋‹ค์Œ, Routes๋กœ ๊ตฌ์„ฑ๋˜๊ณ  ์žˆ๋Š” ์ด์ „ ๋ฐฉ์‹์—์„œ Suspense๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•œ๋‹ค.

 

function App() {
  return (
    // ์ƒ๋žต.... 
    // ์ด์ „ ๋ฐฉ์‹
      <Routes>
        <Route path="/" element={<Main />}></Route>
        <Route path="/detail/:id" element={<Detail />}></Route>
        <Route path="/search" element={<Search />}></Route>
      </Routes>
  )
}

 

๋˜๊ฒŒ ๊ฐ„๋‹จํ•œ๋ฐ, Suspense ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑ ํ›„ Routes๋ฅผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

  <Suspense fallback={<h1>Loading...</h1>}>
    <Routes>
      <Route path="/" element={<Main />}></Route>
      <Route path="/detail/:id" element={<Detail />}></Route>
      <Route path="/search" element={<Search />}></Route>
    </Routes>
  </Suspense>

 

 

์ด์ œ ํ™•์ธ์„ ํ•ด๋ณด๋ ค๊ณ  ํ•˜๋Š”๋ฐ

๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋„คํŠธ์›Œํฌ ์ œํ•œ์œผ๋กœ ์„ค์ •ํ•ด ์ž„์˜์˜ ์ƒํ™ฉ์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค..!!

 

๋„คํŠธ์›Œํฌ ํƒญ์— ๋“ค์–ด๊ฐ€์„œ ๋„คํŠธ์›Œํฌ ์ œํ•œ์„ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.... ์˜์–ด๋กœ๋Š” ์ œํ•œ์—†์Œ์ด No throttling์ด๋ผ๊ณ  ๋œฐ ๊ฒƒ

 

 

๋‚˜๋Š” ์ผ๋‹จ ๋กœ๋”ฉ์ฐฝ์„ ๋ณด๊ธฐ์œ„ํ•ด ๋„คํŠธ์›Œํฌ ์ œํ•œ์„ ๋А๋ฆฐ 4G๋กœ ์„ค์ •ํ–ˆ๋‹ค. (3G๋Š” ๋„ˆ๋ฌด ๋А๋ฆผ... ์˜›๋‚ ์—” ๊ทธ ๋„คํŠธ์›Œํฌ๋กœ ์–ด๋–ป๊ฒŒ ์‚ด์•˜์—ˆ์ง€..)

๊ทธ๋ฆฌ๊ณ  ์บ์‹œ๊ฐ€ ๋‚จ์•„์žˆ์„ ์ง€ ๋ชจ๋ฅด๋‹ˆ, ์ƒˆ๋กœ๊ณ ์นจ ์•„์ด์ฝ˜์— ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ํด๋ฆญ์„ ํ•˜๋ฉด ์บ์‹œ ๋น„์šฐ๊ธฐ ๋ฐ ๊ฐ•๋ ฅ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•  ์ˆ˜ ์žˆ์–ด์„œ ํ™•์ธํ•ด๋ดค๋‹ค.

 

 

 

๊ทธ๋ฆฌ๊ณ  ์†Œ์Šค ํƒญ์„ ๊ฐ€์„œ ์‹ค์ œ๋กœ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ถˆ๋Ÿฌ์™€์กŒ๋Š”์ง€ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์™ผ์ชฝ์ด ๊ธฐ์กด ๋ฐฉ์‹, ์˜ค๋ฅธ์ชฝ์ด lazy + Suspense๋กœ ์ˆ˜์ • ํ›„

 

lazy์™€ Suspense ๋„์ž… ํ›„ ์‹ค์ œ๋กœ ์ง€๊ธˆ ํ‘œ์‹œ๋˜๊ณ  ์žˆ๋Š” Main.jsx๋งŒ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒ์„ธ ํŽ˜์ด์ง€๋ฅผ ๋ˆ„๋ฅด๋ฉด ๊ทธ๋•Œ Detail.jsx๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ , ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์•ผ Search.jsx๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.