React์ experimental_SuspenseList๋ฅผ ์ดํด๋ณด๊ณ , ๋ค์ํ ๋ก๋ฉ ์ ๋ต๊ณผ suspense ํจํด์ ์ฌ์ฉํ์ฌ ํจ์จ์ ์ด๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ๋ก๋ฉ ์ํ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์์๋ด ๋๋ค.
React์ experimental_SuspenseList: Suspense ๋ก๋ฉ ํจํด ๋ง์คํฐํ๊ธฐ
React 16.6 ๋ฒ์ ์์๋ ์ปดํฌ๋ํธ์์ ๋น๋๊ธฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ธ Suspense๊ฐ ๋์
๋์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ก๋ฉ ์ํ๋ฅผ ํ์ํ๋ ์ ์ธ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธฐ๋ฐ ์์ ๊ตฌ์ถ๋ experimental_SuspenseList๋ ์ฝํ
์ธ ๊ฐ ํ์๋๋ ์์๋ฅผ ๋์ฑ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ํนํ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋๋๋ ๋ฐ์ดํฐ ๋ชฉ๋ก์ด๋ ๊ทธ๋ฆฌ๋๋ฅผ ๋ค๋ฃฐ ๋ ์ ์ฉํฉ๋๋ค. ์ด ๋ธ๋ก๊ทธ ํฌ์คํธ์์๋ experimental_SuspenseList๋ฅผ ๊น์ด ํ๊ณ ๋ค์ด ๋ก๋ฉ ์ ๋ต๊ณผ ์ด๋ฅผ ํ์ฉํ์ฌ ์ฐ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ํ๊ตฌํฉ๋๋ค. ์์ง ์คํ์ ์ธ ๊ธฐ๋ฅ์ด์ง๋ง, ๊ทธ ์๋ฆฌ๋ฅผ ์ดํดํ๋ฉด ์์ ์ ์ธ API๋ก ์น๊ฒฉ๋ ๋ ํ๋ฐ ์์ ๋๊ฐ ์ ์์ ๊ฒ์
๋๋ค.
Suspense์ ๊ทธ ์ญํ ์ดํดํ๊ธฐ
experimental_SuspenseList๋ฅผ ์ดํด๋ณด๊ธฐ ์ ์, Suspense์ ๋ํด ๋ค์ ํ๋ฒ ์ง์ด๋ณด๊ฒ ์ต๋๋ค. Suspense๋ ์ปดํฌ๋ํธ๊ฐ ํ๋ก๋ฏธ์ค(์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ฐํ๋๋ ํ๋ก๋ฏธ์ค)๊ฐ ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ ๋๋ง์ "์ผ์ ์ค๋จ"ํ ์ ์๊ฒ ํฉ๋๋ค. ์ผ์ ์ค๋จ๋๋ ์ปดํฌ๋ํธ๋ฅผ <Suspense> ์ปดํฌ๋ํธ๋ก ๊ฐ์ธ๊ณ , ๋ก๋ฉ ์ธ๋์ผ์ดํฐ๋ฅผ ๋ ๋๋งํ๋ fallback prop์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋ก๋ฉ ์ํ ์ฒ๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ์ฝ๋๋ฅผ ๋ ์ ์ธ์ ์ผ๋ก ๋ง๋ค์ด์ค๋๋ค.
๊ธฐ๋ณธ Suspense ์์ :
์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ปดํฌ๋ํธ๋ฅผ ์๊ฐํด ๋ด ์๋ค:
// ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ (๋จ์ํ)
const fetchData = (userId) => {
return new Promise(resolve => {
setTimeout(() => {
resolve({ id: userId, name: `User ${userId}`, country: 'Exampleland' });
}, 1000);
});
};
const UserProfile = ({ userId }) => {
const userData = use(fetchData(userId)); // use()๋ React ๋์์ฑ ๋ชจ๋์ ์ผ๋ถ์
๋๋ค
return (
<div>
<h2>{userData.name}</h2>
<p>Country: {userData.country}</p>
</div>
);
};
const App = () => {
return (
<Suspense fallback={<p>์ฌ์ฉ์ ํ๋กํ ๋ก๋ฉ ์ค...</p>}>
<UserProfile userId={123} />
</Suspense>
);
};
์ด ์์ ์์ UserProfile์ fetchData๊ฐ ์๋ฃ๋ ๋๊น์ง ์ผ์ ์ค๋จ๋ฉ๋๋ค. <Suspense> ์ปดํฌ๋ํธ๋ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋ ๋๊น์ง "์ฌ์ฉ์ ํ๋กํ ๋ก๋ฉ ์ค..."์ ํ์ํฉ๋๋ค.
experimental_SuspenseList ์๊ฐ: ๋ก๋ฉ ์์ ์กฐ์จํ๊ธฐ
experimental_SuspenseList๋ Suspense๋ฅผ ํ ๋จ๊ณ ๋ ๋ฐ์ ์ํต๋๋ค. ์ฌ๋ฌ Suspense ๊ฒฝ๊ณ๊ฐ ํ์๋๋ ์์๋ฅผ ์ ์ดํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ ๋
๋ฆฝ์ ์ผ๋ก ๋ก๋๋๋ ํญ๋ชฉ์ ๋ชฉ๋ก์ด๋ ๊ทธ๋ฆฌ๋๋ฅผ ๋ ๋๋งํ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. experimental_SuspenseList๊ฐ ์์ผ๋ฉด ํญ๋ชฉ๋ค์ด ๋ก๋๋๋ฉด์ ๋ค์ฃฝ๋ฐ์ฃฝ ์์๋ก ๋ํ๋ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฌ์ฉ์์๊ฒ ์๊ฐ์ ์ผ๋ก ๊ฑฐ์ฌ๋ฆด ์ ์์ต๋๋ค. experimental_SuspenseList๋ ๋ ์ผ๊ด๋๊ณ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์ฝํ
์ธ ๋ฅผ ์ ๊ณตํ ์ ์๊ฒ ํด์ค๋๋ค.
experimental_SuspenseList ์ฌ์ฉ์ ์ฃผ์ ์ด์ :
- ์ฒด๊ฐ ์ฑ๋ฅ ํฅ์: ํ์ ์์๋ฅผ ์ ์ดํจ์ผ๋ก์จ ์ค์ํ ์ฝํ ์ธ ๋ฅผ ์ฐ์ ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๊ฑฐ๋ ์๊ฐ์ ์ผ๋ก ๋ง์กฑ์ค๋ฌ์ด ๋ก๋ฉ ์์๋ฅผ ๋ณด์ฅํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋น ๋ฅด๊ฒ ๋๊ปด์ง๊ฒ ํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ : ์์ธก ๊ฐ๋ฅํ ๋ก๋ฉ ํจํด์ ์ฌ์ฉ์์ ์ฃผ์๋ฅผ ๋ ๋ถ์ฐ์ํค๊ณ ๋ ์ง๊ด์ ์ ๋๋ค. ์ธ์ง ๋ถํ๋ฅผ ์ค์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ธ๋ จ๋๊ฒ ๋ง๋ญ๋๋ค.
- ๋ ์ด์์ ์ด๋ ๊ฐ์: ์ฝํ ์ธ ๊ฐ ๋ํ๋๋ ์์๋ฅผ ๊ด๋ฆฌํจ์ผ๋ก์จ ์์๊ฐ ๋ก๋๋ ๋ ์๊ธฐ์น ์์ ๋ ์ด์์ ์ด๋์ ์ต์ํํ์ฌ ํ์ด์ง์ ์ ๋ฐ์ ์ธ ์๊ฐ์ ์์ ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ์ค์ ์ฝํ ์ธ ์ฐ์ ์์ ์ง์ : ์ค์ํ ์์๋ฅผ ๋จผ์ ๋ณด์ฌ์ฃผ์ด ์ฌ์ฉ์์ ์ฐธ์ฌ๋ฅผ ์ ๋ํ๊ณ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
experimental_SuspenseList์ ๋ก๋ฉ ์ ๋ต
experimental_SuspenseList๋ ๋ก๋ฉ ์ ๋ต์ ์ ์ํ๋ prop๋ค์ ์ ๊ณตํฉ๋๋ค. ๋ ๊ฐ์ง ์ฃผ์ prop์ revealOrder์ tail์
๋๋ค.
1. revealOrder: ํ์ ์์ ์ ์
revealOrder prop์ experimental_SuspenseList ๋ด์ Suspense ๊ฒฝ๊ณ๊ฐ ํ์๋๋ ์์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ธ ๊ฐ์ง ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค:
forwards: ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๋ํ๋๋ ์์๋๋ก(์์์ ์๋๋ก, ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก) Suspense ๊ฒฝ๊ณ๋ฅผ ํ์ํฉ๋๋ค.backwards: ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๋ํ๋๋ ์์์ ์ญ์์ผ๋ก Suspense ๊ฒฝ๊ณ๋ฅผ ํ์ํฉ๋๋ค.together: ๋ชจ๋ Suspense ๊ฒฝ๊ณ๊ฐ ๋ก๋๋๋ฉด ๋์์ ๋ชจ๋ ํ์ํฉ๋๋ค.
์์ : Forwards ํ์ ์์
์ด๊ฒ์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ์ง๊ด์ ์ธ ์ ๋ต์ ๋๋ค. ๊ธฐ์ฌ ๋ชฉ๋ก์ ํ์ํ๋ค๊ณ ์์ํด ๋ณด์ธ์. ๊ธฐ์ฌ๋ค์ด ๋ก๋๋๋ฉด์ ์์์ ์๋๋ก ๋ํ๋๊ธฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
import { unstable_SuspenseList as SuspenseList } from 'react';
const Article = ({ articleId }) => {
const articleData = use(fetchArticleData(articleId));
return (
<div>
<h3>{articleData.title}</h3>
<p>{articleData.content.substring(0, 100)}...</p>
</div>
);
};
const ArticleList = ({ articleIds }) => {
return (
<SuspenseList revealOrder="forwards">
{articleIds.map(id => (
<Suspense key={id} fallback={<p>๊ธฐ์ฌ {id} ๋ก๋ฉ ์ค...</p>}>
<Article articleId={id} />
</Suspense>
))}
</SuspenseList>
);
};
//์ฌ์ฉ๋ฒ
const App = () => {
return (
<Suspense fallback={<p>๊ธฐ์ฌ ๋ชฉ๋ก ๋ก๋ฉ ์ค...</p>}>
<ArticleList articleIds={[1, 2, 3, 4, 5]} />
</Suspense>
);
};
์ด ์์ ์์ ๊ธฐ์ฌ๋ค์ articleId ์์๋๋ก 1๋ถํฐ 5๊น์ง ๋ก๋๋๊ณ ํ๋ฉด์ ๋ํ๋ฉ๋๋ค.
์์ : Backwards ํ์ ์์
์ด๊ฒ์ ๋ชฉ๋ก์ ๋ง์ง๋ง ํญ๋ชฉ๋ค์ ์ฐ์ ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๋ ์ ์ฉํฉ๋๋ค. ์๋ง๋ ๋ ์ต๊ทผ์ด๊ฑฐ๋ ๊ด๋ จ์ฑ ๋์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๊ธฐ ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค. ์ญ์๊ฐ ์์ ์ ๋ฐ์ดํธ ํผ๋๋ฅผ ํ์ํ๋ค๊ณ ์์ํด ๋ณด์ธ์.
import { unstable_SuspenseList as SuspenseList } from 'react';
const Update = ({ updateId }) => {
const updateData = use(fetchUpdateData(updateId));
return (
<div>
<h3>{updateData.title}</h3>
<p>{updateData.content.substring(0, 100)}...</p>
</div>
);
};
const UpdateFeed = ({ updateIds }) => {
return (
<SuspenseList revealOrder="backwards">
{updateIds.map(id => (
<Suspense key={id} fallback={<p>์
๋ฐ์ดํธ {id} ๋ก๋ฉ ์ค...</p>}>
<Update updateId={id} />
</Suspense>
))}
</SuspenseList>
);
};
//์ฌ์ฉ๋ฒ
const App = () => {
return (
<Suspense fallback={<p>์
๋ฐ์ดํธ ํผ๋ ๋ก๋ฉ ์ค...</p>}>
<UpdateFeed updateIds={[1, 2, 3, 4, 5]} />
</Suspense>
);
};
์ด ์์ ์์ ์
๋ฐ์ดํธ๋ค์ updateId์ ์ญ์์ผ๋ก, ์ฆ 5๋ถํฐ 1๊น์ง ๋ก๋๋๊ณ ํ๋ฉด์ ๋ํ๋ฉ๋๋ค.
์์ : Together ํ์ ์์
์ด ์ ๋ต์ ์ ์ง์ ์ธ ๋ก๋ฉ์ ํผํ๊ณ ์์ ํ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํ ๋ฒ์ ์ ๊ณตํ๊ณ ์ถ์ ๋ ์ ํฉํฉ๋๋ค. ์ฆ๊ฐ์ ์ธ ๋ถ๋ถ ์ ๋ณด๋ณด๋ค ์ ์ฒด ๊ทธ๋ฆผ์ด ๋ ์ค์ํ ๋์๋ณด๋๋ ๋ทฐ์ ์ ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋ ๋๊น์ง ์ฌ์ฉ์๋ ๋จ์ผ ๋ก๋ฉ ์ธ๋์ผ์ดํฐ๋ฅผ ๋ณด๊ฒ ๋๋ฏ๋ก ์ ์ฒด ๋ก๋ฉ ์๊ฐ์ ์ ์ํด์ผ ํฉ๋๋ค.
import { unstable_SuspenseList as SuspenseList } from 'react';
const DataPoint = ({ dataPointId }) => {
const data = use(fetchDataPoint(dataPointId));
return (
<div>
<p>๋ฐ์ดํฐ ํฌ์ธํธ {dataPointId}: {data.value}</p>
</div>
);
};
const Dashboard = ({ dataPointIds }) => {
return (
<SuspenseList revealOrder="together">
{dataPointIds.map(id => (
<Suspense key={id} fallback={<p>๋ฐ์ดํฐ ํฌ์ธํธ {id} ๋ก๋ฉ ์ค...</p>}>
<DataPoint dataPointId={id} />
</Suspense>
))}
</SuspenseList>
);
};
//์ฌ์ฉ๋ฒ
const App = () => {
return (
<Suspense fallback={<p>๋์๋ณด๋ ๋ก๋ฉ ์ค...</p>}>
<Dashboard dataPointIds={[1, 2, 3, 4, 5]} />
</Suspense>
);
};
์ด ์์ ์์๋ ๋ชจ๋ ๋ฐ์ดํฐ ํฌ์ธํธ(1๋ถํฐ 5๊น์ง)๊ฐ ๋ก๋๋ ๋๊น์ง ์ ์ฒด ๋์๋ณด๋๊ฐ ๋ก๋ฉ ์ํ๋ก ์ ์ง๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ชจ๋ ๋ฐ์ดํฐ ํฌ์ธํธ๊ฐ ๋์์ ๋ํ๋ฉ๋๋ค.
2. tail: ์ด๊ธฐ ๋ก๋ ํ ๋จ์ ํญ๋ชฉ ์ฒ๋ฆฌ
tail prop์ ์ด๊ธฐ ํญ๋ชฉ ์ธํธ๊ฐ ๋ก๋๋ ํ ๋ชฉ๋ก์ ๋๋จธ์ง ํญ๋ชฉ์ด ํ์๋๋ ๋ฐฉ์์ ์ ์ดํฉ๋๋ค. ๋ ๊ฐ์ง ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค:
collapsed: ์ด์ ์ ๋ชจ๋ ํญ๋ชฉ์ด ๋ก๋๋ ๋๊น์ง ๋๋จธ์ง ํญ๋ชฉ์ ์จ๊น๋๋ค. ์ด๋ ํญ๋ชฉ์ด ์ฐจ๋ก๋ก ๋ํ๋๋ "ํญํฌ์" ํจ๊ณผ๋ฅผ ๋ง๋ญ๋๋ค.suspended: ๋๋จธ์ง ํญ๋ชฉ์ ๋ ๋๋ง์ ์ผ์ ์ค๋จํ๊ณ ๊ฐ์์ fallback์ ํ์ํฉ๋๋ค. ์ด๋ ๋ณ๋ ฌ ๋ก๋ฉ์ ํ์ฉํ๋ฉด์๋revealOrder๋ฅผ ์กด์คํฉ๋๋ค.
tail์ด ์ ๊ณต๋์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ collapsed์
๋๋ค.
์์ : Collapsed Tail
์ด๊ฒ์ ๊ธฐ๋ณธ ๋์์ด๋ฉฐ ์์๊ฐ ์ค์ํ ๋ชฉ๋ก์ ์ข์ ์ ํ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ง์ ๋ ์์๋๋ก ํญ๋ชฉ์ด ๋ํ๋๋๋ก ๋ณด์ฅํ์ฌ ๋ถ๋๋ฝ๊ณ ์์ธก ๊ฐ๋ฅํ ๋ก๋ฉ ๊ฒฝํ์ ๋ง๋ญ๋๋ค.
import { unstable_SuspenseList as SuspenseList } from 'react';
const Item = ({ itemId }) => {
const itemData = use(fetchItemData(itemId));
return (
<div>
<h3>ํญ๋ชฉ {itemId}</h3>
<p>ํญ๋ชฉ {itemId}์ ๋ํ ์ค๋ช
์
๋๋ค.</p>
</div>
);
};
const ItemList = ({ itemIds }) => {
return (
<SuspenseList revealOrder="forwards" tail="collapsed">
{itemIds.map(id => (
<Suspense key={id} fallback={<p>ํญ๋ชฉ {id} ๋ก๋ฉ ์ค...</p>}>
<Item itemId={id} />
</Suspense>
))}
</SuspenseList>
);
};
//์ฌ์ฉ๋ฒ
const App = () => {
return (
<Suspense fallback={<p>ํญ๋ชฉ ๋ชฉ๋ก ๋ก๋ฉ ์ค...</p>}>
<ItemList itemIds={[1, 2, 3, 4, 5]} />
</Suspense>
);
};
์ด ์์ ์์ revealOrder="forwards"์ tail="collapsed"๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ํญ๋ชฉ์ด ์์ฐจ์ ์ผ๋ก ๋ก๋๋ฉ๋๋ค. ํญ๋ชฉ 1์ด ๋จผ์ ๋ก๋๋๊ณ , ๊ทธ ๋ค์ ํญ๋ชฉ 2๊ฐ ๋ก๋๋๋ ์์
๋๋ค. ๋ก๋ฉ ์ํ๊ฐ ๋ชฉ๋ก์ ๋ฐ๋ผ "๊ณ๋จ์์ผ๋ก" ๋ด๋ ค๊ฐ๋๋ค.
์์ : Suspended Tail
์ด๋ ์ ์ฒด์ ์ธ ํ์ ์์๋ฅผ ์กด์คํ๋ฉด์ ํญ๋ชฉ์ ๋ณ๋ ฌ ๋ก๋ฉ์ ํ์ฉํฉ๋๋ค. ํญ๋ชฉ์ ๋น ๋ฅด๊ฒ ๋ก๋ํ๋ฉด์๋ ์๊ฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ์ถ์ ๋ ์ ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋ฌ ๋ก๋ฉ ์ธ๋์ผ์ดํฐ๊ฐ ๋์์ ๋ณด์ผ ์ ์๊ธฐ ๋๋ฌธ์ collapsed tail๋ณด๋ค ์๊ฐ์ ์ผ๋ก ์ฝ๊ฐ ๋ ์ฐ๋งํ ์ ์์ต๋๋ค.
import { unstable_SuspenseList as SuspenseList } from 'react';
const Product = ({ productId }) => {
const productData = use(fetchProductData(productId));
return (
<div>
<h3>{productData.name}</h3>
<p>๊ฐ๊ฒฉ: {productData.price}</p>
</div>
);
};
const ProductList = ({ productIds }) => {
return (
<SuspenseList revealOrder="forwards" tail="suspended">
{productIds.map(id => (
<Suspense key={id} fallback={<p>์ํ {id} ๋ก๋ฉ ์ค...</p>}>
<Product productId={id} />
</Suspense>
))}
</SuspenseList>
);
};
//์ฌ์ฉ๋ฒ
const App = () => {
return (
<Suspense fallback={<p>์ํ ๋ชฉ๋ก ๋ก๋ฉ ์ค...</p>}>
<ProductList productIds={[1, 2, 3, 4, 5]} />
</Suspense>
);
};
์ด ์์ ์์ revealOrder="forwards"์ tail="suspended"๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์ํ์ด ๋ณ๋ ฌ๋ก ๋ก๋ฉ์ ์์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ํ๋ฉด์๋ ์์๋๋ก(1๋ถํฐ 5๊น์ง) ๋ํ๋ฉ๋๋ค. ๋ชจ๋ ํญ๋ชฉ์ ๋ํ ๋ก๋ฉ ์ธ๋์ผ์ดํฐ๋ฅผ ๋ณด๊ฒ ๋๊ณ , ๊ทธ ๋ค์ ์ฌ๋ฐ๋ฅธ ์์๋ก ์๋ฃ๋ฉ๋๋ค.
์ค์ฉ์ ์ธ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
๋ค์์ experimental_SuspenseList๊ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ ์ค์ ์๋๋ฆฌ์ค๋ค์
๋๋ค:
- ์ ์์๊ฑฐ๋ ์ํ ๋ชฉ๋ก: ์ํ์ด ๋ก๋๋ ๋ ์ผ๊ด๋ ์์(์: ์ธ๊ธฐ์ ๋๋ ๊ด๋ จ์ฑ์)๋ก ํ์ํฉ๋๋ค. ๋ถ๋๋ฌ์ด ์์ฐจ์ ํ์๋ฅผ ์ํด
revealOrder="forwards"์tail="collapsed"๋ฅผ ์ฌ์ฉํ์ธ์. - ์์
๋ฏธ๋์ด ํผ๋:
revealOrder="backwards"๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ์ต๊ทผ ์ ๋ฐ์ดํธ๋ฅผ ๋จผ์ ๋ณด์ฌ์ค๋๋ค.tail="collapsed"์ ๋ต์ ์ ๊ฒ์๋ฌผ์ด ๋ก๋๋ ๋ ํ์ด์ง๊ฐ ์์๋๋ก ์์ง์ด๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. - ์ด๋ฏธ์ง ๊ฐค๋ฌ๋ฆฌ: ์๊ฐ์ ์ผ๋ก ๋งค๋ ฅ์ ์ธ ์์๋ก ์ด๋ฏธ์ง๋ฅผ ์ ์ํ๊ณ , ์๋ง๋ ๊ทธ๋ฆฌ๋ ํจํด์ผ๋ก ํ์ํฉ๋๋ค. ์ํ๋ ํจ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ๋ค์ํ
revealOrder๊ฐ์ ์คํํด ๋ณด์ธ์. - ๋ฐ์ดํฐ ๋์๋ณด๋: ๋ค๋ฅธ ์น์
์ด ์์ง ๋ก๋ฉ ์ค์ด๋๋ผ๋ ์ฌ์ฉ์์๊ฒ ๊ฐ์๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ค์ํ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ๋จผ์ ๋ก๋ํฉ๋๋ค. ํ์๋๊ธฐ ์ ์ ์์ ํ ๋ก๋๋์ด์ผ ํ๋ ์ปดํฌ๋ํธ์๋
revealOrder="together"์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์. - ๊ฒ์ ๊ฒฐ๊ณผ:
revealOrder="forwards"์ ์ ์คํ๊ฒ ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ๊ด๋ จ์ฑ ๋์ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋จผ์ ๋ก๋๋๋๋ก ์ฐ์ ์์๋ฅผ ์ง์ ํฉ๋๋ค. - ๊ตญ์ ํ๋ ์ฝํ ์ธ : ์ฌ๋ฌ ์ธ์ด๋ก ๋ฒ์ญ๋ ์ฝํ ์ธ ๊ฐ ์๋ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ ์ธ์ด๊ฐ ์ฆ์ ๋ก๋๋๋๋ก ํ๊ณ , ์ฌ์ฉ์์ ์ ํธ๋๋ ์ง๋ฆฌ์ ์์น์ ๋ฐ๋ผ ๋ค๋ฅธ ์ธ์ด๋ฅผ ์ฐ์ ์์์ ๋ฐ๋ผ ๋ก๋ํฉ๋๋ค.
experimental_SuspenseList ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ๋จ์ํ๊ฒ ์ ์งํ์ธ์:
experimental_SuspenseList๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ์ง ๋ง์ธ์. ์ฝํ ์ธ ๊ฐ ํ์๋๋ ์์๊ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ์ค๋ํ ์ํฅ์ ๋ฏธ์น ๋๋ง ์ฌ์ฉํ์ธ์. - ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์ต์ ํ:
experimental_SuspenseList๋ ์ค์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์๋ ํ์ ์์๋ง ์ ์ดํฉ๋๋ค. ๋ก๋ฉ ์๊ฐ์ ์ต์ํํ๊ธฐ ์ํด ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ํจ์จ์ ์ธ์ง ํ์ธํ์ธ์. ๋ถํ์ํ ์ฌ์์ฒญ์ ํผํ๊ธฐ ์ํด ๋ฉ๋ชจ์ด์ ์ด์ ๋ฐ ์บ์ฑ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ธ์. - ์๋ฏธ ์๋ Fallback ์ ๊ณต:
<Suspense>์ปดํฌ๋ํธ์fallbackprop์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ฌ์ฉ์์๊ฒ ์ฝํ ์ธ ๊ฐ ๋ก๋ ์ค์์ ์๋ฆฌ๋ ๋ช ํํ๊ณ ์ ์ตํ ๋ก๋ฉ ์ธ๋์ผ์ดํฐ๋ฅผ ์ ๊ณตํ์ธ์. ๋ ์๊ฐ์ ์ผ๋ก ๋งค๋ ฅ์ ์ธ ๋ก๋ฉ ๊ฒฝํ์ ์ํด ์ค์ผ๋ ํค ๋ก๋ ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์. - ์ฒ ์ ํ๊ฒ ํ ์คํธํ์ธ์: ๋๋ฆฐ ์ฐ๊ฒฐ์์๋ ์ฌ์ฉ์ ๊ฒฝํ์ด ์์ฉ ๊ฐ๋ฅํ ์์ค์ธ์ง ํ์ธํ๊ธฐ ์ํด ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด์์ ๋ก๋ฉ ์ํ๋ฅผ ํ ์คํธํ์ธ์.
- ์ ๊ทผ์ฑ์ ๊ณ ๋ คํ์ธ์: ๋ก๋ฉ ์ธ๋์ผ์ดํฐ๊ฐ ์ฅ์ ๋ฅผ ๊ฐ์ง ์ฌ์ฉ์์๊ฒ๋ ์ ๊ทผ ๊ฐ๋ฅํ์ง ํ์ธํ์ธ์. ๋ก๋ฉ ํ๋ก์ธ์ค์ ๋ํ ์๋ฏธ๋ก ์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ARIA ์์ฑ์ ์ฌ์ฉํ์ธ์.
- ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ์ธ์: ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๊ณ ๋ก๋ฉ ํ๋ก์ธ์ค์ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ธ์.
- ์ฝ๋ ๋ถํ : Suspense๋ฅผ ์ฝ๋ ๋ถํ ๊ณผ ๊ฒฐํฉํ์ฌ ํ์ํ ๋ ํ์ํ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ง ๋ก๋ํ์ธ์.
- ๊ณผ๋ํ ์ค์ฒฉ ํผํ๊ธฐ: ๊น๊ฒ ์ค์ฒฉ๋ Suspense ๊ฒฝ๊ณ๋ ๋ณต์กํ ๋ก๋ฉ ๋์์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋๋ฒ๊น ๊ณผ ์ ์ง๋ณด์๋ฅผ ๋จ์ํํ๊ธฐ ์ํด ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ๋น๊ต์ ํํํ๊ฒ ์ ์งํ์ธ์.
- ์ ์ง์ ๊ธฐ๋ฅ ์ ํ: JavaScript๊ฐ ๋นํ์ฑํ๋๊ฑฐ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋ป๊ฒ ๋์ํ ์ง ๊ณ ๋ คํ์ธ์. ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝํ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋์ฒด ์ฝํ ์ธ ๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ์ธ์.
์ ํ ์ฌํญ ๋ฐ ๊ณ ๋ ค ์ฌํญ
- ์คํ์ ์ํ:
experimental_SuspenseList๋ ์์ง ์คํ์ ์ธ API์ด๋ฏ๋ก, ํฅํ React ๋ฆด๋ฆฌ์ค์์ ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ์ ์์ต๋๋ค. ์ฃผ์ํด์ ์ฌ์ฉํ๊ณ API๊ฐ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์์ ํ ์ค๋น๋ฅผ ํ์ธ์. - ๋ณต์ก์ฑ:
experimental_SuspenseList๋ ๋ก๋ฉ ์ํ์ ๋ํ ๊ฐ๋ ฅํ ์ ์ด๋ฅผ ์ ๊ณตํ์ง๋ง, ์ฝ๋์ ๋ณต์ก์ฑ์ ๋ํ ์๋ ์์ต๋๋ค. ์ด์ ์ด ์ถ๊ฐ๋ ๋ณต์ก์ฑ์ ์์ํ๋์ง ์ ์คํ๊ฒ ๊ณ ๋ คํ์ธ์. - React ๋์์ฑ ๋ชจ๋ ํ์:
experimental_SuspenseList์useํ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๊ธฐ ์ํด React ๋์์ฑ ๋ชจ๋๊ฐ ํ์ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์์ฑ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋๋ก ๊ตฌ์ฑ๋์๋์ง ํ์ธํ์ธ์. - ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR): SSR๊ณผ ํจ๊ป Suspense๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง๋ณด๋ค ๋ ๋ณต์กํ ์ ์์ต๋๋ค. ํ์ด๋๋ ์ด์ ๋ถ์ผ์น๋ฅผ ํผํ๊ธฐ ์ํด ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ HTML์ ๋ณด๋ด๊ธฐ ์ ์ ๋ฐ์ดํฐ๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋๋ก ํด์ผ ํฉ๋๋ค.
๊ฒฐ๋ก
experimental_SuspenseList๋ React ์ ํ๋ฆฌ์ผ์ด์
์์ ์ ๊ตํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ๋ก๋ฉ ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ์
๋๋ค. ๋ก๋ฉ ์ ๋ต์ ์ดํดํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์ฉํจ์ผ๋ก์จ ๋ ๋น ๋ฅด๊ณ , ๋ฐ์์ฑ์ด ๋ฐ์ด๋๋ฉฐ, ๋ ์ฐ๋งํ๊ฒ ๋๊ปด์ง๋ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์์ง ์คํ์ ์ด์ง๋ง, experimental_SuspenseList๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ฐฐ์ด ๊ฐ๋
๊ณผ ๊ธฐ์ ์ ๋งค์ฐ ๊ฐ์น๊ฐ ์์ผ๋ฉฐ, ๋น๋๊ธฐ ๋ฐ์ดํฐ ๋ฐ UI ์
๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ฏธ๋์ React API์ ์ํฅ์ ๋ฏธ์น ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. React๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ, Suspense ๋ฐ ๊ด๋ จ ๊ธฐ๋ฅ์ ๋ง์คํฐํ๋ ๊ฒ์ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๊ณ ํ์ง ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๋ฐ ์ ์ ๋ ์ค์ํด์ง ๊ฒ์
๋๋ค. ํญ์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ต์ฐ์ ์ผ๋ก ์๊ฐํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ์๊ตฌ์ ๊ฐ์ฅ ์ ํฉํ ๋ก๋ฉ ์ ๋ต์ ์ ํํ๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์. ์ฌ์ฉ์๋ฅผ ์ํ ์ต์์ ๋ก๋ฉ ๊ฒฝํ์ ๋ง๋ค๊ธฐ ์ํด ์คํํ๊ณ , ํ
์คํธํ๊ณ , ๋ฐ๋ณตํ์ธ์.