์ฒซ React ํฌ์คํ
๐ฅ๐ฅ๐ฅ
React 18v์์ ๊ฐ์ฅ ๋์ ๋๋ ๋ณ๊ฒฝ์ ์ ํ์ ์๊ฐ์ Suspense์ด๋ค.
์ฌ์ค Suspense๋ 16v๋ถํฐ ์์์ง๋ง 18v์์ ์ ๋๋ก ๊ฐ์ถฐ์ง ๊ธฐ๋ฅ์ด๋ผ๊ณ ํ๋ค.
์ด๋ฅผ ์๊ฒ ๋ ๊ณ๊ธฐ๋ ์น๊ตฌ์ ์๋ฃ ๊ณต์ ์ด๋ค. ๋๋ถ์ ํ์ต์ ํ ์ ์์ด ๊ณ ๋ง๋ค.
์ด๋ฐ ์ปค๋ฎค๋ํฐ๊ฐ ์ฐธ ํ์ํ๊ฑฐ๊ฐ๋ค.. ๋จผ์ ๊ณต์ ๋ฐ์ ๋ธ๋ก๊ทธ์ ๊ธ์ ์๋์ ๋งํฌ์ ์ฒจ๋ถํ๊ฒ ๋ค.
๋ ์ ๋ ๋ธ๋ก๊ทธ ๋งํฌ
๋ณธ๋ก ๋ถํฐ ๋ค์ด๊ฐ Suspense์ ๋ํด ์์๋ณด์
๋จผ์ Suspense๋ ๊ธฐ์กด์ isLoading์ ์ด์ฉํ loading์ฒ๋ฆฌ๋ฅผ ๋์ฑ ๊ฐ์ํํด์ค๋ค. ์ฆ, ์ปดํฌ๋ํธ ์ธ๋ถ์์ ํด๋น loading์ ๊ด๋ฆฌํ ์ ์๋ค. ์ด๋ฅผ ์ฝ๋๋ก ์ดํด๋ณด์.
//์์ ์ ์ฝ๋
const [Loading,setLoading] = useState(true)
const getApi = asnyc ()=>{
const api = await axios(`~~~~~~`)
setLoading(false)
}
useEffect(()=>{
getApi()
},[])
return <div>
{Loading ?<h3>๋ก๋ฉ์ค... <h3/> : <Home/> }
<div/>
๋ณดํต ์ด๋ ๊ฒ loading ์ ์ํ๋ฅผ ํ์ ํด์ loading ์ํ๋ฅผ ํ์ ํด์ Loading ์ฐฝ์ ๋ง๋ค์ด ์ค๋ค. ๊ทธ๋ฐ๋ฐ ์ด์ ์ด๋ ๊ฒ ํ์ง ์์๋ ๋๋ค.
์ปดํฌ๋ํธ ์ธ๋ถ์์ Suspense๋ฅผ ์ด์ฉํด์ loading์ ํ์ ํ ์ ์๋ค.
Suspense๋ ์์ง ๋ ๋๋ง์ด ์ค๋น๋์ง ์์ ์ปดํฌ๋ํธ๊ฐ ์์๋ ์ปดํฌ๋ํธ ๋ก๋ ์ํ์ ๋ฐ๋ผ fallback ์ปดํฌ๋ํธ๋ฅผ ์ฐ์ ์ ์ผ๋ก ๋ ๋๋งํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
๊ทธ๋ผ ๋ ๋๋ง์ด ์ค๋น๋์ง ์์ ๊ฒฝ์ฐ๋ ์ด๋ค ๊ฒฝ์ฐ๊ฐ ์์๊น?
์ฌ์ค Suspense๋ Lazy Loading์ ๋ณด์กฐํ๋ ์ญํ ์ ํด์ฃผ์๋ค.
Lazy Loading: ํ์ํ ์์์ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ค์ง ์๊ณ ํ์ํ ๋ ๊ฐ์ ธ์ค๋ ์ ๋ต
์ฐ๋ฆฌ๊ฐ axios๋ fetch๋ฅผ ์ฌ์ฉํด ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ๋ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ ๋ํ Lazy Loading์ด๋ค.
์ฆ ํ์ํ ๋งํผ๋ง ๊ฐ์ ธ์ฌ ์ ์๊ฒํ๋ค. ๋ญ๋ฅผ ํ์ํ ๋งํผ๋ง ๊ฐ์ ธ์ฌ๊น?
์ฐ๋ฆฌ๋ CSR์ ํ์ตํ๋ฉฐ CSR์ ํน์ง์ด์ ๋จ์ ์ ๋ฐฐ์ธ ์ ์์๋ค.
์ด๊ธฐ๋ก๋ฉ์๋
CSR๋ฐฉ์์ ์ด๊ธฐ์ ํ๋ฒ์ ๋ชจ๋ jsํ์ผ์ ๋จผ์ ๋ค์ด๋ฐ์์ค๊ธฐ ๋๋ฌธ์ ํด๋น jsํ์ผ์ ๊ฐ์ ธ์ค๋๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๋ค. ๊ทธ๋ผ ์ด๋ฐ ๋จ์ ์ ๊ทน๋ณตํ๋ ๋ฐฉ๋ฒ์ React ๋ด๋ถ์์ ์ ๊ณตํ๋ค.
React.lazy ๋ฉ์๋์ด๋ค.
์ฝ๋ ์คํ๋ฆฌํ ์ด๋ ์ฝ๊ฒ ๋งํด ํ์ผ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค. Lazy Loading์ ํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ ์ฝ๋ ์คํ๋ฆฌํ ์ด ๋๋ค.
์ฆ, ๋ฒ๋ค๋ฌ๋ ๋ง์ jsํ์ผ์ ํ๋๋ก ํฉ์ณ์ ์๋ฒ๋ก๋ถํฐ ๋ฐ์์ค๊ฒ ๋๋ค. ๊ทผ๋ฐ ์ฝ๋ ์คํ๋ฆฌํ ์ ํ๊ฒ ๋๋ฉด ์ํ๋ ํ์ผ๋ง ๋ฐ์์ ์ด๊ธฐ ๋ก๋ฉ์๋๋ฅผ ๊ฐ์ ํ ์ ์๋ค.
์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ React์ ๊ธฐ์ ์ค ํ๋๊ฐ React.lazy์ด๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค.
const Weater = React.lazy(() => import(`./Weather`));
const Two = React.lazy(() => import(`./Two`));
์ด๋ฐ์์ผ๋ก importํ๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ ํด๋น ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉ๋๋ ๋ถ๋ถ์์๋ง ํ์ผ์ ๊ฐ์ ธ์ค๊ฒ ๋๋ค. ์ฆ ํ์ผ์ด ๋ถ๋ฆฌ๋์ด ์๋ฒ๋ก๋ถํฐ ์ ๋ฌ๋๋ค.
์ง์ ์ฝ๋๋ก ์คํ์ ํด ๋ณด์๋ค.
์ ์ฌ์ง์ React.lazy๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ทธ๋ฅ ์ ์ฒด jsํ์ผ์ ์ด๊ธฐ์ ๋ฐ์์จ ์ฌ๋ก
์ ์ฌ์ง์ React.lazy๋ฅผ ์ฌ์ฉํด ํ์ํ jsํ์ผ์ ์ด๊ธฐ์ ๋ฐ์์จ ์ฌ๋ก
๊ฐ ํ์ผ์ ํฌ๊ธฐ์ ์๊ฐ์ ๊ณ ๋ คํด๋ดค์ ๋ Lazy๋ฅผ ์ฌ์ฉํด ์ฝ๋ ์คํ๋ฆฌํ ์ ํ ์ฌ๋ก๋ ๊ทธ ์๊ฐ๊ณผ ์์ด ํฌ๊ฒ ์ค์ด์์์ ์ ์ ์๋ค. ๋ง์ฝ ๋๊ท๋ชจ์ ํ๋ก์ ํธ์ผ ์๋ก ํด๋น ํจ๊ณผ๊ฐ ๋์ฑ ๋๋ ทํ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.
lazy๋ ์ฝ๋์คํ๋ฆฟํ ์ด ๊ฐ๋ฅํ๊ฒํจ, ๊ฒฐ๊ตญ ๋์ ์ผ๋ก ํ์ํ ํ์ผ๋ง ๋ถ๋ฌ์ ๋ฒ๋ค์ ์ฌ์ด์ฆ๋ฅผ ์ค์ฌ์ค๋ค. ๊ทธ๋ผ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ์ค์ด๋ค๊ฒ ๋๋ค ์? ์ฒ์ ๋ถ๋ฌ์ฌ๋ ํ์ํ ๋งํผ๋ง ๋ถ๋ฌ์ค๋๊ฑฐ๋๊น !
๊ทธ๋ฐ๋ฐ ์ Suspense์ Lazy๊ฐ ํจ๊ป ์ฌ์ฉ์ด ๋ ๊น?
์, ๋จผ์ React.lazy๋ฅผ ์ฌ์ฉํด ์ฝ๋ ์คํ๋ฆฌํ
์ ํตํด ํ์ผ์ ๋ถ๋ฆฌํ์ฌ ํ์ํ ๋ถ๋ถ์ jsํ์ผ์ ๋ฐ์์ค๊ฒ ๋๋ค๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ณ ์ด๊ธฐ ํ์ผ์ ๋ฐ๊ฒ๋๋ค.
(๋ง์น SSR ์ฒ๋ผ...)
๊ทธ๋ผ ํด๋น ์ด๊ธฐ ํ์ผ์ ๋ฐ๋ ๋์ ์ฌ์ฉ์๋ ๋น ํ๋ฉด์ ๋ณด๊ฒ๋๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด Suspense๋ฅผ ์ฌ์ฉํด์๋ค.
Suspense๋ ์ ํ์ผ์ ๋ฐ์์๋์ง๋ฅผ ๊ฐ์งํ๊ณ ์์ง ๋ฐ์์ค์ง ์์๋ค๋ฉด
fallback์ ๋ด๊ธด ์ปดํฌ๋ํธ๋ฅผ ์ฐ์ ์ ์ผ๋ก ๋ ๋๋งํด์ค๋ค. ์ด๋ Loading ์ปดํฌ๋ํธ๊ฐ ๋ ์๋์๊ณ ์ค์ผ๋ ํค ์ฝ๋๊ฐ ๋ค์ด๊ฐ ์ ์๋ค.
์ฆ ์์ ๊ฐ์ ์ํฉ์ด ๊ฑธ๋ฆฌ๋ฉด fallback์ ๋ด๊ธด ์ปดํฌ๋ํธ๋ฅผ ์ฐ์ ๋ ๋๋งํ๊ฒ ๋๋ค.
๊ทธ๋ผ ๊ฐ ์ปดํฌ๋ํธ์ ํ์ํ ์ด๊ธฐ jsํ์ผ์ ์ผ๋จ ๋ฐ์์ค๊ฒ ๋๋ฉด ๊ทธ ํ๋ก๋ ์ด๋ป๊ฒ ๋ ๊น?
suspense์ ์ํ loading์ ๋ณผ ์ ์๋ค ์? ์ด๋ฏธ ๋ฐ์์์ผ๋๊น!
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ๋น๋๊ธฐํจ์๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ suspense๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ํด๋น ์ปดํฌ๋ํธ์ ๋น๋๊ธฐํจ์๊ฐ ์ฒ๋ฆฌ๋๊ธฐ ์ ๊น์ง suspense์ fallback์ ๋ด๊ธด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉ์๋ ๋ณผ ์ ์๋ค.
โ
Suspense๋ React 18์์ ๋ฌด์์ด๋ ๊ธฐ๋ค๋ฆด ์ ์๋ ๊ธฐ๋ฅ์ผ๋ก ํ์ฅ๋์๋ค. Suspense๋ ์ด์ ์ด๋ฏธ์ง, ์คํฌ๋ฆฝํธ, ๊ทธ ๋ฐ์ ๋น๋๊ธฐ ์์ ์ ๊ธฐ๋ค๋ฆฌ๋๋ฐ์ ๋ชจ๋ ์ฌ์ฉ ๋ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค.
์ฆ ์ด๋ ๊ฒ ๊ฒฐ๋ก ์ง๊ณ ์ถ๋ค. Suspense๋ ์ปดํฌ๋ํธ ๋ด๋ถ๊ฐ ์๋ ์ธ๋ถ์์ ๋ก๋ฉ์ ํธ๋ค๋งํด์ค ์ ์๋ ์ฅ์น. ๋ด๋ถ์์ ํ๋ํ๋ ๋ก๋ฉ์ ์ฒ๋ฆฌํด์ฃผ๋ ๊ฒ์ด ์๋ ์ธ๋ถ์์ ๋๋ ์ ์ฒด์ ์ธ ๋ก๋ฉ์ด ๋๋๋ฉด ํ๋ฒ์ ๋ ๋๋งํ๋ ๊ฒ๋ฑ์ด ๊ฐ๋ฅํด์ง๋ค.
์ฆ. ์ปดํฌ๋ํธ ์ธ๋ถ์์ ์ ์ฒด์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ Loading Handler์ด๋ค.
์ฌ์ค ๊ธ์ ๋ค ์ฝ์ ๋ถ๋ค์ ์์๊ฒ ์ง๋ง ๋ด์ฉ์ด ๋น๋ ๋ถ๋ถ์ด ๋ง๋ค. ๊ทธ ์ด์ ๋ ํ์๊ฐ ์ดํดํ ๋ถ๋ถ๋ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. Suspense๊ฐ Lazy Loading์ ์ํ ์ฝ๋ ์คํ๋ฆฌํ ์ ๋ณด์กฐ์ญํ ์ธ์ 18v๋ถํฐ๋ ๋น๋๊ธฐํจ์์ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ loading ํ์ด์ง ์ฆ fallback props์ ์ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์๋ค๊ณ ๋ฐฐ์ ๋๋ฐ ์ด๋ฅผ ๊ตฌํํ๋๊ฒ ์ฝ์ง ์๋ค.
์ง๊ธ๊น์ง ํ์๊ฐ ์๊ฐํ๊ธฐ๋ก๋ ์ผ๋จ ๋น๋๊ธฐํจ์๋ฅผ ๋๊ธฐํ๋ ค๋ฉด Promise๋ฅผ ํด๋น ์ปดํฌ๋ํธ์ returnํ๊ณ Suspense๋ก ๊ฐ์ธ์ฃผ๋๊ฒ
๊ทธ๋ฆฌ๊ณ ์ง๊น์ง ์ดํดํ๊ฒ์ Lazy Loading ์ axios, ์ฝ๋์คํ๋ฆฟ ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ์ ์๋ค. ์ฆ ํ์ํ ๋ถ๋ถ๋ง ์ฐ๊ฒ ๋ค๋ ์๋ฏธ.
๊ทธ๋ผ React.lazy๋ฅผ ํตํด ์ํ๋ ํ์ผ๋ง ์ด๊ธฐ์ ๋๋ ์ ๋ฐ์์ฌ ์ ์๊ณ ๊ทธ ๋ฐ์์ค๋ ๋์ ๊ณต๋ฐฑ ์๊ฐ์ Suspense๋ฅผ ์ฌ์ฉํด ๊ณต๋ฐฑ ์๊ฐ๋์ ๋ก๋ฉ์ปดํฌ๋ํธ๋ ์ค์ผ๋ ํค ๋์์ธ์ ์ง์ด ๋ฃ์ ์ ์๋ค๋ ๊ฒ ๊น์ง ์ดํดํ๋ค.
๋ค์ ํฌ์คํ ์ Suspense๋ก ๋น๋๊ธฐํจ์์ฒ๋ฆฌํ๊ธฐ Suspense for Data Fetching
์ ๋ํด ์์๋ณด์