πŸ“” Studying/πŸ’Œ TIL

[Next.js] Next.js의 SSG, ISR

sero. 2023. 2. 1. 21:58
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