JAM Stack & SPA, CSR, SSR

#frontend

Written by Paul

JAM Stack ๊ทธ๋ฆฌ๊ณ  SPA, CSR, SSR

๋ชฉ์ฐจ

  1. JAM Stack ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
  1. JAM Stack์€ SSR / CSR๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅผ๊นŒ?
  1. ๊ทธ๋Ÿผ SSR ๋ฐฉ์‹์€ ํ•„์š”๊ฐ€ ์—†์–ด์ง„ ๊ฒƒ ์ผ๊นŒ?

1. JAM Stack ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

  • J: Javascript
  • A: API
  • M: Markup
Javascript์™€ API ๊ทธ๋ฆฌ๊ณ  Markup(HTML)์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ์›น์˜ ๊ตฌ์„ฑ์„ ์ด์•ผ๊ธฐ ํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” SPA ๊ณผ๋Š” ๋น„์Šทํ•˜์ง€๋งŒ ๋‹ค๋ฅด๋‹ค๊ณ  ํ•œ๋‹ค. JAM Stack์€ ํŠน์ • ๊ธฐ์ˆ  (ex. React, Vue)์„ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅธ ๊ด€์ ์ด๋ฉฐ, ์ด๋“ค์„ ์ด์šฉํ•ด์„œ ์›น์‚ฌ์ดํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ• ์ง€์— ๋Œ€ํ•œ ๊ด€์ ์ด๋‹ค.
JavaScript Client ์˜ ๋ชจ๋“  ์ฒ˜๋ฆฌ๋Š” Javascript ์—๊ฒŒ ๋งž๊ธด๋‹ค. API ๋ชจ๋“  ๊ธฐ๋Šฅ ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ API ๋กœ ์ถ”์ƒํ™”ํ•œ๋‹ค. Markup SSG (Static Site Generator) ๋‚˜ Template Engine (Webpack ๋“ฑ) ์„ ์ด์šฉํ•˜์—ฌ Markup ์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•œ๋‹ค.
๋น„์Šทํ•˜๊ฒŒ MERN Stack์ด ์žˆ๋‹ค.
  • M: Mongo DB
  • E: Express
  • R: React
  • N: Node.JS

2. JAM Stack์€ SSR / CSR๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅผ๊นŒ?

React, Angular, Vue์™€ ๊ฐ™์€ ๋ชจ๋˜ ์›น ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „์— SSR๋กœ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ์—ˆ๋‹ค. SSR์ด๋ผ ํ•จ์€ ๋ธŒ๋ผ์šฐ์ €์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์„œ๋ฒ„์—์„œ html์„ ๋‚ด๋ ค์ฃผ์–ด ๋ Œ๋”๋ง ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ CSR์— ๋น„ํ•ด ์„œ๋ฒ„์˜ ์ž์›์„ ๋งŽ์ด ์“ฐ๊ฒŒ ๋˜๋ฏ€๋กœ ๊ทธ๋Ÿฐ ๋ถ€๋ถ„์—์„œ ๋น„ํšจ์œจ ์ ์ด๋‹ค. ๋˜ํ•œ ์†๋„์ธก๋ฉด์—์„œ๋„ CSR์€ ์„œ๋ฒ„๋ฅผ ํƒ€์ง€ ์•Š๊ณ  ๋ Œ๋”๋ง์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, SSR์— ๋น„ํ•ด ํšจ์œจ์ ์ด๋‹ค. ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ html์„ ๋ฐ›์•„์„œ ๋ทฐ๋ฅผ ๊ทธ๋ ค์ฃผ๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” http request๋ฅผ ํ†ตํ•ด์„œ ํ•„์š”ํ•œ ์ž์›๋งŒ ๋ฐ›์•„์„œ ๋ทฐ์— ๊ทธ๋ ค์ฃผ๋Š” ๊ฒƒ์ด ์†๋„์ƒ ์ด์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๊ทธ๋ž˜์„œ React์™€ ๊ฐ™์€ SPA (Single Page App) ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” html ๋งˆํฌ์—… ๋ถ€๋ถ„์€ ์‚ฌ์‹ค์ƒ title ๋ฐ meta ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” head ํƒœ๊ทธ์™€ body ํƒœ๊ทธ๋‚ด์—์„œ javascript๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ํ•  tag๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ํƒœ๊ทธ ์™ธ์—๋Š” ๋งŽ์€ ๋ถ€๋ถ„์ด ๋น„์–ด์žˆ๋‹ค.
SPA ๋ฐฉ์‹์€ ์„œ๋ฒ„์—์„œ ์˜์กดํ•˜๋˜ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ทธ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์—์„œ ๋งŽ์ด ํƒˆํ”ผํ•œ ๋ฐฉ์‹์ด๋‹ค. ์„œ๋ฒ„์—์„œ html์„ ๊ทธ๋ฆฌ๋Š”๋ฐ ํ•„์š”ํ•œ ์ž์›์„ ๋ชจ๋‘ ๋ฐ›์•„์˜ค๋Š” SSR ๋ฐฉ์‹์—์„œ ์„œ๋ฒ„์—์„œ๋Š” ํ•„์š”ํ•œ ์ž์›(ํด๋ผ์ด์–ธํŠธ์™€ ๋ถ„๋ฆฌ๋œ ์„œ๋ฒ„ API๋ฅผ ํ†ตํ•ด์„œ)๋งŒ์„ ๋ฐ›์•„์˜ค๋ฉฐ html์€ ๊ธฐ๋ณธ ํ† ๋Œ€๋งŒ์„ ๋‹ด๋‹น ํ•˜๋ฉฐ ๋‚˜๋จธ์ง€ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ณด์—ฌ์ฃผ๋Š” ๋ชจ๋“  ๋ทฐ๋“ค์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ css๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค.

