Front-end/Next.js

[Next] SSG(Static Site Generation)λž€? πŸš€

xeunnie 2025. 2. 1. 14:00
728x90
λ°˜μ‘ν˜•

SSG(Static Site Generation)λž€?πŸš€ 

Next.jsμ—μ„œ SSG(Static Site Generation, 정적 μ‚¬μ΄νŠΈ 생성)

λΉŒλ“œ μ‹œμ μ— HTML을 μƒμ„±ν•˜μ—¬, μš”μ²­ μ‹œ λΉ λ₯΄κ²Œ μ œκ³΅ν•  수 μžˆλ„λ‘ ν•˜λŠ” λ Œλ”λ§ λ°©μ‹μž…λ‹ˆλ‹€.

 

즉, νŽ˜μ΄μ§€λ₯Ό μ„œλ²„μ—μ„œ 미리 λ Œλ”λ§ν•΄λ†“κ³  정적인 HTML 파일둜 μ €μž₯ν•˜μ—¬, μ‚¬μš©μžκ°€ 접속할 λ•Œ μ¦‰μ‹œ μ œκ³΅ν•˜λŠ” λ°©μ‹μ΄μ—μš”.

 

μ΄λ ‡κ²Œ ν•˜λ©΄ μ‚¬μš©μžμ—κ²Œ λΉ λ₯Έ λ‘œλ”© 속도λ₯Ό μ œκ³΅ν•˜κ³ , 검색 μ—”μ§„ μ΅œμ ν™”(SEO)에도 μœ λ¦¬ν•˜λ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.

πŸ₯Έ SSGλŠ” μ™œ μƒκ²¨λ‚¬μ„κΉŒμš”?

κ³Όκ±°μ—λŠ” 동적 μ½˜ν…μΈ λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄ μ„œλ²„μ‚¬μ΄λ“œ λ Œλ”λ§(SSR)μ΄λ‚˜ ν΄λΌμ΄μ–ΈνŠΈμ‚¬μ΄λ“œ λ Œλ”λ§(CSR) 방식이 주둜 μ‚¬μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 이 방식은 νŽ˜μ΄μ§€ λ‘œλ”© μ‹œκ°„μ΄λ‚˜ μ„œλ²„ λΆ€ν•˜ 문제 λ“±μ—μ„œ ν•œκ³„λ₯Ό λ“œλŸ¬λƒˆμŠ΅λ‹ˆλ‹€.

 

특히, μ‚¬μš©μžκ°€ μ›Ήμ‚¬μ΄νŠΈλ₯Ό λ°©λ¬Έν•  λ•Œλ§ˆλ‹€ 맀번 μ„œλ²„μ—μ„œ μš”μ²­ν•˜κ³  응닡을 λ°›μ•„μ•Ό ν•˜λŠ” 과정이 UX κ²½ν—˜μ— μƒλ‹Ήνžˆ μ•ˆμ’‹μ•˜μ£ .

 

μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ CSRκ³Ό SSRκ³ΌλŠ” λ‹€λ₯΄κ²Œ "κ·Έλƒ₯ 미리 λΉŒλ“œν•΄λ²„λ¦¬μž!"λŠ” ν•„μš”μ—  SSGκ°€ λ“±μž₯ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ΄λŠ” 정적인 νŽ˜μ΄μ§€λ₯Ό 미리 μƒμ„±ν•˜μ—¬ μ‚¬μš©μžκ°€ μš”μ²­ν•  λ•Œ μ¦‰μ‹œ μ œκ³΅ν•¨μœΌλ‘œμ¨ μ„±λŠ₯을 획기적으둜 ν–₯μƒμ‹œμΌ°μŠ΅λ‹ˆλ‹€.


πŸ”₯ SSG(Static Site Generation)의 원리

πŸ“Œ λΉŒλ“œ νƒ€μž„μ— HTML을 생성

  • Next.jsλŠ” getStaticProps(Pages Router) λ˜λŠ” generateStaticParams(App Router)λ₯Ό μ‚¬μš©ν•˜μ—¬ 정적인 데이터λ₯Ό κ°€μ Έμ˜€κ³ , 이λ₯Ό λ°”νƒ•μœΌλ‘œ 미리 HTML을 μƒμ„±ν•©λ‹ˆλ‹€.
  • μƒμ„±λœ HTML은 CDN(μ½˜ν…μΈ  전솑 λ„€νŠΈμ›Œν¬)에 λ°°ν¬λ˜μ–΄ μ΄ˆκ³ μ† λ‘œλ”© 속도λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • λ”°λΌμ„œ, μ„œλ²„ μš”μ²­ 없이 HTMLκ³Ό ν•„μš”ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈλ§Œ λ‘œλ“œν•˜λ©΄ 끝!

