React Suspense ๋ฆฌ์์ค ์ถ์ธก์ ํ์ํ์ธ์. ์ฌ์ ๋ฆฌ์์ค ํ์นญ์ ํตํ ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ ์ ์ํ ๊ฐ๋ ฅํ ์์ธก์ ๋ฐ์ดํฐ ๋ก๋ฉ ๊ธฐ๋ฒ์ ๋๋ค.
React Suspense ๋ฆฌ์์ค ์ถ์ธก: ํฅ์๋ UX๋ฅผ ์ํ ์์ธก์ ๋ฐ์ดํฐ ๋ก๋ฉ
์น ๊ฐ๋ฐ์ ๋์์์ด ์งํํ๋ ํ๊ฒฝ์์ ์ฌ์ฉ์ ๊ฒฝํ(UX) ์ต์ ํ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋๋ฆฐ ๋ก๋ฉ ์๊ฐ๊ณผ ์ธ์ง๋ ์ฑ๋ฅ ๋ฌธ์ ๋ ์ฌ์ฉ์ ์ฐธ์ฌ ๋ฐ ๋ง์กฑ๋์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. React Suspense๋ ๋ฆฌ์์ค ์ถ์ธก๊ณผ ๊ฒฐํฉ๋์ด ์์ธก์ ๋ฐ์ดํฐ ๋ก๋ฉ์ ๊ฐ๋ฅํ๊ฒ ํจ์ผ๋ก์จ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ๋ ฅํ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ญ๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ React Suspense ๋ฐ ๋ฆฌ์์ค ์ถ์ธก์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ดํด๋ณด๊ณ , ์ด์ ์ ํ์ํ๋ฉฐ, React ์ ํ๋ฆฌ์ผ์ด์ ์์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
React Suspense ์ดํดํ๊ธฐ
React Suspense๋ React ์ปดํฌ๋ํธ ๋ด์์ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ ์ธ์ ๋ฉ์ปค๋์ฆ์ ๋๋ค. API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ๊ณผ ๊ฐ์ ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๋๊น์ง ์ปดํฌ๋ํธ ๋ ๋๋ง์ "์ผ์ ์ค๋จ"ํ ์ ์๋๋ก ํฉ๋๋ค. ๊ธฐ๋ค๋ฆฌ๋ ๋์ Suspense๋ ๋ก๋ฉ ์คํผ๋ ๋๋ ํ๋ ์ด์คํ๋์ ๊ฐ์ ๋์ฒด UI๋ฅผ ํ์ํ์ฌ ๋ฐ์ดํฐ ๊ฒ์ ์ค์ ์ฌ์ฉ์์๊ฒ ์๊ฐ์ ํผ๋๋ฐฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ์ฌ์ ์ผ๋ก ๋๋ฆฐ ๋คํธ์ํฌ ์์ฒญ์ ์ฒ๋ฆฌํ ๋์๋ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
Suspense์ ํต์ฌ ์๋ฆฌ๋ "suspense" ํ๋กํ ์ฝ์ ์ง์ํ๋ ๋ฐ์ดํฐ ํ์นญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํตํฉํ ์ ์๋ ๋ฅ๋ ฅ์ ์์ต๋๋ค. ์ข ์ข "Suspense ์ง์" ๋ฐ์ดํฐ ํ์นญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋น๋๊ธฐ ์์ ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ฉด React์ ์ ํธ๋ฅผ ๋ณด๋ ๋๋ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ฐ์ ์ธ ์๋ ์บ์ฑ ๋ฉ์ปค๋์ฆ๊ณผ ๊ฒฐํฉ๋ `fetch` API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ์ฌ์ฉ์ ์ง์ ๋ฐ์ดํฐ ํ์นญ ์ ํธ๋ฆฌํฐ์ ๋๋ค.
React Suspense์ ํต์ฌ ๊ฐ๋ :
- Suspense ๊ฒฝ๊ณ: ์ผ์ ์ค๋จ๋ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ถ๋ฅผ ๊ฐ์ธ๋ React ์ปดํฌ๋ํธ์ ๋๋ค. ๋ฐ์ดํฐ๊ฐ ์ค๋น๋ ๋๊น์ง ์ผ์ ์ค๋จ๋ ์ปดํฌ๋ํธ๊ฐ ํ์ํ ๋์ฒด UI๋ฅผ ์ ์ํฉ๋๋ค.
- ๋์ฒด UI: ๋ํ๋ ์ปดํฌ๋ํธ๊ฐ ์ผ์ ์ค๋จ๋๋ ๋์ Suspense ๊ฒฝ๊ณ ๋ด์ ํ์๋๋ UI์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ก๋ฉ ์คํผ๋, ํ๋ ์ด์คํ๋ ์ฝํ ์ธ ๋๋ ๋ฐ์ดํฐ๊ฐ ํ์นญ ์ค์์ ๋ํ๋ด๋ ๊ฐ๋จํ ๋ฉ์์ง์ ๋๋ค.
- Suspense ์ง์ ๋ฐ์ดํฐ ํ์นญ: ๋ฐ์ดํฐ๊ฐ ํ์๋ ์ค๋น๊ฐ ๋๋ฉด ์ ํธ๋ฅผ ๋ณด๋ด React Suspense์ ํตํฉ๋๋ ๋ฐ์ดํฐ ํ์นญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
๋ฆฌ์์ค ์ถ์ธก ์๊ฐ
๋ฆฌ์์ค ์ถ์ธก(์์ธก์ ๋ฐ์ดํฐ ๋ก๋ฉ ๋๋ ์ฌ์ ํ์นญ์ด๋ผ๊ณ ๋ ํจ)์ ๋ฏธ๋์ ๋ฐ์ดํฐ ์๊ตฌ๋ฅผ ์์ธกํ๊ณ ์ฌ์ฉ์๊ฐ ๋ช ์์ ์ผ๋ก ์์ฒญํ๊ธฐ ์ ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ ์ ์ผ๋ก ํ์นญํ๋ ๊ธฐ๋ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ ์์ฉํ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ์ฌ์ฉํ ์ ์๋๋ก ํ์ฌ ์ธ์ง๋ ๋ก๋ฉ ์๊ฐ์ ํฌ๊ฒ ์ค์ด๊ณ UX๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
๋ฆฌ์์ค ์ถ์ธก์ ์ฌ์ฉ์ ํ๋ ํจํด์ ๋ถ์ํ๊ณ ๋ค์์ ํ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฆฌ์์ค๋ฅผ ์์ธกํ์ฌ ์๋ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์ ํ ์นดํ๋ก๊ทธ๋ฅผ ํ์ ์ค์ธ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์ ํ ๋๋ ํ์ฌ ๋ณด๊ณ ์๋ ์ ํ๊ณผ ์ ์ฌํ ์ ํ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ฌ์ ํ์นญํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ ์ ํ์ ํด๋ฆญํ ๋ ์ธ๋ถ ์ ๋ณด๊ฐ ์ด๋ฏธ ๋ก๋๋์ด ์ฆ์ ๋๋ ๊ฑฐ์ ์ฆ์ ํ์๋ฉ๋๋ค.
๋ฆฌ์์ค ์ถ์ธก์ ์ด์ :
- ์ธ์ง๋ ๋ก๋ฉ ์๊ฐ ๊ฐ์: ๋ฐ์ดํฐ๋ฅผ ์ฌ์ ํ์นญํจ์ผ๋ก์จ ๋ฆฌ์์ค ์ถ์ธก์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ: ์ฆ๊ฐ์ ์ด๊ฑฐ๋ ๊ฑฐ์ ์ฆ๊ฐ์ ์ธ ๋ฐ์ดํฐ ๊ฐ์ฉ์ฑ์ ์ฌ์ฉ์ ์ฐธ์ฌ ๋ฐ ๋ง์กฑ๋๋ฅผ ํฅ์์ํต๋๋ค.
- ํฅ์๋ ์ฑ๋ฅ: ์ฌ์ ํ์นญ๋ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํจ์ผ๋ก์จ ๋ฆฌ์์ค ์ถ์ธก์ ํ์ํ ๋คํธ์ํฌ ์์ฒญ ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ๋์ฑ ํฅ์์ํฌ ์ ์์ต๋๋ค.
React Suspense์ ๋ฆฌ์์ค ์ถ์ธก ๊ฒฐํฉ
์ง์ ํ ๊ฐ๋ ฅํจ์ React Suspense์ ๋ฆฌ์์ค ์ถ์ธก์ ๊ฒฐํฉํ๋ ๋ฐ ์์ต๋๋ค. Suspense๋ ๋น๋๊ธฐ ์์ ์ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ๊ณ ๋์ฒด UI๋ฅผ ํ์ํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ ๋ฐ๋ฉด, ๋ฆฌ์์ค ์ถ์ธก์ ์ฌ์ ์ ๋ฐ์ดํฐ๋ฅผ ํ์นญํ์ฌ ์ ์ด์ ์ผ์ ์ค๋จ๋ ๊ฐ๋ฅ์ฑ์ ์ต์ํํฉ๋๋ค. ์ด๋ฌํ ์๋์ง๋ ์ํํ๊ณ ๊ณ ๋๋ก ์ต์ ํ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ญ๋๋ค.
ํตํฉ์ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค:
- ๋ฐ์ดํฐ ์๊ตฌ ์์ธก: ์ฌ์ฉ์ ํ๋์ ๋ถ์ํ๊ณ ๋ค์์ ํ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฆฌ์์ค๋ฅผ ์์ธกํฉ๋๋ค.
- ๋ฆฌ์์ค ์ฌ์ ํ์นญ: Suspense ์ง์ ๋ฐ์ดํฐ ํ์นญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ณ๋ ๋ฆฌ์์ค๋ฅผ ์ฌ์ ํ์นญํฉ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ์ ํ์นญ ์์ ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ฉด React์ ์ ํธ๋ฅผ ๋ณด๋ ๋๋ค.
- Suspense ๊ฒฝ๊ณ์ ์ปดํฌ๋ํธ ๋ํ: ์ฌ์ ํ์นญ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ์ปดํฌ๋ํธ๋ฅผ Suspense ๊ฒฝ๊ณ๋ก ๋ํํ์ฌ ๋ฐ์ดํฐ๊ฐ ์์ง ์ฌ์ฉ ๊ฐ๋ฅํ์ง ์์ ๊ฒฝ์ฐ ๋์ฒด UI๋ฅผ ์ ๊ณตํฉ๋๋ค.
- React๊ฐ ๋ฐ์ดํฐ ๊ฐ์ฉ์ฑ ์ฒ๋ฆฌ: ์ฌ์ฉ์๊ฐ ์ฌ์ ํ์นญ๋ ๋ฐ์ดํฐ์ ์์กดํ๋ ์ปดํฌ๋ํธ์ ์ํธ ์์ฉํ ๋ React๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ์ฌ์ฉ ๊ฐ๋ฅํ์ง ํ์ธํฉ๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ปดํฌ๋ํธ๊ฐ ์ฆ์ ๋ ๋๋ง๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฐ์ดํฐ๊ฐ ํ์นญ๋ ๋๊น์ง ๋์ฒด UI๊ฐ ํ์๋ฉ๋๋ค.
์ค์ฉ์ ์ธ ์์
์ค์ฉ์ ์ธ ์์ ๋ฅผ ํตํด React Suspense ๋ฐ ๋ฆฌ์์ค ์ถ์ธก์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๊ฐ๋ ์ ์ค๋ช ํ๊ธฐ ์ํด ๊ฐ์์ ์ ์ ์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
์์ 1: ์ ํ ์ธ๋ถ ์ ๋ณด ์ฌ์ ํ์นญ
์ฌ์ฉ์๊ฐ ์ ํ ์นดํ๋ก๊ทธ๋ฅผ ํ์ํ ์ ์๋ ์ ํ ๋ชฉ๋ก ํ์ด์ง๋ฅผ ์์ํด ๋ณด์ธ์. UX๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ชฉ๋ก ํ์ด์ง๊ฐ ๋ก๋๋ ๋ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์ ํ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ฌ์ ํ์นญํ ์ ์์ต๋๋ค.
// 'useFetch'๋ผ๋ Suspense ์ง์ ๋ฐ์ดํฐ ํ์นญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค๊ณ ๊ฐ์
import React, { Suspense } from 'react';
// ์ ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ํ์นญํ๊ธฐ ์ํ ๋ฆฌ์์ค ์์ฑ
const fetchProduct = (productId) => {
// ์ค์ ๋ฐ์ดํฐ ํ์นญ ๋ก์ง์ผ๋ก ๋์ฒดํ์ธ์
return useFetch(`/api/products/${productId}`);
};
// ์ธ๊ธฐ ์ ํ ๋ฐ์ดํฐ ์ฌ์ ์บ์ฑ
const popularProduct1 = fetchProduct(123);
const popularProduct2 = fetchProduct(456);
function ProductDetails({ productId }) {
const product = fetchProduct(productId).read(); // .read()๊ฐ ํด๊ฒฐ๋์ง ์์ผ๋ฉด Promise๋ฅผ ๋์ง๋๋ค.
return (
{product.name}
{product.description}
๊ฐ๊ฒฉ: {product.price}
);
}
function ProductListing() {
return (
์ ํ ๋ชฉ๋ก
}>
์ ํ 2 ๋ก๋ฉ ์ค...