๐Ÿธminzzi
Minzzi์•ผ
๐Ÿธminzzi
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (131)
    • ์˜ค๋ฅ˜ํ•ด๊ฒฐ (14)
    • FE (36)
      • Next.js (17)
      • React (4)
      • React Native (0)
      • TypeScript (1)
      • JavaScript (14)
    • BE (0)
      • Nest.js (0)
    • ๋ฐ๋ธŒ์ฝ”์Šค (7)
    • ์›น ํ”„๋กœ์ ํŠธ (5)
    • CS (28)
      • Algorithm (5)
      • Python (4)
      • C++ (2)
      • Operating System (4)
      • Computer Networking (3)
      • Data Structure (1)
      • Machine Learning (3)
      • Tip (6)
    • Github (4)
    • Flutter (3)
      • ํ”„๋กœ์ ํŠธ (3)
    • Private (27)
      • ํšŒ๊ณ  (7)
      • ๋ฉด์ ‘ (17)
    • ๊ฐœ๋ฐœ๋„์„œ (6)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ์ด๋ฒคํŠธ๋ฃจํ”„
  • react
  • reflow
  • ์ด๋ฏธ์ง€ ์ตœ์ ํ™”
  • ์‹คํ–‰์ปจํƒ์ŠคํŠธ
  • next.js
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
  • ๋ชจ๋˜๋ฆฌ์•กํŠธ๋”ฅ๋‹ค์ด๋ธŒ
  • ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€
  • ์˜ค๋ธ”์™„
  • ์›์‹œํƒ€์ž…
  • ๋ฉด์ ‘
  • SSR
  • ์ฝœ์Šคํƒ
  • ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
  • ๋ ‰์‹œ์ปฌ
  • ์‹คํ–‰์ปจํ…์ŠคํŠธ
  • ํž™์˜์—ญ
  • ํ˜ธ์ด์ŠคํŒ…
  • layout shift

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
๐Ÿธminzzi

Minzzi์•ผ

[Next.js] Page Router - ISR
FE/Next.js

[Next.js] Page Router - ISR

2025. 5. 6. 14:39
ํ•œ ์ž… ํฌ๊ธฐ๋กœ ์ž˜๋ผ๋จน๋Š” Next.js ํ•™์Šต์ •๋ฆฌ์šฉ์ž…๋‹ˆ๋‹ค. 
2.17) ISR 1. ์†Œ๊ฐœ ๋ฐ ์‹ค์Šต
2.18) ISR 2. ์ฃผ๋ฌธํ˜• ์žฌ ๊ฒ€์ฆ

2.17 ISR 1. ์†Œ๊ฐœ ๋ฐ ์‹ค์Šต

ISR์ด๋ž€?

ISR (Incremental Static Regeneration : ์ฆ๋ถ„ ์ •์  ์žฌ์ƒ์„ฑ)

SSG ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ ์ •์  ํŽ˜์ด์ง€๋ฅผ ์ผ์ • ์‹œ๊ฐ„์„ ์ฃผ๊ธฐ๋กœ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ์ˆ 

 

๊ธฐ์กด SSG ๋ฐฉ์‹์—์„œ๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•œ ํŽ˜์ด์ง€๊ฐ€ ์ด ์‹œ๊ฐ„ ์ดํ›„์—๋Š” ๋‹ค์‹œ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ์š”์ฒญํ•ด๋„ ๋™์ผํ•œ ํŽ˜์ด์ง€๋งŒ ๊ณ„์† ๋ฐ˜ํ™˜๋˜์—ˆ๋Š”๋ฐ, ISR ๋ฐฉ์‹์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ์ƒˆ๋กœ์šด ์š”์ฒญ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

ISR์˜ ์žฅ์ 

1. ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋‘” ์ •์ ํŽ˜์ด์ง€๋ฅผ ์‘๋‹ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋น ๋ฅธ ์†๋„๋กœ ๋™์ž‘ํ•œ๋‹ค. (SSG์˜ ์žฅ์ )

2. ํŠน์ • ์‹œ๊ฐ„์„ ์ฃผ๊ธฐ๋กœ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•ด์„œ ์ตœ์‹  ๋ฐ์ดํ„ฐ๊นŒ์ง€ ํ•จ๊ป˜ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. (SSR์˜ ์žฅ์ )

 

ISR ์„ค์ • ๋ฐฉ๋ฒ•

export const getStaticProps = async () => {
  console.log("์ธ๋ฑ์Šค ํŽ˜์ด์ง€");
  const [allBooks, recoBooks] = await Promise.all([
    fetchBooks(),
    fetchRandomBooks(),
  ]);

  return {
    props: { allBooks, recoBooks },
    revalidate: 3, // ์ถ”๊ฐ€๋œ ๋ถ€๋ถ„ (์ดˆ ์„ค์ •)
  };
};

์ ์šฉ๋œ ํŽ˜์ด์ง€

์ ์šฉํ•œ ํŽ˜์ด์ง€๋Š” index ํŽ˜์ด์ง€ ์ธ๋ฐ ์—ฌ๊ธฐ์—์„œ '์ง€๊ธˆ ์ถ”์ฒœํ•˜๋Š” ๋„์„œ' ๋ถ€๋ถ„์€ ๋žœ๋คํ•˜๊ฒŒ 3๊ฐœ์˜ ๋„์„œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํŽ˜์ด์ง€์ด๋‹ค.

ISR์„ ์ ์šฉํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋นŒ๋“œํƒ€์ž„์—์„œ ์ƒ์„ฑ๋œ ํŽ˜์ด์ง€๋งŒ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด๋„ ๋™์ผํ•œ ํ™”๋ฉด์ด ๋ณด์˜€๋Š”๋ฐ,