πŸ“Œ SSGκ°€ μ ν•©ν•œ 상황

  • βœ”οΈ 변경이 적고, λͺ¨λ“  μ‚¬μš©μžμ—κ²Œ λ™μΌν•œ 데이터λ₯Ό μ œκ³΅ν•˜λŠ” νŽ˜μ΄μ§€
  • βœ”οΈ 검색 μ—”μ§„ μ΅œμ ν™”(SEO)κ°€ μ€‘μš”ν•œ λΈ”λ‘œκ·Έ, λ¬Έμ„œ μ‚¬μ΄νŠΈ, λ§ˆμΌ€νŒ… νŽ˜μ΄μ§€
  • βœ”οΈ μ„œλ²„ λΆ€ν•˜λ₯Ό 쀄이고 싢을 λ•Œ

πŸ“Œ SSG의 μ£Όμš” ν•¨μˆ˜

πŸ“ Pages Routerμ—μ„œ μ‚¬μš©

export async function getStaticProps() {
  const res = await fetch('https://jsonplaceholder.typicode.com/posts');
  const posts = await res.json();

  return {
    props: { posts }, // λΉŒλ“œ νƒ€μž„μ— posts 데이터λ₯Ό κ°€μ Έμ™€μ„œ 정적인 HTML에 μ‚½μž…
  };
}

 

πŸ“ App Routerμ—μ„œ μ‚¬μš©

export async function generateStaticParams() {
  const res = await fetch('https://jsonplaceholder.typicode.com/posts');
  const posts = await res.json();

  return posts.map((post) => ({
    slug: post.id.toString(),
  }));
}

🎯  CSR, SSRκ³Ό 비ꡐ

λ Œλ”λ§ 방식 μ„€λͺ… μš”μ²­ μ‹œ μ„œλ²„ μž‘μ—… 초기 λ‘œλ”© 속도 SEO
CSR (Client-Side Rendering) ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 데이터λ₯Ό 가져와 λ Œλ”λ§ ν•„μš” 느림 SEO에 뢈리
SSR (Server-Side Rendering) μš”μ²­λ§ˆλ‹€ μ„œλ²„μ—μ„œ HTML을 생성 항상 느림 SEO κ°€λŠ₯
SSG (Static Site Generation) λΉŒλ“œ μ‹œ HTML을 μƒμ„±ν•˜μ—¬ 제곡 μ—†μŒ 빠름 SEO κ°€λŠ₯

βœ… CSR(Client-Side Rendering)κ³Ό 차이점

  • CSR은 초기 HTML에 데이터가 μ—†μŒ, λΈŒλΌμš°μ €μ—μ„œ API μš”μ²­ ν›„ 데이터λ₯Ό 가져와 κ·Έλ¦½λ‹ˆλ‹€.
  • μ‚¬μš©μžκ°€ 처음 νŽ˜μ΄μ§€λ₯Ό λ‘œλ“œν•  λ•ŒκΉŒμ§€ 빈 화면이 λ‚˜μ˜¬ 수 있음(Loading UI ν•„μš”)

βœ… SSR(Server-Side Rendering)κ³Ό 차이점

  • SSR은 λ§€ μš”μ²­λ§ˆλ‹€ μ„œλ²„μ—μ„œ HTML을 μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— TTV(Time To View)κ°€ λŠ¦μ„ κ°€λŠ₯성이 있음
  • SSGλŠ” ν•œ 번만 λΉŒλ“œν•˜λ©΄ 끝이라 초기 λ‘œλ”©μ΄ 더 빠름.

πŸ”  SSGμ—μ„œ λΉŒλ“œλ  λ•Œ μƒμ„±λ˜λŠ” 파일

πŸ› οΈ SSG둜 μƒμ„±λœ νŒŒμΌμ„ ν™•μΈν•˜λŠ” 방법

1️⃣ Next.js ν”„λ‘œμ νŠΈλ₯Ό λΉŒλ“œν•©λ‹ˆλ‹€.

npm run build

 

