Next.js์์ ์ ์ ํ์ด์ง(Static Site) ์ ๋์ ํ์ด์ง(Dynamic Site) ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ๋ ๋ฐฉ์์ด ๋ค๋ฆ ๋๋ค. ์ด๋ฅผ ๊ด๋ฆฌํ๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ด Full Route Cache ์ Data Cache ์ ๋๋ค.
์ ์ ์ธ ํ์ด์ง๋ ๋ฏธ๋ฆฌ ์์ฑ๋ HTML๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋น ๋ฅธ ๋ก๋ฉ ์๋๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค. Next.js์์๋ ์ด๋ฅผ Full Route Cache๋ฅผ ์ด์ฉํด ๊ด๋ฆฌํฉ๋๋ค.
fetch ์ต์
์์ "no-store"๊ฐ ์์ด์ผ ํจ."force-cache" ๋ก ์ค์ ๋์ด์ผ ํจ.next ํด๋์ cache/fetch-cache์ API ์๋ต์ด ์ ์ฅ๋จ.revalidate๋ฅผ ํตํด ์บ์๋ฅผ ๊ฐฑ์ ๊ฐ๋ฅ..next/cache/fetch-cache ํด๋์์ API URL์ด ํฌํจ๋ ์บ์ ํ์ผ ํ์ธ.์ ์ ์ธ ํ์ด์ง์์๋ revalidate๋ฅผ ์ฌ์ฉํ๋ฉด ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์
๋ฐ์ดํธ๋ ์ ์์ต๋๋ค.
const res = await fetch("https://api.example.com/products", {
next: { revalidate: 60 }, // 60์ด๋ง๋ค ์บ์ ๊ฐฑ์
});
์ด๋ ๊ฒ ํ๋ฉด 60์ด๋ง๋ค ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ์ฆ, SSG(Static Site Generation)์์๋ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๊ฐ ๊ฐ๋ฅํ๊ฒ ๋๋ ๊ฒ์ด์ฃ !
Next.js์์๋ ๊ฐ์ ์์ฒญ์ ์ฌ๋ฌ ๋ฒ ๋ณด๋ผ ๊ฒฝ์ฐ, ์๋์ผ๋ก ํ๋์ ์์ฒญ์ผ๋ก ํฉ์ณ์ ์ฒ๋ฆฌ(request memoization) ํฉ๋๋ค.
const fetchProducts = async () => {
const res1 = await fetch("https://api.example.com/products");
const res2 = await fetch("https://api.example.com/products");
};
์ ์ฝ๋์ฒ๋ผ ๊ฐ์ URL์ ๋ํด ์ฌ๋ฌ ๋ฒ ์์ฒญํ๋๋ผ๋ ํ ๋ฒ๋ง fetch๊ฐ ์คํ๋๊ณ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๋ถํ์ํ API ํธ์ถ์ ์ค์ด๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค. ๐
๋์ ์ธ ๋ผ์ฐํธ๋ฅผ ์ฌ์ฉํ๋ ํ์ด์ง์์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด generateStaticParams๋ฅผ ํ์ฉํฉ๋๋ค.
export const generateStaticParams = () => {
return [{ id: "1" }, { id: "2" }]; // ๋ฏธ๋ฆฌ ์ ํด์ง ID ๋ชฉ๋ก์ ๋ฐํ
};
์์ฒ๋ผ ํ๋ฉด /product/1, /product/2 ๋ฑ์ ํ์ด์ง๊ฐ ์ ์ ์ผ๋ก ์์ฑ๋ฉ๋๋ค.
๋น๋๊ธฐ ํจ์์์ API ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ ์ ํ์ด์ง๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค.
export const generateStaticParams = async () => {
const res = await fetch("https://api.example.com/products", {
cache: "force-cache",
next: {
tags: ["products"],
},
});
const products = await res.json();
return products.map((product) => ({ id: product.id }));
};
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋์ ๊ฒฝ๋ก๋ผ๋ ๋ฏธ๋ฆฌ ํ์ด์ง๋ฅผ ์์ฑํด ๋์ ์ ์์ด ๋น ๋ฅธ ๋ก๋ฉ ์๋์ SEO ํฅ์์ ๋์์ ์ฑ๊ธธ ์ ์์ต๋๋ค! ๐
| ๋ฐฉ๋ฒ | ์ ์ฉ ๋์ | ํน์ง |
|---|---|---|
| Full Route Cache | ์ ์ ํ์ด์ง | ํ์ด์ง ์ ์ฒด๋ฅผ ์บ์ฑํ์ฌ ๋น ๋ฅด๊ฒ ๋ก๋ฉ |
| Revalidate | ์ ์ ํ์ด์ง | ์ผ์ ์๊ฐ ํ ์๋ก์ด ๋ฐ์ดํฐ๋ก ๊ฐฑ์ ๊ฐ๋ฅ |
| Request Memoization | ๋ชจ๋ ํ์ด์ง | ๋์ผํ ์์ฒญ์ ์๋์ผ๋ก ํฉ์ณ์ API ํธ์ถ ์ต์ ํ |
| generateStaticParams | ๋์ ํ์ด์ง | ๋์ ๊ฒฝ๋ก์์๋ ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ ์ ์ผ๋ก ์์ฑ |
์ ์ ์ธ ๋ฐ์ดํฐ์ ๋์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ํ์ฉํ๋ฉด ์ฑ๋ฅ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ผ ์ ์์ต๋๋ค!
Next.js์ ์บ์ ์ ๋ต์ ์ ํ์ฉํ์ฌ ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด ๋ณด์ธ์! ๐ฅ๐ฅ