[Next.js] Next.js์˜ SSG, ISR
728x90

Today, What I learned?

Next.js์—์„œ SSG์™€ ISR ๋ฐฉ์‹์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๊ณ  ๋™์ ์œผ๋กœ ๋ผ์šฐํŒ… ํ•  ์ˆ˜ ์žˆ์„์ง€ ์ •๋ฆฌํ•ด ๋ณธ๋‹ค.
CSR๊ณผ SSR์˜ ๊ฐœ๋…์€ ๊ทธ๋ž˜๋„ ๋“ค์–ด๋ดค์ง€๋งŒ, SSG์™€ ISR์ด๋ผ๋Š” ๊ฐœ๋…์€ ์ฒ˜์Œ ์ ‘ํ–ˆ๋‹ค!..

๋จผ์ € SSG์™€ ISR์— ๋Œ€ํ•ด ์ •๋ฆฝํ•ด ๋‘์–ด์•ผ ํ™•์‹คํ•œ ์ดํ•ด๋ฅผ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

SSG(Static Side Generation)

SSG๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ, ์ •์  ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋นŒ๋“œํ•˜๋Š” ์ˆœ๊ฐ„ ์„œ๋ฒ„์—์„œ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง ํ•œ๋‹ค. ํŽ˜์ด์ง€ ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ ์ด๋ฏธ ๋ Œ๋”๋ง ๋œ ์ •์  ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ํŽ˜์ด์ง€์— ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋“ค์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.

๋ฐ˜๋Œ€๋กœ, ํŽ˜์ด์ง€๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ๋‹ค๋ฉด ๊ทธ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์ด ์žˆ๋‹ค.

getStaticProps()๋ฅผ ์ด์šฉํ•˜์—ฌ SSG๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.


export async function getStaticProps(context) {
  return {
    props: { post: {} },
  }
}

getStaticPaths()๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด ๋‹ค์ด๋‚ด๋ฏน ๋ผ์šฐํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด ํ•จ์ˆ˜๋Š” getStaticProps์™€ ํ•œ ์Œ์œผ๋กœ ์‚ฌ์šฉ์ด ๋˜๋Š”๋ฐ, ๊ฒฐ๊ด๊ฐ’์ด getStaticProps์˜ props๋กœ ์ „๋‹ฌ์ด ๋œ๋‹ค.

export async function getStaticPaths() {
  return {
    paths: [ // ๋™์ ์ธ ํŽ˜์ด์ง€๋“ค
        { params: { id: '1' } }, // ๊ฐ ํŒŒ๋งˆ๋ฆฌํ„ฐ
        { params: { id: '2' } }, 
        { params: { id: '3' } }
        ],
    fallback: false, // ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ
  };
}
  • paths์— ๋ผ์šฐํŒ… ๊ฒฝ๋กœ๋ฅผ ๋ฏธ๋ฆฌ ์ œ๊ณตํ•ด์„œ ์–ด๋–ค ํŽ˜์ด์ง€๋“ค์„ ์ •์ ์œผ๋กœ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ๋‘˜์ง€ ์ •ํ•ด๋‘˜ ์ˆ˜ ์žˆ๋‹ค.
  • fallback ๊ฐ’์— ๋”ฐ๋ผ์„œ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • false : ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€์ผ ๊ฒฝ์šฐ 404 ์—๋Ÿฌ ์ฒ˜๋ฆฌ
    • true : ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€์ผ ๊ฒฝ์šฐ ์ง€์ •ํ•œ fallback ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ , ์ œ๊ณต๋˜์–ด์•ผ ํ•  ํŽ˜์ด์ง€๋ฅผ ์„œ๋ฒ„์—์„œ ์ƒ์„ฑํ•˜์—ฌ ๋ณด์—ฌ์ค€๋‹ค.
    • - ์ œ๊ณต๋˜์ง€ ์•Š๋Š” /55 -> isLoading... -> ์ƒ์„ฑ๋œ /55 ํŽ˜์ด์ง€ ๋กœ๋“œ ์™„๋ฃŒ
    • 'blocking' : ์‘๋‹ต์„ blocking ํ–ˆ๋‹ค๊ฐ€ ์„œ๋ฒ„์—์„œ ์‘๋‹ต์— ๋Œ€ํ•œ ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ๋ณด์—ฌ์ค€๋‹ค. (SSR๊ณผ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋œ๋‹ค!)

 

ISR(Incremental Static Regeneration)

ISR์€ ์ผ์ • ์ฃผ๊ธฐ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ์˜ ์ตœ์‹  ์—ฌ๋ณด๋ฅผ ๊ฒ€์‚ฌํ•ด์„œ ์—…๋ฐ์ดํŠธ๋œ ๋ฐ์ดํ„ฐ๋กœ ๋‹ค์‹œ ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
์ฝ˜ํ…์ธ ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์„ ๋•Œ ์—…๋ฐ์ดํŠธ ๋œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์—†๋‹ค๋Š” SSG์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•œ ์ƒ์„ฑ ๋ฐฉ์‹์ด๋‹ค.

ISR์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ getStatticProps์— revalidate ์†์„ฑ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.
์•„๋ž˜์˜ ๊ฒฝ์šฐ๋Š” static page ์š”์ฒญ 5์ดˆ ํ›„ ๋‹ค์‹œ ํ•œ๋ฒˆ ํŽ˜์ด์ง€๋ฅผ ๋นŒ๋“œํ•œ๋‹ค๋Š” ์–˜๊ธฐ!..

export async function getStaticProps(context) {
  const { id } = context.params;

  const response = await fetch(`http://localhost:3001/posts/${id}`);
  const post = await response.json();

  return {
    props: {
      post,
    },
    revalidate: 5, // 5์ดˆ ํ›„ ๋‹ค์‹œ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜ด
  };
}

ISR๋กœ ์„ค์ •์ด ๋˜์—ˆ๋Š”์ง€๋Š” ๋นŒ๋“œ ์‹œ์—๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

728x90