๐Ÿ–ฅ๏ธ 15. CSR vs SSR โ€” ๋ Œ๋”๋ง ๋ฐฉ์‹, ์ด์ œ๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์ดํ•ดํ•˜๊ณ  ์จ์•ผ ํ•  ๋•Œ๋‹ค

JM_Devยท2025๋…„ 4์›” 29์ผ
1
post-thumbnail

SPA(Single Page Application) ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ
"CSR๊ณผ SSR ์ค‘ ์–ด๋–ค ๋ฐฉ์‹์„ ์จ์•ผ ํ• ๊นŒ?"๋ผ๋Š” ์งˆ๋ฌธ์„ ๋งˆ์ฃผํ•˜๊ฒŒ ๋œ๋‹ค.
์ด๋ฒˆ์—๋Š” ๋‹จ์ˆœํ•œ ๊ฐœ๋… ์„ค๋ช…์„ ๋„˜์–ด์„œ, ๊ฐ ๋ Œ๋”๋ง ๋ฐฉ์‹์˜ ๊ตฌ์ฒด์ ์ธ ์ฐจ์ด์ ๊ณผ ์„ ํƒ ๊ธฐ์ค€์„ ๊นŠ์ด ์ •๋ฆฌํ•ด๋ดค๋‹ค.


โœ… CSR (Client Side Rendering)์ด๋ž€?

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฒ˜์Œ ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ, ์ตœ์†Œํ•œ์˜ HTML๊ณผ JavaScript ๋ฒˆ๋“ค์„ ๋ฐ›๊ณ ,
ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์—์„œ ์ „์ฒด ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹.

๋Œ€ํ‘œ์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ: React, Vue, Angular


CSR ๋™์ž‘ ํ๋ฆ„

  1. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋นˆ HTML(ํ˜น์€ ์ตœ์†Œ HTML) ํŒŒ์ผ์„ ๋ฐ›์Œ
  2. JavaScript ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๊ณ  ์‹คํ–‰
  3. ์‹คํ–‰๋œ JavaScript๊ฐ€ DOM์„ ๋งŒ๋“ค์–ด์„œ ํ™”๋ฉด์— ๊ทธ๋ฆผ
<!-- ์ดˆ๊ธฐ HTML -->
<body>
  <div id="root"></div>
  <script src="bundle.js"></script>
</body>
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ์ดˆ๊ธฐ ํ™”๋ฉด์€ ๊ฑฐ์˜ ๋น„์–ด์žˆ์Œ
  • ์‹ค์ œ ์ปจํ…์ธ ๋Š” JavaScript๊ฐ€ ๋กœ๋“œ๋œ ํ›„ ๋‚˜ํƒ€๋‚จ

CSR ์žฅ์ 

  • ํŽ˜์ด์ง€ ์ด๋™์ด ๋น ๋ฅด๋‹ค (์ „์ฒด ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ์ด๋™ ๊ฐ€๋Šฅ)
  • ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์œ ์—ฐํ•˜๊ฒŒ ํ™”๋ฉด ์ œ์–ด ๊ฐ€๋Šฅ
  • ๋ณต์žกํ•œ UI, ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋Œ€ํ™”ํ˜• ์•ฑ์— ์œ ๋ฆฌ

CSR ๋‹จ์ 

  • ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค (JS๊ฐ€ ๋‹ค ๋กœ๋“œ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋นˆ ํ™”๋ฉด)
  • ๊ฒ€์ƒ‰ ์—”์ง„(SEO)์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์ฒซ ํ™”๋ฉด ๋„๋‹ฌ ์‹œ๊ฐ„(FCP, LCP)์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Œ

โœ… SSR (Server Side Rendering)์ด๋ž€?

์„œ๋ฒ„์—์„œ HTML์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ด๋Š” ๋ฐฉ์‹.
๋ธŒ๋ผ์šฐ์ €๋Š” ์™„์„ฑ๋œ HTML์„ ๋ฐ”๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ: Next.js, Nuxt.js


SSR ๋™์ž‘ ํ๋ฆ„

  1. ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ URL ์š”์ฒญ
  2. ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ HTML์„ ๋ Œ๋”๋ง
  3. ์™„์„ฑ๋œ HTML์„ ํด๋ผ์ด์–ธํŠธ์— ์ „์†ก
  4. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฐ”๋กœ ํ™”๋ฉด์— ํ‘œ์‹œ
  5. ์ดํ›„ ํ•„์š”ํ•œ JavaScript๋ฅผ ํ•˜์ด๋“œ๋ ˆ์ด์…˜(hydration)
