React์ ์คํ์ ๊ธฐ๋ฅ์ธ experimental_useCache ํ ์ ๋ํ ์ฌ์ธต ๋ถ์. ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ์บ์ฑ ์ต์ ํ๋ฅผ ์ํ ์ด์ , ์ฌ์ฉ ์ฌ๋ก, ๊ตฌํ ์ ๋ต์ ํ๊ตฌํฉ๋๋ค.
React experimental_useCache: ํฅ์๋ ์ฑ๋ฅ์ ์ํ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์บ์ฑ ๋ง์คํฐํ๊ธฐ
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์ฃผ์ญ์ธ React๋ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ฆ๊ฐํ๋ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๊ธฐ ์ํด ์ง์์ ์ผ๋ก ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ์ต๊ทผ์ ์ถ๊ฐ๋ ํฅ๋ฏธ๋ก์ด ์คํ์ ๊ธฐ๋ฅ ์ค ํ๋๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์บ์ฑ์ ๊ฐ์ํํ๊ธฐ ์ํด ์ค๊ณ๋ ํ
์ธ experimental_useCache์
๋๋ค. ์ด ํ
์ ํนํ React ์๋ฒ ์ปดํฌ๋ํธ(RSC) ๋ฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋งฅ๋ฝ์์ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ์ต์ ํํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด ์ข
ํฉ ๊ฐ์ด๋์์๋ experimental_useCache์ ์ด์ , ์ฌ์ฉ ์ฌ๋ก, ๊ตฌํ ์ ๋ต ๋ฐ ๋์
์ ๊ณ ๋ ค ์ฌํญ์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์บ์ฑ ์ดํดํ๊ธฐ
experimental_useCache์ ์ธ๋ถ ์ฌํญ์ ์ดํด๋ณด๊ธฐ ์ ์, ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์บ์ฑ๊ณผ ์น ๊ฐ๋ฐ์์์ ์ค์์ฑ์ ๋ํด ํ์คํ ์ดํดํด ๋ด
์๋ค.
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์บ์ฑ์ด๋?
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์บ์ฑ์ ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ๋ ๊ธฐ๊ธฐ์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด ์บ์๋ ๋ฐ์ดํฐ๋ ์๋ฒ์ ๋ฐ๋ณต์ ์ผ๋ก ์์ฒญํ์ง ์๊ณ ๋ ์ ์ํ๊ฒ ๊ฒ์๋ ์ ์์ต๋๋ค. ์ด๋ ์ง์ฐ ์๊ฐ์ ํฌ๊ฒ ์ค์ด๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์๋ต์ฑ์ ํฅ์์ํค๋ฉฐ, ์๋ฒ ๋ถํ๋ฅผ ๊ฐ์์ํต๋๋ค.
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์บ์ฑ์ ์ด์
- ํฅ์๋ ์ฑ๋ฅ: ๋คํธ์ํฌ ์์ฒญ ๊ฐ์๋ ๋ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ๊ณผ ๋ ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค.
- ์๋ฒ ๋ถํ ๊ฐ์: ์บ์ฑ์ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ ๊ฒ์ ๋ถ๋ด์ ๋์ด์ฃผ์ด ๋ค๋ฅธ ์์ ์ ์ํ ๋ฆฌ์์ค๋ฅผ ํ๋ณดํฉ๋๋ค.
- ์คํ๋ผ์ธ ๊ธฐ๋ฅ: ์ผ๋ถ ๊ฒฝ์ฐ, ์บ์๋ ๋ฐ์ดํฐ๋ ์ ํ๋ ์คํ๋ผ์ธ ๊ธฐ๋ฅ์ ํ์ฑํํ์ฌ ์ฌ์ฉ์๊ฐ ์ธํฐ๋ท ์ฐ๊ฒฐ ์์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ ์์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
- ๋น์ฉ ์ ๊ฐ: ์๋ฒ ๋ถํ ๊ฐ์๋ ํนํ ํธ๋ํฝ์ด ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ธํ๋ผ ๋น์ฉ ์ ๊ฐ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
React experimental_useCache ์๊ฐ
experimental_useCache๋ ํนํ React ์๋ฒ ์ปดํฌ๋ํธ ๋ด์์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์บ์ฑ์ ๋จ์ํํ๊ณ ํฅ์์ํค๊ธฐ ์ํด ํน๋ณํ ์ค๊ณ๋ React ํ
์
๋๋ค. ์ด๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ๊ฐ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์
์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๋ ํธ๋ฆฌํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ, ๋์ผํ ์
๋ ฅ์ ๋ํด ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๊ฐ์ ธ์ค์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
experimental_useCache์ ์ฃผ์ ๊ธฐ๋ฅ ๋ฐ ์ด์
- ์๋ ์บ์ฑ: ์ด ํ ์ ์ ๋ฌ๋ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ์ธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋์ผ๋ก ์บ์ํฉ๋๋ค.
- ์บ์ ๋ฌดํจํ: ํต์ฌ
useCacheํ ์์ฒด๋ ๋ด์ฅ๋ ์บ์ ๋ฌดํจํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ง๋ง, ์บ์ ์ ๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ค๋ฅธ ์ ๋ต(๋์ค์ ์ค๋ช )๊ณผ ๊ฒฐํฉํ ์ ์์ต๋๋ค. - React ์๋ฒ ์ปดํฌ๋ํธ์์ ํตํฉ:
useCache๋ React ์๋ฒ ์ปดํฌ๋ํธ์ ์ํํ๊ฒ ์๋ํ๋๋ก ์ค๊ณ๋์ด ์๋ฒ์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ ์ ์์ต๋๋ค. - ๊ฐ์ํ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ: ์บ์ ํค ๋ฐ ์ ์ฅ์ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ์ ์ถ์ํํ์ฌ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ก์ง์ ๋จ์ํํฉ๋๋ค.
experimental_useCache์ ์๋ ๋ฐฉ์
experimental_useCache ํ
์ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค. ์ด ํจ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ๊ณ์ฐํ๋ ์ญํ ์ ํฉ๋๋ค. ํ
์ด ๋์ผํ ์ธ์๋ก ํธ์ถ๋๋ฉด, ๋จผ์ ํจ์์ ๊ฒฐ๊ณผ๊ฐ ์ด๋ฏธ ์บ์๋์ด ์๋์ง ํ์ธํฉ๋๋ค. ๋ง์ฝ ์บ์๋์ด ์๋ค๋ฉด ์บ์๋ ๊ฐ์ด ๋ฐํ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํจ์๊ฐ ์คํ๋๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ ์บ์๋ ํ ๋ฐํ๋ฉ๋๋ค.
experimental_useCache์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
API์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฐ๋จํ ์์ ๋ฅผ ํตํด experimental_useCache์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
import { experimental_useCache as useCache } from 'react';
async function fetchUserData(userId: string): Promise<{ id: string; name: string }> {
// API ํธ์ถ ์๋ฎฌ๋ ์ด์
await new Promise(resolve => setTimeout(resolve, 500)); // ์ง์ฐ ์๊ฐ ์๋ฎฌ๋ ์ด์
return { id: userId, name: `User ${userId}` };
}
function UserProfile({ userId }: { userId: string }) {
const userData = useCache(fetchUserData, userId);
if (!userData) {
return <p>์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ์ค...</p>;
}
return (
<div>
<h2>์ฌ์ฉ์ ํ๋กํ</h2>
<p><strong>ID:</strong> {userData.id}</p>
<p><strong>์ด๋ฆ:</strong> {userData.name}</p>
</div>
);
}
export default UserProfile;
์ด ์์ ์์:
reactํจํค์ง์์experimental_useCache๋ฅผ ๊ฐ์ ธ์ต๋๋ค.- API์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์
ํ๋ ๋น๋๊ธฐ ํจ์
fetchUserData๋ฅผ ์ ์ํฉ๋๋ค (์ธ์์ ์ธ ์ง์ฐ ์๊ฐ ํฌํจ). UserProfile์ปดํฌ๋ํธ์์useCache๋ฅผ ์ฌ์ฉํ์ฌuserIdprop์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์บ์ํฉ๋๋ค.- ์ปดํฌ๋ํธ๊ฐ ํน์
userId๋ก ์ฒ์ ๋ ๋๋ง๋ ๋fetchUserData๊ฐ ํธ์ถ๋ฉ๋๋ค. ์ดํ ๋์ผํuserId๋ก ๋ ๋๋ง๋ ๋๋ ์บ์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ์ฌ ๋ ๋ค๋ฅธ API ํธ์ถ์ ํผํฉ๋๋ค.
๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ๊ณ ๋ ค ์ฌํญ
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ์ ๊ฐ๋จํ์ง๋ง, experimental_useCache๋ ๋ ๋ณต์กํ ์๋๋ฆฌ์ค์ ์ ์ฉ๋ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก์ ์ค์ํ ๊ณ ๋ ค ์ฌํญ์
๋๋ค:
๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์บ์ฑ
experimental_useCache๋ ๋ฐฐ์ด ๋ฐ ๊ฐ์ฒด์ ๊ฐ์ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์บ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์บ์ ํค ์์ฑ์ ์ํด ์บ์๋ ํจ์์ ์ ๋ฌ๋๋ ์ธ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ง๋ ฌํ๋์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ธ์์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ฒด๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ, ํด๋น ๊ฐ์ฒด์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ์บ์ ํค์ ๋ฐ์๋์ง ์์ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ ๋ณํ ์บ์ฑ
์ข
์ข
API์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ ์ ๋ณํํด์ผ ํ ์ ์์ต๋๋ค. experimental_useCache๋ฅผ ์ฌ์ฉํ์ฌ ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ ์บ์ํ๋ฉด ํ์ ๋ ๋๋ง์์ ์ค๋ณต ๋ณํ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
import { experimental_useCache as useCache } from 'react';
async function fetchProducts(): Promise<{ id: string; name: string; price: number }[]> {
// API์์ ์ ํ ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ ์๋ฎฌ๋ ์ด์
await new Promise(resolve => setTimeout(resolve, 300));
return [
{ id: '1', name: 'Product A', price: 20 },
{ id: '2', name: 'Product B', price: 30 },
];
}
function formatCurrency(price: number, currency: string = 'USD'): string {
return new Intl.NumberFormat('en-US', { style: 'currency', currency }).format(price);
}
function ProductList() {
const products = useCache(fetchProducts);
const formattedProducts = useCache(
(prods: { id: string; name: string; price: number }[]) => {
return prods.map(product => ({
...product,
formattedPrice: formatCurrency(product.price),
}));
},
products || [] // products๋ฅผ ์ธ์๋ก ์ ๋ฌ
);
if (!formattedProducts) {
return <p>์ ํ์ ๋ก๋ํ๋ ์ค...</p>;
}
return (
<ul>
{formattedProducts.map(product => (
<li key={product.id}>
<strong>{product.name}</strong> - {product.formattedPrice}
</li>
))}
</ul>
);
}
export default ProductList;
์ด ์์ ์์๋ ์ ํ ๋ชฉ๋ก์ ๊ฐ์ ธ์จ ๋ค์ formatCurrency ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ ํ์ ๊ฐ๊ฒฉ ํ์์ ์ง์ ํฉ๋๋ค. useCache๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ ํ ๋ฐ์ดํฐ์ ํ์ํ๋ ์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์บ์ํ์ฌ ์ค๋ณต๋ API ํธ์ถ ๋ฐ ๊ฐ๊ฒฉ ์์ ์ง์ ์ ๋ฐฉ์งํฉ๋๋ค.
์บ์ ๋ฌดํจํ ์ ๋ต
experimental_useCache๋ ๋ด์ฅ๋ ์บ์ ๋ฌดํจํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์บ์๊ฐ ์
๋ฐ์ดํธ๋๋๋ก ์์ฒด ์ ๋ต์ ๊ตฌํํด์ผ ํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์
๋๋ค:
- ์๋ ์บ์ ๋ฌดํจํ: ์ํ ๋ณ์๋ ์ปจํ
์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํจ์ผ๋ก์จ ์บ์๋ฅผ ์๋์ผ๋ก ๋ฌดํจํํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ํ ๋ณ์๋ ์ปจํ
์คํธ๋ฅผ ์
๋ฐ์ดํธํ์ฌ ๋ฆฌ๋ ๋๋ง์ ์ ๋ฐํ๊ณ
useCache๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์ค๋๋ก ํ ์ ์์ต๋๋ค. - ์๊ฐ ๊ธฐ๋ฐ ๋ง๋ฃ: ์บ์๋ ๋ฐ์ดํฐ์ ํจ๊ป ํ์์คํฌํ๋ฅผ ์ ์ฅํ์ฌ ์๊ฐ ๊ธฐ๋ฐ ๋ง๋ฃ ์ ๋ต์ ๊ตฌํํ ์ ์์ต๋๋ค. ์บ์์ ์ ๊ทผํ ๋ ํ์์คํฌํ๊ฐ ํน์ ์๊ณ๊ฐ๋ณด๋ค ์ค๋๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์บ์๋ฅผ ๋ฌดํจํํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
- ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฌดํจํ: ์ ํ๋ฆฌ์ผ์ด์ ์ด pub/sub ์์คํ ์ด๋ ์ ์ฌํ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๊ด๋ จ ์ด๋ฒคํธ๊ฐ ๊ฒ์๋ ๋ ์บ์๋ฅผ ๋ฌดํจํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ํ๋กํ ์ ๋ณด๋ฅผ ์ ๋ฐ์ดํธํ๋ฉด ์ฌ์ฉ์ ํ๋กํ ์บ์๋ฅผ ๋ฌดํจํํ๋ ์ด๋ฒคํธ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ
๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ํจ๊ป experimental_useCache๋ฅผ ์ฌ์ฉํ ๋๋ ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. try...catch ๋ธ๋ก์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์ค์ ๋ฐ์ํ๋ ๋ชจ๋ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ์ฌ์ฉ์์๊ฒ ์ ์ ํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํ ์ ์์ต๋๋ค. `fetchUserData` ๋๋ ์ ์ฌํ ํจ์๋ฅผ try/catch๋ก ๊ฐ์ธ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
React ์๋ฒ ์ปดํฌ๋ํธ(RSC)์์ ํตํฉ
experimental_useCache๋ React ์๋ฒ ์ปดํฌ๋ํธ(RSC) ๋ด์์ ์ฌ์ฉํ ๋ ๋น์ ๋ฐํฉ๋๋ค. RSC๋ ์๋ฒ์์ ์คํ๋๋ฏ๋ก ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค. RSC์์ experimental_useCache๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์์
์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ํด๋ผ์ด์ธํธ๋ก ์คํธ๋ฆฌ๋ฐ๋ ์ ์์ต๋๋ค.
๋ค์์ RSC์์ experimental_useCache๋ฅผ ์ฌ์ฉํ๋ ์์
๋๋ค:
// app/components/ServerComponent.tsx (์ด ํ์ผ์ RSC์
๋๋ค)
import { experimental_useCache as useCache } from 'react';
import { cookies } from 'next/headers'
async function getSessionData() {
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ์ธ๋ถ ์๋น์ค์์ ์ธ์
์ฝ๊ธฐ ์๋ฎฌ๋ ์ด์
const cookieStore = cookies()
const token = cookieStore.get('sessionToken')
await new Promise((resolve) => setTimeout(resolve, 100));
return { user: 'authenticatedUser', token: token?.value };
}
export default async function ServerComponent() {
const session = await useCache(getSessionData);
return (
<div>
<h2>์๋ฒ ์ปดํฌ๋ํธ</h2>
<p>์ฌ์ฉ์: {session?.user}</p>
<p>์ธ์
ํ ํฐ: {session?.token}</p>
</div>
);
}
์ด ์์ ์์ getSessionData ํจ์๋ ์๋ฒ ์ปดํฌ๋ํธ ๋ด์์ ํธ์ถ๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ useCache๋ฅผ ์ฌ์ฉํ์ฌ ์บ์๋ฉ๋๋ค. ํ์ ์์ฒญ์ ์บ์๋ ์ธ์
๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ์๋ฒ ๋ถํ๋ฅผ ์ค์
๋๋ค. ์ปดํฌ๋ํธ ์์ฒด์ `async` ํค์๋๊ฐ ์ฌ์ฉ๋ ์ ์ ์ฃผ๋ชฉํ์ธ์.
์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ ๋ฐ ํธ๋ ์ด๋์คํ
experimental_useCache๋ ์๋นํ ์ฑ๋ฅ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ์ ์ฌ์ ์ธ ํธ๋ ์ด๋์คํ๋ฅผ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ์บ์ ํฌ๊ธฐ: ์บ์์ ํฌ๊ธฐ๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ปค์ ธ ์๋นํ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ ์ ์์ต๋๋ค. ์บ์ ํฌ๊ธฐ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ์์ฃผ ์ฌ์ฉ๋์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๋ ์ ๋ต์ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์บ์ ๋ฌดํจํ ์ค๋ฒํค๋: ์บ์ ๋ฌดํจํ ์ ๋ต์ ๊ตฌํํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ด ์ถ๊ฐ๋ ์ ์์ต๋๋ค. ์ ํ์ฑ๊ณผ ์ฑ๋ฅ์ ๊ท ํ์ ๋ง์ถ๋ ์ ๋ต์ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ค๋๋ ๋ฐ์ดํฐ: ์บ์๊ฐ ์ ๋๋ก ๋ฌดํจํ๋์ง ์์ผ๋ฉด ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ์ฌ ์๋ชป๋ ๊ฒฐ๊ณผ๋ ์๊ธฐ์น ์์ ๋์์ ์ ๋ฐํ ์ ์์ต๋๋ค.
experimental_useCache ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
experimental_useCache์ ์ด์ ์ ๊ทน๋ํํ๊ณ ์ ์ฌ์ ์ธ ๋จ์ ์ ์ต์ํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค:
- ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์บ์ฑ: ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค๊ฑฐ๋ ๋คํธ์ํฌ ์์ฒญ์ด ํฌํจ๋ ์์ ๋ง ์บ์ํ์ธ์. ๊ฐ๋จํ ๊ณ์ฐ์ด๋ ๋ฐ์ดํฐ ๋ณํ์ ์บ์ฑํ๋ ๊ฒ์ ํฐ ์ด์ ์ ์ ๊ณตํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
- ์ ์ ํ ์บ์ ํค ์ ํ: ์บ์๋ ํจ์์ ์ ๋ ฅ์ ์ ํํ๊ฒ ๋ฐ์ํ๋ ์บ์ ํค๋ฅผ ์ฌ์ฉํ์ธ์. ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์บ์ ํค๋ก ์ฌ์ฉํ๋ ๊ฒ์ ํผํ์ธ์.
- ์บ์ ๋ฌดํจํ ์ ๋ต ๊ตฌํ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ ์ฌํญ์ ์ ํฉํ ์บ์ ๋ฌดํจํ ์ ๋ต์ ์ ํํ์ธ์. ์๋ ๋ฌดํจํ, ์๊ฐ ๊ธฐ๋ฐ ๋ง๋ฃ ๋๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฌดํจํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- ์บ์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ์บ์ ํฌ๊ธฐ, ์ ์ค๋ฅ ๋ฐ ๋ฌดํจํ ๋น๋๋ฅผ ๋ชจ๋ํฐ๋งํ์ฌ ์ ์ฌ์ ์ธ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ธ์.
- ์ ์ญ ์ํ ๊ด๋ฆฌ ์๋ฃจ์ ๊ณ ๋ ค: ๋ณต์กํ ์บ์ฑ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ TanStack Query (React Query), SWR ๋๋ ์ง์ ์ํ๋ฅผ ๊ฐ์ง Zustand์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ๋ ฅํ ์บ์ฑ ๋ฉ์ปค๋์ฆ, ๋ฌดํจํ ์ ๋ต ๋ฐ ์๋ฒ ์ํ ๋๊ธฐํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
experimental_useCache์ ๋์
experimental_useCache๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์บ์ฑ์ ๊ตฌํํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง, ๊ฐ๊ฐ ๊ณ ์ ํ ์ฅ๋จ์ ์ ๊ฐ์ง ๋ค๋ฅธ ์ฌ๋ฌ ์ต์
๋ ์ฌ์ฉํ ์ ์์ต๋๋ค:
- ๋ฉ๋ชจ์ด์ ์ด์
๊ธฐ๋ฒ (
useMemo,useCallback): ์ด ํ ๋ค์ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ด๋ ํจ์ ํธ์ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ฆํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ ์บ์ ๋ฌดํจํ๋ ์ง์์ฑ์ ์ ๊ณตํ์ง๋ ์์ต๋๋ค. - ์๋ํํฐ ์บ์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: TanStack Query (React Query) ๋ฐ SWR๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ ์บ์ ๋ฌดํจํ, ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ์๋ฒ ์ํ ๋๊ธฐํ๋ฅผ ํฌํจํ ๋ ํฌ๊ด์ ์ธ ์บ์ฑ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ ์ฅ์ (LocalStorage, SessionStorage): ์ด API๋ค์ ๋ธ๋ผ์ฐ์ ์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์บ์ฑํ๊ฑฐ๋ ์บ์ ๋ฌดํจํ๋ฅผ ๊ด๋ฆฌํ๋๋ก ์ค๊ณ๋์ง๋ ์์์ต๋๋ค.
- IndexedDB: ๋ ๋ง์ ์์ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๋ ๊ฐ๋ ฅํ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค. ์คํ๋ผ์ธ ๊ธฐ๋ฅ ๋ฐ ๋ณต์กํ ์บ์ฑ ์๋๋ฆฌ์ค์ ์ ํฉํฉ๋๋ค.
experimental_useCache์ ์ค์ ์ฌ์ฉ ์ฌ๋ก
experimental_useCache๊ฐ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ ๋ช ๊ฐ์ง ์ค์ ์๋๋ฆฌ์ค๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ์ ์ ์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ : ํ์ด์ง ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ๊ณ ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ ํ ์์ธ ์ ๋ณด, ์นดํ ๊ณ ๋ฆฌ ๋ชฉ๋ก ๋ฐ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํฉ๋๋ค.
- ์์ ๋ฏธ๋์ด ํ๋ซํผ: ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๊ณ API ํธ์ถ ์๋ฅผ ์ค์ด๊ธฐ ์ํด ์ฌ์ฉ์ ํ๋กํ, ๋ด์ค ํผ๋ ๋ฐ ๋๊ธ ์ค๋ ๋๋ฅผ ์บ์ฑํฉ๋๋ค.
- ์ฝํ ์ธ ๊ด๋ฆฌ ์์คํ (CMS): ์น์ฌ์ดํธ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด ๊ธฐ์ฌ, ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ, ์ด๋ฏธ์ง์ ๊ฐ์ด ์์ฃผ ์ ๊ทผํ๋ ์ฝํ ์ธ ๋ฅผ ์บ์ฑํฉ๋๋ค.
- ๋ฐ์ดํฐ ์๊ฐํ ๋์๋ณด๋: ๋์๋ณด๋์ ์๋ต์ฑ์ ํฅ์์ํค๊ธฐ ์ํด ๋ณต์กํ ๋ฐ์ดํฐ ์ง๊ณ ๋ฐ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํฉ๋๋ค.
์์: ์ฌ์ฉ์ ํ๊ฒฝ์ค์ ์บ์ฑ
์ฌ์ฉ์๊ฐ ํ
๋ง, ์ธ์ด, ์๋ฆผ ์ค์ ๊ณผ ๊ฐ์ ํ๊ฒฝ์ค์ ์ ์ฌ์ฉ์ ์ ์ํ ์ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์๊ฐํด ๋ณด์ธ์. ์ด๋ฌํ ํ๊ฒฝ์ค์ ์ ์๋ฒ์์ ๊ฐ์ ธ์ experimental_useCache๋ฅผ ์ฌ์ฉํ์ฌ ์บ์ํ ์ ์์ต๋๋ค:
import { experimental_useCache as useCache } from 'react';
async function fetchUserPreferences(userId: string): Promise<{
theme: string;
language: string;
notificationsEnabled: boolean;
}> {
// API์์ ์ฌ์ฉ์ ํ๊ฒฝ์ค์ ๊ฐ์ ธ์ค๊ธฐ ์๋ฎฌ๋ ์ด์
await new Promise(resolve => setTimeout(resolve, 200));
return {
theme: 'light',
language: 'en',
notificationsEnabled: true,
};
}
function UserPreferences({ userId }: { userId: string }) {
const preferences = useCache(fetchUserPreferences, userId);
if (!preferences) {
return <p>ํ๊ฒฝ์ค์ ์ ๋ก๋ํ๋ ์ค...</p>;
}
return (
<div>
<h2>์ฌ์ฉ์ ํ๊ฒฝ์ค์ </h2>
<p><strong>ํ
๋ง:</strong> {preferences.theme}</p>
<p><strong>์ธ์ด:</strong> {preferences.language}</p>
<p><strong>์๋ฆผ ํ์ฑํ:</strong> {preferences.notificationsEnabled ? '์' : '์๋์ค'}</p>
</div>
);
}
export default UserPreferences;
์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์์ ํ๊ฒฝ์ค์ ์ด ํ ๋ฒ๋ง ๊ฐ์ ธ์์ง ํ ํ์ ์ ๊ทผ์ ์ํด ์บ์๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์๋ต์ฑ์ด ํฅ์๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ํ๊ฒฝ์ค์ ์ ์ ๋ฐ์ดํธํ๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๊ธฐ ์ํด ์บ์๋ฅผ ๋ฌดํจํํด์ผ ํฉ๋๋ค.
๊ฒฐ๋ก
experimental_useCache๋ React ์ ํ๋ฆฌ์ผ์ด์
, ํนํ React ์๋ฒ ์ปดํฌ๋ํธ์ ํจ๊ป ์์
ํ ๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์บ์ฑ์ ๊ตฌํํ๋ ๊ฐ๋ ฅํ๊ณ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ๊ฐ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์
์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํจ์ผ๋ก์จ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํค๊ณ ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๋ฉฐ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ ์ฌ์ ์ธ ํธ๋ ์ด๋์คํ๋ฅผ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ์ ์ ํ ์บ์ ๋ฌดํจํ ์ ๋ต์ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. experimental_useCache๊ฐ ์ฑ์ํด์ง๊ณ React ์ํ๊ณ์ ์์ ์ ์ธ ๋ถ๋ถ์ด ๋จ์ ๋ฐ๋ผ, ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ ์ต์ ํ์ ์ ์ ๋ ์ค์ํ ์ญํ ์ ํ๊ฒ ๋ ๊ฒ์
๋๋ค. ์ด ํฅ๋ฏธ๋ก์ด ์ ๊ธฐ๋ฅ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ๋ ค๋ฉด ์ต์ React ๋ฌธ์์ ์ปค๋ฎค๋ํฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ์ ํ์ธํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
์ด ํ ์ ์์ง ์คํ์ ๊ธฐ๋ฅ์ ๋๋ค. ์ต์ ์ ๋ณด ๋ฐ API ์ธ๋ถ ์ ๋ณด๋ ํญ์ ๊ณต์ React ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์. ๋ํ, API๋ ์์ ํ๋๊ธฐ ์ ์ ๋ณ๊ฒฝ๋ ์ ์๋ค๋ ์ ์ ์ ์ํ์ธ์.