2️⃣ .next/ 폴더λ₯Ό 확인해보면, 정적 HTML 파일이 μƒμ„±λ©λ‹ˆλ‹€.

ls .next/static

 

3️⃣ out/ ν΄λ”μ—μ„œ HTML νŒŒμΌμ„ 확인할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

npm run export  # 정적 μ‚¬μ΄νŠΈλ₯Ό export
ls out/

πŸ—οΈ μƒμ„±λ˜λŠ” μ£Όμš” νŒŒμΌλ“€

πŸ“‚ .next/ λ‚΄λΆ€ ꡬ쑰

.next/
 β”œβ”€β”€ static/             # 정적인 JS, CSS, 이미지 λ“±
 β”œβ”€β”€ server/             # SSR κ΄€λ ¨ 파일
 β”œβ”€β”€ build-manifest.json # λΉŒλ“œλœ λ¦¬μ†ŒμŠ€ λͺ©λ‘
 β”œβ”€β”€ prerender-manifest.json # SSG된 νŽ˜μ΄μ§€ λͺ©λ‘
 └── routes-manifest.json # 경둜 관리

πŸ”₯ Hydration κ³Όμ •μ—μ„œ μ–΄λ–€ 일이 μΌμ–΄λ‚ κΉŒ?

  • HTML은 미리 λ Œλ”λ§λ˜μ–΄ μ œκ³΅λ˜μ§€λ§Œ, Reactκ°€ λΈŒλΌμš°μ €μ—μ„œ 이λ₯Ό ν™œμ„±ν™”(hydrate)ν•˜μ—¬ μƒν˜Έμž‘μš© κ°€λŠ₯ν•˜λ„λ‘ 함
  • λΈŒλΌμš°μ €μ—μ„œ JavaScriptλ₯Ό μ‹€ν–‰ν•˜λ©΄μ„œ 클릭, μž…λ ₯ λ“±μ˜ 이벀트λ₯Ό μ—°κ²°ν•˜λŠ” 과정이 포함됨
  • λ”°λΌμ„œ, Hydration이 μ™„λ£Œλ˜κΈ° μ „κΉŒμ§€λŠ” λ²„νŠΌ 클릭이 μ•ˆ 될 μˆ˜λ„ 있음!

πŸ†  App Router(파일 기반 λΌμš°νŒ…)μ—μ„œ SSG μ‚¬μš© μ‹œ 차이점

πŸ“ Pages Router(getStaticProps) vs. App Router(generateStaticParams)

  Pages Router (getStaticProps) App Router (generateStaticParams)
호좜 μ‹œμ  λΉŒλ“œ νƒ€μž„ λΉŒλ“œ νƒ€μž„
데이터 제곡 방식 props둜 전달 params둜 정적 경둜 생성
닀이내믹 λΌμš°νŒ… 지원 βœ… βœ…
ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­ ν•„μš” μ—¬λΆ€ ❌ ❌

πŸ’‘ κ²°λ‘ 

App RouterλŠ” 경둜λ₯Ό 미리 μƒμ„±ν•˜μ—¬ 정적 HTML둜 μ œκ³΅ν•˜λŠ” λ°©μ‹μ΄μ§€λ§Œ,

Pages Router와 λ‹€λ₯΄κ²Œ generateStaticParams()둜 동적 경둜λ₯Ό μ •μ μœΌλ‘œ μ •μ˜ν•΄μ•Ό ν•œλ‹€λŠ” 차이점이 있음.


βœ…  SSGκ°€ μ ν•©ν•œ 경우 vs SSR이 μ ν•©ν•œ 경우

μš”κ΅¬ 사항 SSG(Static Generation) SSR(Server-Side Rendering)
데이터 λ³€κ²½ λΉˆλ„ 거의 λ³€ν•˜μ§€ μ•ŠμŒ (λΈ”λ‘œκ·Έ, λ¬Έμ„œ) 자주 변경됨 (μ‚¬μš©μž ν”„λ‘œν•„, λŒ€μ‹œλ³΄λ“œ)
SEO μ€‘μš”λ„ 맀우 μ€‘μš” (검색엔진 μ΅œμ ν™”) μ€‘μš”ν•˜μ§€λ§Œ, SSGλ³΄λ‹€λŠ” 느림
첫 νŽ˜μ΄μ§€ λ‘œλ”© 속도 빠름 (정적 HTML 제곡) μƒλŒ€μ μœΌλ‘œ 느림 (μ„œλ²„ λ Œλ”λ§ ν•„μš”)
API μš”μ²­ ν•„μš” μ—¬λΆ€ ❌ (미리 HTML 생성) βœ… (μš”μ²­λ§ˆλ‹€ μƒˆλ‘œμš΄ 데이터)

