๐Ÿ“ SSR/CSR, ๊ทธ๋ฆฌ๊ณ  SSG

๋ธ”๋กœ๊ทธ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์‚ฌ์šฉํ•œ gatsby SSG๊ฐ€ ๋ฌด์—‡์ธ์ง€, SSG๋Š” ์™œ ์ƒ๊ฒจ๋‚ฌ๋Š”์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

SSG๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด MPA/SPA, SSR/CSR์„ ๋จผ์ € ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.

1. MPA/SPA ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ

MPA(Multiple Page Applicaiton)๋Š” ๋‹ค์ˆ˜์˜ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค. ๋ฒ„ํŠผ ํด๋ฆญ๊ณผ ๊ฐ™์€ ์‚ฌ์†Œํ•œ ์š”์ฒญ์ด ๋“ค์–ด์™€๋„ ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•ด์•ผํ•˜๋ฉฐ, ์ด ๊ณผ์ •์—์„œ ํ™”๋ฉด ๊นœ๋นก์ž„ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค.

SPA(Single Page Application)๋Š” ์ตœ์ดˆ ์š”์ฒญ์‹œ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ํ•œ๋ฒˆ์— ๋‹ค์šด ๋ฐ›๊ณ , ์ดํ›„ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๋น„๋™๊ธฐ ํ†ต์‹ (AJAX)์„ ํ†ตํ•ด ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

MPA vs SPA

MPA๋Š” ์‚ฌ์ „์— ์ž‘์„ฑ๋œ ์ •์  ํŽ˜์ด์ง€๋“ค์„ ์„œ๋ฒ„๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋‹ค๊ฐ€ (์ตœ์ดˆ ์š”์ฒญ ์ดํ›„์—) ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ ๊ทธ์— ๊ฑธ๋งž๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜•์‹์ด๋‹ค. ์ด๋Š” ์„œ๋ฒ„์ธก์—์„œ ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋˜์–ด ์ตœ์ข… ๋ฌธ์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜•ํƒœ๋‹ค. ์ฆ‰, MPA๋Š” SSR ๋ฐฉ์‹์œผ๋กœ ๋ Œ๋”๋ง๋œ๋‹ค.

SPA๋Š” ๋ธŒ๋ผ์šฐ์ € ์•ˆ์—์„œ ๋™์ž‘ํ•˜๋Š” ์•ฑ์œผ๋กœ ์ตœ์ดˆ ์š”์ฒญ์‹œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ HTML ๋ฌธ์„œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €) ๋‹จ์—์„œ ๋ Œ๋”๋ง์„ ์ง„ํ–‰ํ•œ๋‹ค. ์ฆ‰, SPA๋Š” CSR ๋ฐฉ์‹์œผ๋กœ ๋ Œ๋”๋ง๋œ๋‹ค. ์ตœ์ดˆ ์š”์ฒญ ์ดํ›„ ์‚ฌ์šฉ์ค‘์—๋Š” ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š๋Š”๋‹ค. AJAX๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋งŒ ์ฃผ๊ณ ๋ฐ›์„ ๋ฟ์ด๋‹ค.

SPA์˜ ์žฅ์ 

  • ์ข‹์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜.

    • ํ™”๋ฉด ๊นœ๋นก์ž„(ํŽ˜์ด์ง€ ๋ฆฌ๋กœ๋“œ)์ด ์—†๋‹ค.
    • ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค. ์ตœ์ดˆ ์š”์ฒญ์‹œ ๋ชจ๋“  ์ •์  ํŽ˜์ด์ง€๋ฅผ ๋‹ค์šด๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ค‘์— ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š๋ผ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—†๋‹ค.
  • ๊ฐœ๋ฐœ์ž ์นœํ™”์ 

    • ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ ๋ทฐ(View)๋‹จ์—์„œ ์ฒ˜๋ฆฌํ•  ์ผ์„ ๋”์ด์ƒ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • local storage๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ cacheํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์ฒ˜์Œ์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ๋„ ์ž‘๋™ํ•œ๋‹ค.