export async function getServerSideProps(context) {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return { props: { data } };
}
  • ์ดˆ๊ธฐ ํ™”๋ฉด์ด ๋ฐ”๋กœ ํ‘œ์‹œ๋จ (SEO์— ๋งค์šฐ ์œ ๋ฆฌ)
  • ๋™์  ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€์— ๊ฐ•๋ ฅํ•จ

SSR ์žฅ์ 

  • SEO ์ตœ์ ํ™”์— ์ข‹๋‹ค (HTML ์ปจํ…์ธ ๊ฐ€ ์ดˆ๊ธฐ๋ถ€ํ„ฐ ์กด์žฌ)
  • ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค (์œ ์ € ๊ฒฝํ—˜ ๊ฐœ์„ )
  • ๋™์  ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๋‹ค

SSR ๋‹จ์ 

  • ์„œ๋ฒ„์— ๋ถ€ํ•˜๊ฐ€ ํฌ๋‹ค (๋ชจ๋“  ์š”์ฒญ๋งˆ๋‹ค ๋ Œ๋”๋ง)
  • ํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ ์„œ๋ฒ„ ์š”์ฒญ์ด ๋Š˜์–ด๋‚˜์„œ UX๊ฐ€ CSR๋ณด๋‹ค ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค
  • ๋ณต์žกํ•œ ์บ์‹ฑ ์ „๋žต์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ

โœ… CSR vs SSR ์ •๋ฆฌ ๋น„๊ต

ํ•ญ๋ชฉCSRSSR
๋ Œ๋”๋ง ์œ„์น˜๋ธŒ๋ผ์šฐ์ €(Client)์„œ๋ฒ„(Server)
์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋А๋ฆด ์ˆ˜ ์žˆ์Œ (JS ์™„์ „ ๋กœ๋“œ ํ•„์š”)๋น ๋ฆ„ (HTML ๋จผ์ € ์ „๋‹ฌ)
SEO ์ตœ์ ํ™”๋ณ„๋„ ์„ค์ • ํ•„์š” (์˜ˆ: prerendering, meta ์ถ”๊ฐ€)๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ์ ํ™” ๋จ
์„œ๋ฒ„ ๋ถ€ํ•˜์ ์Œ๋†’์Œ
UX ๊ฒฝํ—˜SPA์ฒ˜๋Ÿผ ๋ถ€๋“œ๋Ÿฌ์›€์ฒซ ํŽ˜์ด์ง€ ๋น ๋ฅด๊ณ  ์ดํ›„ ํŽ˜์ด์ง€ ์ „ํ™˜์€ ๋А๋ฆด ์ˆ˜๋„ ์žˆ์Œ
์‚ฌ์šฉ ์˜ˆ์‹œ๋Œ€ํ™”ํ˜• ์•ฑ, ๋Œ€์‹œ๋ณด๋“œ, ๊ฒŒ์ž„๋ธ”๋กœ๊ทธ, ์‡ผํ•‘๋ชฐ, ๋‰ด์Šค ์‚ฌ์ดํŠธ

๐Ÿ“ ๋‚ด๊ฐ€ ๋А๋‚€ ์ 

์ฒ˜์Œ์—๋Š” "CSR์ด ๋ฌด์กฐ๊ฑด ์ข‹์ง€ ์•Š์•„?"๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ,
SEO๋‚˜ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์†๋„๋ฅผ ๊ณ ๋ คํ•˜๋ฉด SSR์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์ด ๋ถ„๋ช…ํžˆ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋๋‹ค.
ํŠนํžˆ Next.js๋ฅผ ์จ๋ณด๋ฉด์„œ ํŽ˜์ด์ง€๋ณ„๋กœ CSR/SSR์„ ์œ ์—ฐํ•˜๊ฒŒ ์„ž์–ด์“ฐ๋Š” ๊ฒŒ
์š”์ฆ˜ ์›น ๊ฐœ๋ฐœ์˜ ํŠธ๋ Œ๋“œ๋ผ๋Š” ๊ฑธ ํ”ผ๋ถ€๋กœ ๋А๋ผ๊ฒŒ ๋๋‹ค.


๐ŸŒŸ "CSR๊ณผ SSR์€ ์„œ๋กœ ๋Œ€๋ฆฝํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ƒํ™ฉ์— ๋งž๊ฒŒ '์ ์ ˆํžˆ ์กฐํ•ฉ'ํ•ด์„œ ์“ฐ๋Š” ๊ฒŒ ์ง„์งœ ์‹ค๋ ฅ์ด๋‹ค."

profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€