πŸ’‘ κ²°λ‘ :

  • βœ”οΈ SSGλŠ” 정적인 νŽ˜μ΄μ§€μ— κ°•λ ₯ν•˜μ§€λ§Œ, μ‹€μ‹œκ°„ 데이터가 ν•„μš”ν•œ 경우 SSR λ˜λŠ” CSR을 κ³ λ €ν•΄μ•Ό 함
  • βœ”οΈ 이미지 같은 정적 νŒŒμΌμ„ CDNκ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄ μ„±λŠ₯ μ΅œμ ν™” κ°€λŠ₯
  • βœ”οΈ λ‹€μ΄λ‚˜λ―Ή API 데이터가 λ§Žλ‹€λ©΄ ISR(Incremental Static Regeneration) κ³ λ € κ°€λŠ₯

πŸ”₯ SSG vs. MPA(λ©€ν‹° νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜)

  SSG (Static Site Generation) MPA (Multi-Page Application)
νŽ˜μ΄μ§€ λ‘œλ”© 방식 미리 μƒμ„±λœ 정적 HTML 제곡 μƒˆλ‘œμš΄ νŽ˜μ΄μ§€ μš”μ²­λ§ˆλ‹€ 전체 HTML λ‹€μ‹œ λ‹€μš΄λ‘œλ“œ
SEO βœ… 맀우 유리 (HTML이 미리 생성됨) βœ… μœ λ¦¬ν•˜μ§€λ§Œ, μ„œλ²„ λ Œλ”λ§μ΄ ν•„μš”
속도 βœ… 졜초 λ‘œλ”© 빠름 ❌ λ„€νŠΈμ›Œν¬ μš”μ²­ 많으면 느렀질 수 있음
μ„œλ²„ λΆ€ν•˜ βœ… μ„œλ²„ μš”μ²­μ΄ 거의 μ—†μŒ ❌ λ§€ νŽ˜μ΄μ§€λ§ˆλ‹€ μ„œλ²„μ— μš”μ²­
UX βœ… λΆ€λ“œλŸ¬μš΄ μ „ν™˜ (ν΄λΌμ΄μ–ΈνŠΈ λ‚΄λΉ„κ²Œμ΄μ…˜) ❌ μƒˆλ‘œκ³ μΉ¨μ΄ λ°œμƒν•˜μ—¬ UXκ°€ 덜 λΆ€λ“œλŸ¬μ›€
μ‚¬μš© 사둀 βœ… λΈ”λ‘œκ·Έ, λ¬Έμ„œ μ‚¬μ΄νŠΈ, 정적 μ½˜ν…μΈ  βœ… κ΄€λ¦¬μž νŽ˜μ΄μ§€, 포털 μ‚¬μ΄νŠΈ, 검색 기반 μ„œλΉ„μŠ€

βœ… MPAλŠ” μ–΄λ–€ κ²½μš°μ— 더 μœ λ¦¬ν• κΉŒ?

  • 검색 기반 μ›Ή μ„œλΉ„μŠ€: 검색 엔진이 맀번 μƒˆλ‘œμš΄ 데이터λ₯Ό 가져와야 ν•  λ•Œ
  • λŒ€ν˜• μ‚¬μ΄νŠΈ/포털: λ„€λΉ„κ²Œμ΄μ…˜μ΄ μ€‘μš”ν•˜κ³ , νŽ˜μ΄μ§€ κ°„ μƒνƒœ κ³΅μœ κ°€ 적을 λ•Œ
  • λ³΄μ•ˆμ΄ μ€‘μš”ν•œ μ„œλΉ„μŠ€: λ§€ μš”μ²­λ§ˆλ‹€ μƒˆλ‘œμš΄ HTML을 λΆˆλŸ¬μ˜€λŠ” 것이 λ³΄μ•ˆμ— 유리

πŸ’‘ κ²°λ‘ 