SPA์˜ ๋‹จ์ 

  • ์ดˆ๊ธฐ ๊ตฌ๋™์ด ๋Š๋ฆฌ๋‹ค. ์ตœ์ดˆ ์š”์ฒญ์‹œ ๋ชจ๋“  ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ํ•œ๋ฒˆ์— ๋ฐ›๊ธฐ ๋•Œ๋ฌธ.
  • SEO ๊ด€์ ์—์„œ ๋ถˆ๋ฆฌํ•˜๋‹ค.

    • ์ตœ์ดˆ ์š”์ฒญ์‹œ ๋ฐ›์•„์˜จ HTML ๋ฌธ์„œ์—๋Š” import ๊ตฌ๋ฌธ์œผ๋กœ ๋‹ค๋ฅธ JS ํŒŒ์ผ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋ฟ ์‚ฌ์‹ค์ƒ ๋‚ด์šฉ์€ ์ „๋ฌดํ•ด์„œ ์›น ํฌ๋กค๋Ÿฌ์— ์˜ํ•œ ํฌ๋กค๋ง์ด ์–ด๋ ต๊ธฐ ๋–„๋ฌธ.
  • ๋ณด์•ˆ์— ์ทจ์•ฝํ•œ ํŽธ(MPA์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ)

    • clientside script๋ฅผ ํ†ตํ•ด์„œ Cross-Site Scripting(XSS) ๊ณต๊ฒฉ์„ ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

MPA์˜ ์žฅ์ 

  • SEO ๊ด€์ ์—์„œ ์œ ๋ฆฌํ•˜๋‹ค. ์„œ๋ฒ„์—์„œ ์ด๋ฏธ ๋ Œ๋”๋ง๋œ HTML ๋ฌธ์„œ๊ฐ€ ์ „๋‹ฌ๋˜๋ฏ€๋กœ.
  • ์ดˆ๊ธฐ ๊ตฌ๋™์ด ๋น ๋ฅด๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์„œ๋ฒ„์ธก ์„ธ์…˜์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ์— ๋ณด์•ˆ์— ์œ ๋ฆฌํ•œ ํŽธ.

MPA์˜ ๋‹จ์ 

  • ๊ฐœ๋ฐœ์˜ ๋ณต์žก์„ฑ.

    • ํ”„๋ก ํŠธ์—”๋“œ/๋ฐฑ์—”๋“œ๊ฐ€ ์„œ๋กœ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋˜์–ด ์žˆ๋‹ค.
    • SPA๋ณด๋‹ค ๋ณต์žกํ•œ ๊ทœ๋ชจ.
  • ํ™”๋ฉด ๊นœ๋นก์ž„.

2. SSR/CSR ๋ Œ๋”๋ง ๋ฐฉ์‹

SSR SSR(Sever Side Rendering)

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญํ•œ HTML ํŒŒ์ผ์„ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง์„ ๋งˆ์นœ ํ›„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ์งง๋‹ค. ๊ทธ๋Ÿผ์—๋„ JS ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๊ณ  ์ ์šฉํ•˜๋Š” ๋™์•ˆ ์ธํ„ฐ๋ž™์…˜ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„ ์œ ์˜.

CSR CSR(Client Side Rendering)

ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€์—์„œ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค๋Š” ๊ฒƒ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ํŽ˜์ด์ง€์˜ ์ผ๋ถ€ ํ˜น์€ ์ „์ฒด๋ฅผ ๊ฐˆ์•„์น˜์šฐ๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ .jsํŒŒ์ผ์ด ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ .jsํŒŒ์ผ๋กœ ๋ฒˆ๋“ค๋ง๋˜์–ด SPA๋ฅผ ์ด๋ฃฌ๋‹ค๊ณ  ๋ณด์•„๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

Renderings ๋ Œ๋”๋ง ๋ฐฉ์‹์„ ์„ธ๋ถ„ํ™”ํ•˜์ž๋ฉด ์œ„์™€ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. ์ฐธ๊ณ ๋งŒ ํ•˜๋„๋ก ํ•˜์ž.

3. SSG (Static Stie Generator)

์ง€๊ธˆ๊นŒ์ง€ ์‚ดํŽด๋ณธ MPA(SSR), SPA(CSR)์˜ ์žฅ์ ์„ ๋ฒ„๋ฌด๋ฆฌ๊ณ  ์‹ถ๋‹ค. SPA ๊ตฌ์กฐ๋กœ ์ œ์ž‘ํ•˜์—ฌ ํ™”๋ฉด ๊นœ๋นก์ž„ ์—†์ด ๋‹ค์–‘ํ•œ ์ธํ„ฐ๋ž™์…˜์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด๋‚ด๋ฉด์„œ๋„, SSR ๋ฐฉ์‹์ฒ˜๋Ÿผ ์ดˆ๊ธฐ ๋กœ๋”ฉ์ด ๋น ๋ฅด๊ณ  SEO์—๋„ ๋ฌด๋ฆฌ๊ฐ€ ์—†๋Š” ์›น ์‚ฌ์ดํŠธ๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋”ํ•  ๋‚˜์œ„๊ฐ€ ์—†๊ฒ ๋‹ค.