ISR์„ ์ ์šฉํ•œ ์ดํ›„์—๋Š” ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๊ฐ€ ์ ์šฉ๋˜์–ด ๋‹ค๋ฅธ ์ถ”์ฒœ ๋„์„œ๋“ค์ด ๋œจ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

๊ฐ•์˜์—์„œ๋Š” 3์ดˆ์˜ revalidate๋ฅผ ์„ค์ •ํ–ˆ์ง€๋งŒ, ํŽ˜์ด์ง€ ์ƒ์„ฑ์˜ ์ฃผ๊ธฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ 60์ดˆ๋กœ ์„ค์ •ํ•˜๊ณ  ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•ด๋ดค๋‹ค. 60์ดˆ๊ฐ€ ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์ƒˆ๋กœ๊ณ ์นจํ•ด๋„ ๋นŒ๋“œํƒ€์ž„์— ์ƒ์„ฑ๋œ ํŽ˜์ด์ง€๊ฐ€ ๋ฐ˜ํ™˜๋˜์—ˆ์ง€๋งŒ, 60์ดˆ๊ฐ€ ์ง€๋‚˜๊ณ  60์ดˆ ์ฃผ๊ธฐ๋กœ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๊ฐ€ ์žฌ์ƒ์„ฑ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


2.18 ISR 2. ์ฃผ๋ฌธํ˜• ์žฌ ๊ฒ€์ฆ

ISR ๋ฐฉ์‹์„ ์ ์šฉํ•˜๊ธฐ ์–ด๋ ค์šด ์ผ€์ด์Šค

 

์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ํŽ˜์ด์ง€

 

์˜ˆ์‹œ 1. revalidate๋ฅผ 60๋ถ„์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ํŽ˜์ด์ง€์—์„œ ์œ ์ €๊ฐ€ 60๋ถ„์ด ๋˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ, ์•„์ง ์žฌ์ƒ์„ฑ๋˜๋Š” ์‹œ๊ฐ„์ธ 60๋ถ„์ด ๋˜๊ธฐ ์ „์ด๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •ํ•œ ๋‚ด์šฉ์„ ํŽ˜์ด์ง€์— ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๋‹ค.

 

์˜ˆ์‹œ 2. revalidate๋ฅผ 60์ดˆ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ํŽ˜์ด์ง€์—์„œ ์œ ์ €๊ฐ€ ํ•˜๋ฃจ ๋’ค์— ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด, ์ˆ˜์ •๋œ ๋‚ด์šฉ์ด ์—†๋Š”๋ฐ๋„ ํŽ˜์ด์ง€๋Š” 60์ดˆ๋งˆ๋‹ค ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฌ์ƒ์„ฑ๋œ๋‹ค.

 

On-Demand ISR

์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๋Š” ISR

On-Demand ISR์„ ํ™•์šฉํ•˜๋ฉด ์‹œ๊ฐ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ถˆํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๋„ˆ๋ฌด ๋Šฆ๊ฒŒ ํŽ˜์ด์ง€๋ฅผ ์žฌ์ƒ์„ฑํ•˜๋Š” ์ผ€์ด์Šค๋“ค์€ ์ œ๊ฑฐ๋˜๊ณ  ์‹ค์ œ๋กœ ์œ ์ €๊ฐ€ ๊ฒŒ์‹œ๊ธ€์„ ์ˆ˜์ •ํ•ด์„œ ํŽ˜์ด์ง€์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•ด์กŒ์„ ๋•Œ revalidate ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ํŽ˜์ด์ง€๋ฅผ ์žฌ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฆ‰, ํŽ˜์ด์ง€์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง์ ‘ ํŠธ๋ฆฌ๊ฑฐ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

 

revalidate trigger API

๊ธฐ์กด์˜ index์— ์ ์šฉํ–ˆ๋˜ revalidate๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ์•„๋ž˜ API๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์จ On-Demand ISR์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

import { NextApiRequest, NextApiResponse } from "next";

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  try {
    await res.revalidate("/");
    return res.json({ revalidated: true });
  } catch {
    res.status(500).send("Revalidation failed");
  }
}

 

๋นŒ๋“œํ•˜๊ณ  ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜๊ณ  ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด๋„ ๋นŒ๋“œํƒ€์ž„์— ๋งŒ๋“ค์–ด์ง„ ํŽ˜์ด์ง€๊ฐ€ ๋™์ผํ•˜๊ฒŒ ๋ณด์ธ๋‹ค.

localhost:3000/api/revalidate ๋กœ api ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๋‹ค์‹œ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ์ƒˆ๋กœ์šด ์ถ”์ฒœ๋„์„œ๊ฐ€ ๋ณด์ด๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'FE > Next.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Next.js] App Router - ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…  (0) 2025.05.06
[Next.js] Page Router ์žฅ๋‹จ์   (0) 2025.05.06
[Next.js] page router - SSG(์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ)  (1) 2025.05.06
[Next.js] page router - SSR  (3) 2025.05.05
[Next.js] page router ์‚ฌ์ „ ๋ Œ๋”๋ง๊ณผ ๋ฐ์ดํ„ฐํŽ˜์นญ  (0) 2025.05.05
    'FE/Next.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Next.js] App Router - ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…
    • [Next.js] Page Router ์žฅ๋‹จ์ 
    • [Next.js] page router - SSG(์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ)
    • [Next.js] page router - SSR
    ๐Ÿธminzzi
    ๐Ÿธminzzi

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”