MPAλŠ” λ§€ μš”μ²­λ§ˆλ‹€ 전체 HTML을 λ‹€μ‹œ λ°›μ•„μ˜€κΈ° λ•Œλ¬Έμ— UXκ°€ λ‹€μ†Œ λ–¨μ–΄μ§ˆ 수 μžˆμ§€λ§Œ,

μ„œλ²„ 쀑심 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μ—¬μ „νžˆ κ°•λ ₯ν•œ μ„ νƒμ§€μ˜ˆμš”.


🧐 SSGκ°€ 항상 졜고의 μ„ νƒμΌκΉŒ?

SSGλŠ” 속도와 SEO μΈ‘λ©΄μ—μ„œ κ°•λ ₯ν•˜μ§€λ§Œ, λͺ¨λ“  μƒν™©μ—μ„œ μ΅œμ„ μ€ μ•„λ‹ˆμ—μš”. μ•„λž˜μ™€ 같은 ν•œκ³„μ μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€.

 

❌ (1) 데이터가 자주 λ³€κ²½λ˜λ©΄ μ ν•©ν•˜μ§€ μ•ŠμŒ

  • SSGλŠ” λΉŒλ“œ μ‹œ 데이터λ₯Ό κ³ μ •ν•˜κΈ° λ•Œλ¬Έμ—, 자주 λ³€ν•˜λŠ” λ°μ΄ν„°μ—λŠ” μ ν•©ν•˜μ§€ μ•ŠμŒ
  • 예λ₯Ό λ“€μ–΄, μ‹€μ‹œκ°„ λ‰΄μŠ€, 주식 가격, μ‚¬μš©μž ν”„λ‘œν•„ νŽ˜μ΄μ§€μ™€ 같이 자주 μ—…λ°μ΄νŠΈλ˜λŠ” λ°μ΄ν„°λŠ” SSGκ°€ λΉ„νš¨μœ¨μ μΌ 수 μžˆμ–΄μš”.

βœ… ν•΄κ²° 방법: ISR(Incremental Static Regeneration) μ‚¬μš©ν•˜κΈ°

Next.js의 ISR(증뢄 정적 생성)을 ν™œμš©ν•˜λ©΄, νŠΉμ • 주기둜 정적 νŽ˜μ΄μ§€λ₯Ό λ‹€μ‹œ 생성할 수 μžˆμ–΄μš”.

export async function getStaticProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return {
    props: { data },
    revalidate: 60, // 60μ΄ˆλ§ˆλ‹€ νŽ˜μ΄μ§€ μž¬μƒμ„±
  };
}

 

πŸ‘‰ μ΄λ ‡κ²Œ ν•˜λ©΄ 정적 νŽ˜μ΄μ§€μ˜ μ„±λŠ₯을 μœ μ§€ν•˜λ©΄μ„œλ„ μ΅œμ‹  데이터 반영 κ°€λŠ₯! 🎯

 

❌ (2) λΉŒλ“œ μ‹œκ°„μ΄ 였래 걸릴 수 있음

  • νŽ˜μ΄μ§€κ°€ λ§Žμ„μˆ˜λ‘ λΉŒλ“œ μ‹œκ°„μ΄ 길어짐
  • 예λ₯Ό λ“€μ–΄, 수천 개의 λΈ”λ‘œκ·Έ 글을 SSG둜 μƒμ„±ν•˜λ©΄ λΉŒλ“œ μ‹œκ°„μ΄ μˆ˜μ‹­ λΆ„ 이상 μ†Œμš”λ  μˆ˜λ„ 있음

βœ… ν•΄κ²° 방법: 동적 경둜 μ œν•œ 및 ISR 적용

  • generateStaticParams() λ˜λŠ” getStaticProps()μ—μ„œ ν•„μš”ν•œ λ°μ΄ν„°λ§Œ 사전 μƒμ„±ν•˜κ³ , λ‚˜λ¨Έμ§€λŠ” 동적 μš”μ²­μœΌλ‘œ 처리
  • ISR을 ν™œμš©ν•˜μ—¬ 일뢀 νŽ˜μ΄μ§€λŠ” 정적 생성 ν›„ μ μ§„μ μœΌλ‘œ μ—…λ°μ΄νŠΈ

 