์ด๋Ÿด ๋•Œ React์™€ ๊ฐ™์€ CSR์— ์ตœ์ ํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ Gatsby ๋˜๋Š” Next.js ๊ฐ™์€ SSG ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. Gatsby์™€ Next.js๋Š” ๊ตฌ์ฒด์ ์ธ ์ž‘๋™ ๋ฐฉ์‹์€ ๋‹ค๋ฅด์ง€๋งŒ, pre-rendering ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์ •์ ์œผ๋กœ ์›นํŽ˜์ด์ง€๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋‘๊ณ  ์„œ๋ฒ„์— ๋ฐฐํฌํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ์‘๋‹ตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ดˆ๊ธฐ ๋กœ๋”ฉ์„ ๋‹จ์ถ•ํ•˜๋Š” ๊ตฌ์กฐ์ธ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. ์ฆ‰, ์ตœ์ดˆ ์š”์ฒญ์‹œ SSR ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋นŒ๋“œ ํƒ€์ž„์— pre-renderํ•œ ํŽ˜์ด์ง€๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , ์ดํ›„์—๋Š” CSR ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

'no pre-render' 'pre-render'

gatsby ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ์ •์˜ํ•œ SSG๋Š”, MarkDown์„ ๋น„๋กฏํ•œ ํ…์ŠคํŠธ ํŒŒ์ผ ๋“ฑ์„ source๋กœ ๋ฐ›์•„ HTML ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๊ณ  ํ•œ๋‹ค. SSG๋Š” ์•ž์„œ ์–ธ๊ธ‰ํ•œ pre-rendering ๊ธฐ๋Šฅ ์ด์™ธ์—๋„ ์›น ํŽ˜์ด์ง€ ๊ฐœ์„ค, SEO ์ตœ์ ํ™”, ๋ณด์•ˆ ๋“ฑ ์—ฌ๋Ÿฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๊ฒฐ๋ก 

์ „ํ†ต์ ์ธ ์›น ์‚ฌ์ดํŠธ ๊ตฌ์กฐ ๋ฐฉ์‹์ธ MPA, ํ˜„๋Œ€์ ์ธ ์›น ์‚ฌ์ดํŠธ ๊ตฌ์กฐ ๋ฐฉ์‹์ธ SPA์˜ ์žฅ๋‹จ์ ๊ณผ ๋‚ด๋ถ€ ์ž‘๋™ ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด์•˜๋‹ค. MPA๋Š” SSR ๋ฐฉ์‹์œผ๋กœ, SPA๋Š” CSR ๋ฐฉ์‹์œผ๋กœ ๋ Œ๋”๋งํ•œ๋‹ค๋Š” ์ ์„ ๋ฐฐ์› ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด React, Vue, Angular๋ฅผ ์ด์šฉํ•œ SPA ๊ตฌ์กฐ์˜ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ œ์ž‘ํ•œ๋‹ค๋ฉด CSR ๋ Œ๋”๋ง ๋ฐฉ์‹์˜ ๋‹จ์ ๋“ค๊ณผ ๋งˆ์ฃผํ•  ๊ฒƒ์ด๋‹ค. ์ด๋•Œ gatsby, Next.js, Hugo, Jekyll ๊ณผ ๊ฐ™์€ SSG์˜ ๋„์›€์„ ๋ฐ›์•„ ์ œ์ž‘ํ•˜๋ฉด ์ข€ ๋” ์งฑ์งฑํ•œ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

References

CSR(Client-Side-Rendering) vs SSR(Server-Side-Rendering) (feat. React๋ฅผ ์ค‘์ ์œผ๋กœ)

SSR(Server-Side-Rendering) ๊ทธ๋ฆฌ๊ณ  SSG(Static-Site-Generation) (feat. NEXT๋ฅผ ์ค‘์‹ฌ์œผ๋กœ)

SPA๋ž€?

JAMStack๊ณผ SSG (Definition of JAMStack and SSG)

[๊ฐœ๋ฐœ์ƒ์‹]SSR vs CSR ๋‹น์‹ ์˜ ์„ ํƒ์€? (feat. ์›น์˜ ๋ณ€์ฒœ์‚ฌ)

์›น ๋ Œ๋”๋ง


Written by@Lechuck
์ดˆ๋ณด ๊ฐœ๋ฐœ์ž

GitHub