ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

Language/Next

[/\/] SSG, ISR, SSR, CSR

์ฑ„._. 2025. 3. 10. 23:26

์šฐ๋ฆฌ๊ฐ€ ํ‰์†Œ์— ์“ฐ๋Š” ๊ฐœ๋ฐœ ๋ชจ๋“œ๋Š” yarn dev๋ฅผ ํ–ˆ์„ ๋•Œ, ๋ธŒ๋ผ์šฐ์ €์˜ ‘๊ฐœ๋ฐœ์ž๋„๊ตฌ’์—์„œ ์ฝ˜์†”์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

yarn build๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ์‹ค์ œ ๋ฐฐํฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋‹ค

๋”ฐ๋ผ์„œ (ํŠนํžˆ react)๋Š” ๊ฐœ๋ฐœ์ž๋„๊ตฌ์—์„œ ๋ณด๋˜ ํƒœ๊ทธ๋‚˜ ๋‹ค๋ฅธ ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ ์ผ๊ทธ๋Ÿฌ์ง„ ํ˜•ํƒœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

react๋Š” html์š”์†Œ๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋ฉฐ JS๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์— ๊ทธ๋ ค๋‚ด๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

build๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ๋นŒ๋“œ ์‹œ์ ์—์„œ์˜ ๋กœ์ง์ด ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

 

 

SSG (Static Site Generation)

SSG๋Š” ์ตœ์ดˆ ๋นŒ๋“œ ์‹œ์˜ ์ƒํƒœ๋ฅผ ์บ์‹ฑํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ๊ณ ์ •๋œ HTML์„ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•˜๊ณ  ํ™”๋ฉด์— ๋ฟŒ๋ ค์ค€๋‹ค.

์ด๋ฏธ ์„œ๋ฒ„ ์ธก์—์„œ HTML์„ ๋นŒ๋“œํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์—๊ฒŒ ์ •๋ง ๋น ๋ฅด๊ฒŒ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

  • ์žฅ์ 
    • TTV*๊ฐ€ ๋งค์šฐ ์งง๋‹ค.
    • SEO*์— ์œ ๋ฆฌํ•˜๋‹ค.
    • CDN* ์บ์‹ฑ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋‹จ์ 
    • ์ •์ ์ธ ๋ฐ์ดํ„ฐ์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง๋ณด๋‹ค ์ƒํ˜ธ์ž‘์šฉ์ด ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค.
    • html ์š”์†Œ๊ฐ€ ๋งŽ๋‹ค๋ฉด ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ํด ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์ฝ”๋“œ
import React from 'react';

function HomePage({ data }) {
  return <div>{data}</div>;
}

export async function getStaticProps() {
  const res = await fetch('https://...'); // ์™ธ๋ถ€ API ํ˜ธ์ถœ
  const data = await res.json();

  return { props: { data } };
}

export default HomePage;
๋”๋ณด๊ธฐ

* TTV : ํ™”๋ฉด์— html ์š”์†Œ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„(๋ฒ„ํŠผ์€ ๋‚˜ํƒ€๋‚˜์ง€๋งŒ ๋™์ž‘ X) 

* SEO : ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”, ์›น ํŽ˜์ด์ง€ ๊ฒ€์ƒ‰์—”์ง„์ด ์ž๋ฃŒ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ์ƒ์œ„ ๋…ธ์ถœ์ด ๋˜๊ฒŒ ํ•œ๋‹ค.

              SSG์˜ ๊ฒฝ์šฐ์—๋Š”  html ์š”์†Œ๋ฅผ ๊ทธ๋Œ€๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์–ด ์œ ๋ฆฌํ•˜๋‹ค.

* CDN : Content Delivery Network, ์ฝ˜ํ…์ธ  ์ „์†ก ๋„คํŠธ์›Œํฌ ๋˜๋Š” ์ฝ˜ํ…์ธ  ๋ฐฐํฌ ๋„คํŠธ์›Œํฌ๋กœ ์ „ ์„ธ๊ณ„์— ๋ถ„์‚ฐ๋œ ์„œ๋ฒ„๋ฅผ ๋„คํŠธ์›Œํฌ๋กœ ์—ฐ๊ฒฐํ•œ ๊ธฐ์ˆ 

 

 

 

ISR (Incremental Static Regeneration)

SSG์ฒ˜๋Ÿผ ์ดˆ๊ธฐ์— ๋นŒ๋“œ ๋œ ์ •์ ์ธ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋‹ค๋งŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ค์ •ํ•œ ์‹œ๊ฐ„์ด ์ง€๋‚  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด HTML์„ ๋ฐ˜์˜ํ•œ๋‹ค.

์ •ํ•ด์ง„ ์‹œ๊ฐ„๊ณผ ์‹œ๊ฐ„ ์‚ฌ์ด์— ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ์žˆ์„ ๋•Œ์—๋Š” ์ด์ „ revalidate์—์„œ ์ƒ์„ฑํ•œ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜์˜

=> revalidate ์‹œ๊ฐ„์—๋งŒ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ

 