❌ (3) μ‚¬μš©μžλ³„ 데이터가 ν•„μš”ν•œ 경우 어렀움

  • SSGλŠ” ν•œ 번 μƒμ„±λ˜λ©΄ λͺ¨λ“  μ‚¬μš©μžμ—κ²Œ λ™μΌν•œ HTML을 제곡
  • ν•˜μ§€λ§Œ λ‘œκ·ΈμΈν•œ μ‚¬μš©μžλ§ˆλ‹€ λ‹€λ₯Έ 데이터λ₯Ό μ œκ³΅ν•΄μ•Ό ν•˜λŠ” 경우 SSGλŠ” μ ν•©ν•˜μ§€ μ•ŠμŒ
  • 예λ₯Ό λ“€μ–΄, μ‡Όν•‘λͺ°μ˜ λ§ˆμ΄νŽ˜μ΄μ§€, λŒ€μ‹œλ³΄λ“œ, μ‚¬μš©μž 맞좀 μ½˜ν…μΈ  λ“±

βœ… ν•΄κ²° 방법:

1️⃣ SSG + ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ 데이터 패칭(CSR) μ‘°ν•©

function UserProfile() {
  const [user, setUser] = useState(null);

  useEffect(() => {
    fetch('/api/user')
      .then((res) => res.json())
      .then((data) => setUser(data));
  }, []);

  if (!user) return <p>Loading...</p>;

  return <p>Welcome, {user.name}!</p>;
}

 

2️⃣ SSR(Server-Side Rendering)둜 νŠΉμ • νŽ˜μ΄μ§€λ§Œ μ„œλ²„μ—μ„œ λ Œλ”λ§

export async function getServerSideProps(context) {
  const res = await fetch(`https://api.example.com/user/${context.params.id}`);
  const user = await res.json();

  return { props: { user } };
}

 

πŸ‘‰ κ²°λ‘ : SSG + CSR + ISR + SSR을 적절히 μ‘°ν•©ν•˜λ©΄ 문제 ν•΄κ²° κ°€λŠ₯! πŸ”₯


🎯  SSGκ°€ 빛을 λ°œν•˜λŠ” 경우 vs. λ‹€λ₯Έ μ „λž΅μ΄ ν•„μš”ν•œ 경우

상황 SSG μ‚¬μš© κ°€λŠ₯? λŒ€μ•ˆ
βœ… 정적인 μ½˜ν…μΈ  (λΈ”λ‘œκ·Έ, λ¬Έμ„œ) SSG  
❌ μ‹€μ‹œκ°„ 데이터 (λ‰΄μŠ€, 주식) ISR / CSR / SSR revalidate μ‚¬μš©
❌ μ‚¬μš©μžλ³„ 맞좀 데이터 (λŒ€μ‹œλ³΄λ“œ) SSR / CSR getServerSideProps λ˜λŠ” API μš”μ²­
❌ 맀우 λ§Žμ€ νŽ˜μ΄μ§€ (100,000+ νŽ˜μ΄μ§€) SSG + ISR generateStaticParams둜 μ œν•œ
βœ… SEOκ°€ μ€‘μš”ν•œ νŽ˜μ΄μ§€ SSG / SSR  
βœ… 속도가 μ€‘μš”ν•œ λžœλ”© νŽ˜μ΄μ§€ SSG  

πŸš€ 마무리

πŸ’‘ SSGλŠ” λΉ λ₯΄κ³  SEO μ΅œμ ν™”μ— μœ λ¦¬ν•˜μ§€λ§Œ, 항상 정닡은 μ•„λ‹ˆλ‹€!

πŸ’‘ 자주 λ³€ν•˜λŠ” 데이터, μ‚¬μš©μžλ³„ μ½˜ν…μΈ κ°€ μžˆλ‹€λ©΄ ISR/SSR/CSR을 μ‘°ν•©ν•˜λŠ” 것이 ν•„μš”ν•˜λ‹€.

 

πŸ“Œ μ •λ¦¬ν•˜λ©΄:

βœ… 변경이 거의 μ—†λŠ” νŽ˜μ΄μ§€λŠ” SSGκ°€ 졜고

βœ… 데이터가 가끔 λ³€ν•œλ‹€λ©΄ ISR(Incremental Static Regeneration) μ‚¬μš©

βœ… μ‚¬μš©μžλ³„ 데이터가 ν•„μš”ν•˜λ©΄ SSR λ˜λŠ” CSR ν™œμš©

 

πŸŒ·μ „μ„€μ˜ κ°œλ°œμžκ°€ λ˜μ–΄λ΄…μ‹œλ‹Ή! 🌷

728x90
λ°˜μ‘ν˜•