3. ๊ทธ๋Ÿผ SSR ๋ฐฉ์‹์€ ํ•„์š”๊ฐ€ ์—†์–ด์ง„ ๊ฒƒ ์ผ๊นŒ?

SPA๋ฅผ ํ†ตํ•œ CSR ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘๊ฐ€์ง€ ๋‹จ์ ์„ ๊ฐ€์ง„๋‹ค.
  1. SSR์— ๋น„ํ•ด์„œ ์ฒซ ๊ทธ๋ฆผ์„ ๊ทธ๋ ค์ฃผ๊ธฐ ์ „ ๊นŒ์ง€ ๋”œ๋ ˆ์ด๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.
  1. HTML์ด ๊ฑฐ์˜ ๋น„์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, SEO (๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™”)์— ์ข‹์ง€ ์•Š๋‹ค.
SPA๋ฅผ ์‚ฌ์šฉํ•œ CSR ๋ฐฉ์‹์€ ์œ„ ๋‘๊ฐ€์ง€ ๋‹จ์ ์—๋„ ๋„ˆ๋ฌด๋‚˜ ๋งค๋ ฅ์ ์ธ ์Šคํƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์œ„ ๋‘๊ฐ€์ง€ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐฉ์‹๋“ค์ด ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ๋‹ค.
์˜ˆ๋ฅผ๋“ค๋ฉด ๋ถ€๋ถ„์ ์œผ๋กœ SSR ๋ฐฉ์‹์„ ์ฑ„ํƒํ•œ Next (React)์™€ Nuxt (Vue) ๋“ฑ์ด ์žˆ๋‹ค. ์ฒซ ํŽ˜์ด์ง€๋Š” SSR๋กœ ๋ณด์—ฌ์ฃผ๊ณ , ๋‚˜๋จธ์ง€๋Š” SPA์˜ javascript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CSR๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด๋กœ์จ ๋‹จ์  1๋ฒˆ์„ ๋ณด์™„ํ•˜์—ฌ ์ฒซ ํŽ˜์ด์ง€๋Š” ์™„์„ฑ๋œ html์„ ๋ณด์—ฌ์ฃผ์–ด First meaningful paint์˜ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ๋‹จ์  2๋ฒˆ์„ ๋ณด์™„ํ•˜์—ฌ ๊ฒ€์ƒ‰ ๋ด‡์ด html์„ ํฌ๋กค๋ง ํ•ด์„œ SEO๋ฅผ ํ–ฅ์ƒ ์‹œ์ผฐ๋‹ค.
โ† Go home