์ตœ์ดˆ ์ „์ฒด ์‚ฌ์ดํŠธ ๋นŒ๋“œ๐Ÿ‘‰๐Ÿป์บ์‹ฑ๐Ÿ‘‰๐Ÿป์ •ํ•ด์ง„ ์‹œ๊ฐ„ ๋งˆ๋‹ค ์บ์‹ฑ ๋ฐ์ดํ„ฐ์™€ ๋น„๊ตํ•ด์„œ ๋ณ€๊ฒฝ๋œ ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋นŒ๋“œ๐Ÿ‘‰๐Ÿป์บ์‹ฑ๐Ÿ‘‰๐Ÿปํด๋ผ์ด์–ธํŠธ ์ „๋‹ฌ ๐Ÿ‘‰๐ŸปํŽ˜์ด์ง€ ๋ฐ˜์˜

 

Next๋Š” revalidate Time์„ ์žฌ๊ณ  ์žˆ์ง€ ์•Š๊ณ , ์‚ฌ์šฉ์ž ์š”์ฒญ ์‹œ ์ฒ˜์Œ ์ƒ์„ฑ ์‹œ๊ฐ„๊ณผ ๋น„๊ตํ•œ๋‹ค.

๋งŒ์•ฝ, 1์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ ์š”์ฒญ์ด ์—†์œผ๋ฉด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์•ˆ ๊ฐ€์ ธ์˜ด => ํšจ์œจ์ 

์š”์ฒญ ์‹œ์—๋Š” ๋ฌด์กฐ๊ฑด data sourse๊นŒ์ง€ ๊ฐ€์„œ ๊ฐ€์ ธ์˜ด(์„œ๋ฒ„์— ๋”œ๋ ˆ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ์ ์šฉ๋จ)

์˜ˆ์‹œ
10๋ถ„ ๋‹จ์œ„,
11์‹œ 9๋ถ„ -> ๊ธฐ์กด HTML
11tl 11๋ถ„ -> ๊ธฐ์กด HTML / ๋’ค์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๋Š” ์ค‘ / ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๊ฐˆ์•„๋ผ์›Œ ์คŒ

 

  • ์žฅ์ 
    • ์ •์ ์ธ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์ข‹๋‹ค.
    • ์ฝ˜ํ…์ธ ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์„œ๋ฒ„์—์„œ ํŽ˜์ด์ง€๋ฅผ ์žฌ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์ตœ์‹  ์ƒํƒœ๋ฅผ (๊ทธ๋‚˜๋งˆ) ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • CDN ์บ์‹ฑ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋‹จ์ 
    • ๋™์ ์ธ ์ฝ˜ํ…์ธ ๋ฅผ ๋‹ค๋ฃจ๊ธฐ์— ํ•œ๊ณ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
    • ๋งˆ์ดํŽ˜์ด์ง€ ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ์— ์˜์กดํ•˜์—ฌ ํ™”๋ฉด์„ ๊ทธ๋ ค์ฃผ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  • ์ฝ”๋“œ
import React from 'react';

function HomePage({ data }) {
  return <div>{data}</div>;
}

export async function getStaticProps() {
  const res = await fetch('https://...'); // ์™ธ๋ถ€ API ํ˜ธ์ถœ
  const data = await res.json();

  return { 
    props: { data },
    revalidate: 60, // 1์ดˆ ํ›„์— ํŽ˜์ด์ง€ ์žฌ์ƒ์„ฑ
  };
}

export default HomePage;

 

 

 

SSR (Server Side Rendering)

์ด๋ฆ„์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ Œ๋”๋ง ์ฃผ์ฒด๋Š” ์„œ๋ฒ„์ด๋‹ค. ์ตœ์ดˆ ๋นŒ๋“œ ์‹œ ํ”„๋กœ๋•ํŠธ ๋ชจ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์ง€๋งŒ ๊ทธ ์ƒํƒœ๋ฅผ ์บ์‹ฑํ•ด๋‘์ง€ ์•Š๋Š”๋‹ค.

์‚ฌ์šฉ์ž์— ์š”์ฒญ์— ๋”ฐ๋ผ ๊ทธ ์ฆ‰์‹œ ์„œ๋ฒ„ ์ธก์—์„œ ๋ Œ๋”๋งํ•˜์—ฌ DB์—๊ฒŒ API ์š”์ฒญ ๋“ฑ์„ ๋งˆ์น˜๊ณ  html ํŒŒ์ผ์„ ์ „๋‹ฌํ•œ๋‹ค.

์š”์ฒญ๋งˆ๋‹ค ํ•ด๋‹น ๋ถ€๋ถ„๋งŒ ๋ Œ๋”๋ง ํ•œ html์„ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌ -> ํ™”๋ฉด์— ๋ฟŒ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— TTI(์š”์ฒญ ์‹œ ์‘๋‹ต ์‹œ๊ฐ„)์ด ๋А๋ฆฌ๋‹ค.

 

