๐Ÿ“Œ Next.js Cache - Full Route Cache & Data Cache

๋ฐ•์• ๋ฆฌยท2025๋…„ 3์›” 19์ผ

Next.js์—์„œ ์ •์  ํŽ˜์ด์ง€(Static Site) ์™€ ๋™์  ํŽ˜์ด์ง€(Dynamic Site) ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์ด Full Route Cache ์™€ Data Cache ์ž…๋‹ˆ๋‹ค.

๐Ÿš€ 1. Full Route Cache (์ •์  ์‚ฌ์ดํŠธ)

์ •์ ์ธ ํŽ˜์ด์ง€๋Š” ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋œ HTML๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ๋กœ๋”ฉ ์†๋„๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Next.js์—์„œ๋Š” ์ด๋ฅผ Full Route Cache๋ฅผ ์ด์šฉํ•ด ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

โœ… Full Route Cache ์‚ฌ์šฉ ์กฐ๊ฑด

  • fetch ์˜ต์…˜์—์„œ "no-store"๊ฐ€ ์—†์–ด์•ผ ํ•จ.
  • ์˜ต์…˜์ด ์•„์˜ˆ ์—†๊ฑฐ๋‚˜ "force-cache" ๋กœ ์„ค์ •๋˜์–ด์•ผ ํ•จ.
  • next ํด๋”์˜ cache/fetch-cache์— API ์‘๋‹ต์ด ์ €์žฅ๋จ.
  • revalidate๋ฅผ ํ†ตํ•ด ์บ์‹œ๋ฅผ ๊ฐฑ์‹  ๊ฐ€๋Šฅ.

๐Ÿ” ํ™•์ธ ๋ฐฉ๋ฒ•

  1. ์„œ๋ฒ„ ์‹คํ–‰ ํ›„ ํ„ฐ๋ฏธ๋„์—์„œ ์ •์  ๊ฒฝ๋กœ(Static Route) ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋™๊ทธ๋ผ๋ฏธ(โšช)๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ.
  2. .next/cache/fetch-cache ํด๋”์—์„œ API URL์ด ํฌํ•จ๋œ ์บ์‹œ ํŒŒ์ผ ํ™•์ธ.
  3. ๋„คํŠธ์›Œํฌ ํƒญ์—์„œ ๋น ๋ฅธ ์‘๋‹ต ์†๋„ ํ™•์ธ (์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ์บ์‹œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ).

๐Ÿ”„ 2. Revalidate๋ฅผ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ๊ฐฑ์‹  (์ •์  ์‚ฌ์ดํŠธ)

์ •์ ์ธ ํŽ˜์ด์ง€์—์„œ๋„ revalidate๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const res = await fetch("https://api.example.com/products", {
  next: { revalidate: 60 }, // 60์ดˆ๋งˆ๋‹ค ์บ์‹œ ๊ฐฑ์‹ 
});

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 60์ดˆ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, SSG(Static Site Generation)์—์„œ๋„ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ !


โšก 3. Request Memoization (์š”์ฒญ ์ตœ์ ํ™”)

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 ํ˜ธ์ถœ์„ ์ค„์ด๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Š


๐Ÿ›  4. ๋™์  ํŽ˜์ด์ง€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•

๋™์ ์ธ ๋ผ์šฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽ˜์ด์ง€์—์„œ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด 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 }));
};

โœ… ํŠน์ง•

  • ๋ผ์šฐํŠธ๋Š” ๋™์ ์ด์ง€๋งŒ ๋ฐ์ดํ„ฐ๋Š” ์ •์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•
  • ๋ฏธ๋ฆฌ ์ •์˜๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ •์ ์œผ๋กœ ์ƒ์„ฑ๋จ
  • API ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ SSG ๊ฐ€๋Šฅ

์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋™์  ๊ฒฝ๋กœ๋ผ๋„ ๋ฏธ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•ด ๋†“์„ ์ˆ˜ ์žˆ์–ด ๋น ๋ฅธ ๋กœ๋”ฉ ์†๋„์™€ SEO ํ–ฅ์ƒ์„ ๋™์‹œ์— ์ฑ™๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿš€


๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌ

๋ฐฉ๋ฒ•์ ์šฉ ๋Œ€์ƒํŠน์ง•
Full Route Cache์ •์  ํŽ˜์ด์ง€ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ์บ์‹ฑํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ๋กœ๋”ฉ
Revalidate์ •์  ํŽ˜์ด์ง€์ผ์ • ์‹œ๊ฐ„ ํ›„ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋กœ ๊ฐฑ์‹  ๊ฐ€๋Šฅ
Request Memoization๋ชจ๋“  ํŽ˜์ด์ง€๋™์ผํ•œ ์š”์ฒญ์„ ์ž๋™์œผ๋กœ ํ•ฉ์ณ์„œ API ํ˜ธ์ถœ ์ตœ์ ํ™”
generateStaticParams๋™์  ํŽ˜์ด์ง€๋™์  ๊ฒฝ๋กœ์—์„œ๋„ ๋ฏธ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์ •์ ์œผ๋กœ ์ƒ์„ฑ

์ •์ ์ธ ๋ฐ์ดํ„ฐ์™€ ๋™์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

Next.js์˜ ์บ์‹œ ์ „๋žต์„ ์ž˜ ํ™œ์šฉํ•˜์—ฌ ๋” ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”! ๐Ÿ”ฅ๐Ÿ”ฅ

0๊ฐœ์˜ ๋Œ“๊ธ€