๐ฃ๏ธ 'Suspense'๋ฅผ ์จ๋ณด์ ์ ์๋์? ์๋ค๋ฉด ์ธ์ , ์ ์ฐ์๋์? ์ ์ฐ๋ฉด ์ด๋ค ์ ์ด ๋ถํธํ๋์?
์ฐ๊ธด ์ฐ๋๋ฐ..๋ก๋ฉ ์ค์ ๋์ ๋ณด์ฌ์ค UI๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด์ ์๋๊ฐ?
๋ฆฌ์กํธ์ ๊ณต์๋ฌธ์์ ์ํ๋ฉด <Suspense>๋ children์ด ๋ก๋ฉ ์ ๊น์ง ๋ณด์ฌ์ค fallback ์์๋ฅผ ์ ๊ณตํ๋ ์ปดํฌ๋ํธ๋ผ๊ณ ํ๋ค.
๋ฆฌ์กํธ์ <Suspense>์ ๋ํด์ ๋ ์์ธํ ๋ค๋ฃจ๊ธฐ ์ ์,
Suspend๋ผ๋ ๋จ์ด์ ๋ป์ ํ๋ฒ ์ดํด๋ณด๊ณ ๊ฐ๋ฉด <Suspense>๋ฅผ ์ ์ฐ๊ณ , ์ธ์ ์ฐ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ญํ ์ด ๋ฌด์์ธ์ง ์ดํดํ๊ธฐ๊ฐ ์ฝ๋ค.
Suspend๋ ์ผ์์ ์ผ๋ก ์ด๋ค ๋์์ด ๋ฐ์ํ๊ฑฐ๋ ์ผ์ด๋๋ ๊ฒ์ ๋ฉ์ถ๋ ๊ฒ (temporarily prevent from continuing or being in force or effect)์ด๋ค.
๊ทธ๋ผ ๋ฆฌ์กํธ์ <Suspense>๋ ์ด๋ค ๋์์ ์ธ์ ์ ์ ๋ฉ์ถฐ์ฃผ๋ ๊ฑธ๊น?
Suspense์ props
Suspense๊ฐ ์ด๋ค ๋์์ ์ธ์ ์ ์ ๋ฉ์ถ๋์ง ์๊ธฐ ์ํด ๋จผ์ Suspense์ props๋ฅผ ์ดํด๋ณด์.
๋ค์์ ์ผ๋ฐ์ ์ธ Suspense์ ํํ๋ค.
<Suspense fallback={<Loading />}>
<SomeComponent />
</Suspense>
- children ( <SomeComponent />) : ์ค์ ๋ก ๋ ๋๋งํ๊ณ ์ํ๋ UI. children์ด ๋ ๋๋ง ๋์ค suspend๋์ด ์๋ค๋ฉด, Suspense boundary๋ fallback์ ๋์ ๋ ๋๋งํ๋ค.
- fallback (fallback={<Loading />}) : ์ค์ UI๊ฐ ๋ก๋ฉ์ ์๋ฃํ์ง ์์์ ๊ฒฝ์ฐ ๋์ ํ UI. React node๋ผ๋ฉด ์ด๋ ํ ๊ฐ๋ ๋ค์ด๊ฐ ์ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ ์ค์ผ๋ ํค์ด๋ ์คํผ๋์ฒ๋ผ ๊ฒฝ๋ placeholder UI๊ฐ ๋ค์ด๊ฐ๋ค. children์ด suspend ๋๋ฉด fallback์ผ๋ก ์๋์ ์ผ๋ก ๋์ฒดํ๊ณ , ๋ฐ์ดํฐ๊ฐ ์ค๋น๋์๋ค๋ฉด children์ผ๋ก ์๋์ ์ผ๋ก ๋ฐ๊ฟ์น๊ธฐํ๋ค. fallback์ด ๋ ๋๋ง ๋์ค์ suspend ๋๋ค๋ฉด ๊ฐ์ฅ ๊ฐ๊น์ด ๋ถ๋ชจ Suspense boundary๋ฅผ ์๋ํ๋ค.
โ ๏ธ ์ฃผ์ํ ์
- ๋ฆฌ์กํธ๋ ์ฒซ ๋ง์ดํธ ์ด์ ์ suspend๋ ๋ ๋์ state์ ๋ณด์กดํ์ง ์๋๋ค. ์ฆ, ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋๋ฉด, ๋ฆฌ์กํธ๋ suspend ๋ ํธ๋ฆฌ๋ฅผ ์ฒ์๋ถํฐ ๋ ๋๋ง ํ๋ ๊ฒ์ ์ฌ์๋ํ๋ค.
- startTransition๋ useDeferredValue๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ์ผ์ผํจ ๊ฒ ์๋๋ผ๋ฉด, Suspense๊ฐ tree์ ๋ด์ฉ์ ๋ณด์ฌ์ฃผ๋ ๋์ค์ ๋ suspend๊ฐ ๋๋ค๋ฉด fallback์ด ๋ค์ ๋ณด์ฌ์ง๊ฒ ๋๋ค.
- ๋ค์ suspend๋์ด์ ์ด๋ฏธ ๋ ธ์ถ๋ ์ฝํ ์ธ ๋ฅผ ์จ๊ฒจ์ผ ํ๋ค๋ฉด, ๋ฆฌ์กํธ๋ content tree์ layout Effects๋ฅผ ํด๋ฆฐ ์ ํ๋ค. ๋ค์ ์ฝํ ์ธ ๋ฅผ ๋ณด์ฌ์ค ์ค๋น๊ฐ ๋๋ค๋ฉด ๋ฆฌ์กํธ๋ ๋ค์ layout Effects๋ฅผ ์คํํ๋ค. ๋ฐ๋ผ์ ์ฝํ ์ธ ๊ฐ ์จ๊ฒจ์ง ๋์ค์ Effects๊ฐ DOM ๋ ์ด์์์ ๊ณ์ฐํ์ง ์๋๋ค.
- ๋ฆฌ์กํธ๋ Suspense์ ํจ๊ป Streaming Server Rendering์ Selective Hydration๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํด ์ต์ ํ๋ฅผ ํ๋ค. (an architectural overview์ a technical talk์์ ๋ ์์ธํ ๋ด์ฉ์ ๋ค๋ฃฌ๋ค)
Suspense ํ์ฉ
- ์ฝํ ์ธ ๊ฐ ๋ก๋ฉ๋๊ณ ์๋ ๋์ ๋ณด์ฌ์ค fallback์ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๋
- ํ๊บผ๋ฒ์ ์ฝํ ์ธ ๋ฅผ ๋ ธ์ถํ๊ณ ์ถ์ ๋
- ๋ก๋ฉ๋๊ณ ์๋ ๋์ ์ค์ฒฉ(nested)๋ ์ฝํ ์ธ ๋ฅผ ๋ ธ์ถํ๊ณ ์ถ์ ๋
- ์ (fresh) ์ฝํ ์ธ ๋ฅผ ๋ก๋ฉํ๊ณ ์๋ ๋์ ์ง์ (stale) ์ฝํ ์ธ ๋ฅผ ๋ณด์ฌ์ค ๋
- ์ด๋ฏธ ๋ ธ์ถ๋ ์ฝํ ์ธ ๋ฅผ ์จ๊ธฐ๋ ๊ฑธ ๋ฐฉ์งํ๊ณ ์ถ์ ๋
- Transition์ด ์ผ์ด๋๊ณ ์๋ค๋ ๊ฑธ ์๋ฆฌ๊ณ ์ถ์ ๋
- navigation์ด ๋ฐ์ํ ๋ Suspense boundary๋ค์ ๋ฆฌ์ ํ๊ณ ์ถ์ ๋
- ์๋ฒ ์๋ฌ ๋ฐ์ ์์ ํด๋ผ์ด์ธํธ์๋ง ํด๋นํ๋ ์ฝํ ์ธ ๋ฅผ ๋ณด์ฌ์ค fallback์ ์ ๊ณตํ๊ณ ์ถ์ ๋
๐ References
๐ค TMI, ๋๋ ์
๊ฐ๋จํ ์ค ์์๋ suspense.. ๊ณต์๋ฌธ์ ํ๊ธ ๋ฒ์ ์ ์์ง์ด๊ณ , suspense ๊ณต์ ์ง์๋ ์์ง์ธ ๋ฏ
๊ธ์ ๊ธธ์ด๊ฐ ๋๋ฌด ๊ธธ์ด์ง๊ฒ ๋์ด suspense์ ํ์ฉ์ ๊ดํด์๋ ๋ค์ ๊ธ์์ ๋ค๋ฃจ๊ธฐ๋ก ํ๋ค.