์ฆ‰, HTML ์š”์†Œ๋Š” ๋น ๋ฅด๊ฒŒ ๋ณด์—ฌ์ฃผ์ง€๋งŒ ๋ฐ์ดํ„ฐ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์€ ๋А๋ฆฌ๋‹ค.

 

  • ์žฅ์ 
    • TTV๊ฐ€ ๋น ๋ฆ„
    • SEO ์ตœ์ ํ™” ์ข‹์Œ
    • ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ
    • ๋งˆ์ดํŽ˜์ด์ง€์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ์— ์˜์กดํ•œ ํŽ˜์ด์ง€ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ
  • ๋‹จ์  
    • CDN ์บ์‹ฑ ๋ถˆ๊ฐ€ -> ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์บ์‹ฑ ๊ฐ€๋Šฅ
    • ๋™์‹œ ์š”์ฒญ์ด ๋งŽ์•„์ง€๋ฉด ์„œ๋ฒ„์— ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Œ
    • ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•จ
  • ์ฝ”๋“œ
import React from 'react';

function HomePage({ data }) {
  return <div>{data}</div>;
}

export async function getServerSideProps() {
  const res = await fetch('https://...',  { cache: 'no-store' }); // ์™ธ๋ถ€ API ํ˜ธ์ถœ
  const data = await res.json();

  return { props: { data } };
}

export default HomePage;

 

 

 

CSR (Client Side Rendering)

๋„ค ๊ฐ€์ง€์˜ ๋ Œ๋”๋ง ๋ฐฉ์‹ ์ค‘ ์œ ์ผํ•˜๊ฒŒ ๋ Œ๋”๋ง ์ฃผ์ฒด๊ฐ€ ํด๋ผ์ด์–ธํŠธ์ด๋‹ค. ์‰ฝ๊ฒŒ React๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค.

์„œ๋ฒ„์—์„œ๋Š” ์ดˆ๊ธฐ HTML(index.html)๊ณผ JS(bundle.js) ํŒŒ์ผ๋งŒ ์ œ๊ณตํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ API ์š”์ฒญ์„ ์ง์ ‘ ๋ณด๋‚ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , JS๊ฐ€ ํ™”๋ฉด์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

์„œ๋ฒ„์—์„œ ์ง์ ‘ ๋ Œ๋”๋ง๋œ HTML์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ดˆ๊ธฐ ํ™”๋ฉด์€ ๋นˆ ์ƒํƒœ์ด๋‹ค.

html์ด ์—†์œผ๋ฏ€๋กœ API ์š”์ฒญ์„ ํ†ตํ•ด ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋กœ ํ™”๋ฉด์„ ๊ทธ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— TTV๊ฐ€ ๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค.

๋Œ€์‹  ์ดํ›„์˜ ํŽ˜์ด์ง€ ์ „ํ™˜๊ณผ ๋ฐ์ดํ„ฐ ์š”์ฒญ์ด ๋น ๋ฅด๋‹ค. 

๋‹ค๋งŒ React ์ปดํฌ๋„ŒํŠธ๋Š” ๋™๊ธฐ์ ์œผ๋กœ ๋ Œ๋”๋ง๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ ์ฝ”๋“œ(async-await)๋Š” useEffect ๋˜๋Š” tanstack query์—์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

 

  • ์žฅ์ 
    • (์ตœ์ดˆ ํ•œ๋ฒˆ ๋กœ๋“œ๊ฐ€ ๋๋‚˜๋ฉด) ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ๋น ๋ฅด๊ณ  ๋ถ€๋“œ๋Ÿฝ๋‹ค.
    • ์„œ๋ฒ„์—๊ฒŒ ์ถ”๊ฐ€์ ์ธ ์š”์ฒญ์„ ๋ณด๋‚ผ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์ข‹๋‹ค.
    • ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ์ ๋‹ค.
  • ๋‹จ์ 
    • ์ฒซ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ๊ฐ„(Time To View)์ด ๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค.
    • JavaScript๊ฐ€ ๋กœ๋”ฉ ๋˜๊ณ  ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ํŽ˜์ด์ง€๊ฐ€ ๋น„์–ด์žˆ์–ด ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO)์— ๋ถˆ๋ฆฌํ•˜๋‹ค
  • ์ฝ”๋“œ
import React from 'react';
import ReactDOM from 'react-dom';

function App() {
  return <h1>Hello, Client Side Rendering!</h1>;
}

// index.js
ReactDOM.render(<App />, document.getElementById('root'));

 

 

 

๋”๋ณด๊ธฐ

SSG, SSR, ISR, CRS ์–ด๋–จ ๋•Œ ์‚ฌ์šฉ?

SSG - ๋ณ€๋™์ด ์—†๊ณ  ๊ณ ์ •๋œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํŽ˜์ด์ง€

ISR - ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ๋ณ€๋™๋˜๋Š” ๋‚ด์šฉ์„ ํฌํ•จํ•˜๋Š” ํŽ˜์ด์ง€

SSR - ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š” ํŽ˜์ด์ง€/SEO ์ตœ์ ํ™”

CRS - ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๊ณ  ๋น ๋ฅธ ๋ฐ˜์‘์ด ํ•„์š”ํ•œ ํŽ˜์ด์ง€/TTV ๊ธธ ์ˆ˜ ์žˆ์Œ

๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2026/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