Skip to main content

Command Palette

Search for a command to run...

CSR, SSR ๊ทธ๋ฆฌ๊ณ  Pre-rendering

Client Side Rendering, Server Side Rendering ๊ทธ๋ฆฌ๊ณ  Pre-rendering ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

Published
โ€ข5 min readโ€ขView as Markdown
CSR, SSR ๊ทธ๋ฆฌ๊ณ  Pre-rendering
L

์ง๋ฉดํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ œ์— ์œ ์น˜ํ•œ ๊ฒƒ์€ ์—†์œผ๋ฉฐ, ์˜๋ฏธ ์—†๋Š” ์‚ฝ์งˆ ๋˜ํ•œ ์—†๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๐Ÿ–๐Ÿป ๋“ค์–ด๊ฐ€๋ฉฐ

์‚ฌ์‹ค Next.js ์—์„œ์˜ styled-component ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•ด์„œ ์‹ฌ๊ฐํ•œ ๊ณ ๋ฏผ์— ๋น ์ ธ์žˆ์—ˆ์–ด์„œ ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…์„ ์ž‘์„ฑํ•˜๋˜ ๋„์ค‘ใ…‹ใ…‹ใ…‹ ๋˜ํฌ ํ„ธ๊นŽ๊ธฐ๋กœ CSR, SSR, Pre-rendering ์— ๋Œ€ํ•ด ์ œ๋Œ€๋กœ ์•Œ๊ณ  ๊ฐ€์•ผ๊ฒ ๋‹จ ์ƒ๊ฐ์ด ๋“ค์—ˆโ€ฆ๋‹ค ํ•˜ํ•˜

React ๊ณต๋ถ€๋ฅผ ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ ํ•ด๋‹น ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ๊ณต๋ถ€ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ–ˆ์—ˆ๋Š”๋ฐ, ๋ง‰์ƒ ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ œ๋Œ€๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? ๋ฅผ ์Šค์Šค๋กœ ์งˆ๋ฌธํ•ด๋ณด๋‹ˆ ๊ทธ๋ ‡์ง€ ๋ชปํ–ˆ๊ธฐ์—.. ์ด๋ฒˆ ๊ธฐํšŒ์— ์ œ๋Œ€๋กœ ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์— ๋‹ค์‹œ ๊ณต๋ถ€๋ฅผ ํ•ด๋ดค๋‹ค.


๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป Client Side Rendering

์ถœ์ฒ˜ : https://www.blog.duomly.com/client-side-rendering-vs-server-side-rendering-vs-prerendering/

โ†”๏ธ CSR process


  1. ์œ ์ €๊ฐ€ ์›น ์‚ฌ์ดํŠธ์— ์ง„์ž…(request)ํ•œ๋‹ค.

  2. CDN ์€ ์ตœ์†Œํ•œ์˜ HTML ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ(response) ํ•œ๋‹ค.

    • index.html : script, meta, link ๋“ฑ์˜ ํƒœ๊ทธ๋ฅผ ํฌํ•จํ•˜๋ฉฐ ๋นˆ ์ปจํ…์ธ ๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.
  3. ๋ธŒ๋ผ์šฐ์ €๋Š” index.html ์— ์žˆ๋Š” JavaScript ๋ฒˆ๋“ค ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ•œ๋‹ค.

  4. api ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•ด ๋™์  ์ปจํ…์ธ ๋ฅผ ๊ฐ€์ ธ์™€ ํŒŒ์‹ฑํ•˜๊ณ  ์ตœ์ข… ์ปจํ…์ธ ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

  5. ์œ ์ €๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•œ๋‹ค๋ฉด ์„œ๋ฒ„์— ์ถ”๊ฐ€ html ํŒŒ์ผ์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ์ด๋ฏธ ๋ฐ›์€ javaScript ๋ฅผ ์ด์šฉํ•ด ๋ Œ๋”๋งํ•œ๋‹ค.


๐ŸŒ Server Side Rendering

์ถœ์ฒ˜ : https://www.blog.duomly.com/client-side-rendering-vs-server-side-rendering-vs-prerendering/


๐ŸŒ SSR Process

  1. ์œ ์ €๊ฐ€ ์›น ์‚ฌ์ดํŠธ์— ์ง„์ž…(request)ํ•œ๋‹ค.

  2. CDN ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™•์ธํ•˜๊ณ  ํŽ˜์ด์ง€ ๋‚ด์— ์žˆ๋Š” ์„œ๋ฒ„์ธก ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด HTML ์ปจํ…์ธ ๋ฅผ ์ปดํŒŒ์ผ ๋ฐ ์ค€๋น„ํ•œ๋‹ค.

  3. ์ปดํŒŒ์ผ๋œ HTML ์€ ์ถ”๊ฐ€ ๋ Œ๋”๋ง ๋ฐ ํ‘œ์‹œ๋ฅผ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก๋œ๋‹ค.(response)

  4. ๋ธŒ๋ผ์šฐ์ €๋Š” HTML ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์ดํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

  5. ๋ธŒ๋ผ์šฐ์ €๋Š” JavaScript ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉฐ ํŽ˜์ด์ง€๋ฅผ interactive ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

  6. ์œ ์ €๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๋ฉด ์œ„ ๋™์ž‘์ด ๋ฐ˜๋ณต๋œ๋‹ค.

๐Ÿคฌ Uncanny Valley

์ถœ์ฒ˜: https://crystallize.com/blog/frontend-performance-react-ssr-and-the-uncanny-valley

SSR ๋ฐฉ์‹์œผ๋กœ ํ™”๋ฉด์„ ๋ Œ๋”๋ง ํ–ˆ์„ ๋•Œ, View ๊ฐ€ ๊ทธ๋ ค์ง„ ํ›„ JavaScript ๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋  ๋•Œ ๊นŒ์ง€ ์ธํ„ฐ๋ž™์…˜์ด ์ผ์–ด๋‚  ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋งŒ์•ฝ ๊ทธ ์‚ฌ์ด ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๊ทธ ๋•Œ๋ถ€ํ„ฐ ์œ ์ €๋Š” ์‚ฌ์ดํŠธ์™€ ์ธํ„ฐ๋ž™์…˜์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ทฐ๋Š” ์žˆ์ง€๋งŒ ์ธํ„ฐ๋ž™์…˜์ด ์•ˆ๋˜๋Š” ๊ตฌ๊ฐ„์„ โ€œUncanny Valley(๋ถˆ์พŒํ•œ ๊ณจ์งœ๊ธฐ)โ€๋ผ๊ณ  ํ•œ๋‹ค.


๐Ÿค” CSR vs SSR

CSR ๊ณผ SSR ์˜ ๋ Œ๋”๋ง ๋ฐฉ์‹์—์„œ์˜ ์ฐจ์ด์ ์€ ๊ฒฐ๊ตญ ๋ Œ๋”๋ง์„ ์„œ๋ฒ„์ธก์—์„œ ๋‹ด๋‹นํ•˜๋Š”์ง€, ํด๋ผ์ด์–ธํŠธ์ธก์—์„œ ๋‹ด๋‹นํ•˜๋Š”์ง€์ด๋‹ค. CSR ์€ ์ตœ์†Œํ•œ์˜ html ํŒŒ์ผ์„ ๋ฐ›์€ ํ›„, ์•ฑ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  js ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ DOM ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด, SSR ์€ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ๋“ค์„ ์„œ๋ฒ„์ธก์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ ๊ทธ๋ ค๋‚ธ๋‹ค.

CSR ์˜ ๊ฒฝ์šฐ๋Š” ์ฒซ ์ง„์ž… ์‹œ ๋ชจ๋“  js ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•ด์•ผํ•˜๋ฏ€๋กœ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค. ํ•˜์ง€๋งŒ, ์ดํ›„์—๋Š” ์ถ”๊ฐ€์ ์ธ ๋กœ๋“œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋“œ๋Ÿฌ์šด ์œ ์ € ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค. ํ™”๋ฉด ๋‚ด์—์„œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๊ณ  ํ•˜๋”๋ผ๋„, html ์†Œ์Šค๋ฅผ ์„œ๋ฒ„์—์„œ ๋ฐ›๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ํ›จ์”ฌ ๋น ๋ฅธ ํŽธ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ฒ˜์Œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๋Š” javaScript ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๊ฐ€ ํด ๊ฒฝ์šฐ์—๋Š” ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์†๋„๊ฐ€ ํ˜„์ €ํžˆ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•œ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณ„์† ๊ณ ๋ฏผํ•ด์•ผํ•œ๋‹ค. ๋˜ํ•œ html ์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๊ณ  ์œ ์ €์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ์ƒ์„ฑ๋˜๋ฏ€๋กœ SEO(serach engine optimization : ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”) ๋Œ€์‘์ด ์–ด๋ ค์šด ํŽธ์ด๋‹ค.

SSR ์˜ ๊ฒฝ์šฐ๋Š” CSR์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์†๋„, ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ, SEO ๋“ฑ์˜ ๋ฌธ์ œ์  ๊ฐœ์„ ์„ ์œ„ํ•ด ๊ณผ๊ฑฐ์˜ static site ๋กœ ๋Œ์•„๊ฐ„ ๋ฐฉ์‹์ด๋‹ค. CSR ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์„œ๋ฒ„์—์„œ html ์„ ๋งŒ๋“ค์–ด ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— SEO ์ตœ์ ํ™”๊ฐ€ ์ž˜ ์ด๋ฃจ์–ด์ง€๋ฉฐ ๊ฐ ํŽ˜์ด์ง€๋ณ„๋กœ ๋‹ค์šด์ด ๋˜๋ฏ€๋กœ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์†๋„๋„ ๋น ๋ฅธ ํŽธ์ด๋‹ค.


๐Ÿคจ CSR ๊ณผ SSR ์„ ํƒ์€ ์–ด๋–ค ๊ฒƒ์„ ๊ธฐ์ค€์œผ๋กœ ์žก์œผ๋ฉด ์ข‹์„๊นŒ?

SSR

  • ๋А๋ฆฐ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ (SSR์€ ๊ฐ ํŽ˜์ด์ง€๋ณ„๋กœ ์‘๋‹ต๊ฐ’์„ ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ!)

  • SEO ์ตœ์ ํ™”๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ

  • ๋น ๋ฅธ ์ดˆ๊ธฐ ๋ Œ๋”๋ง์„ ํ•„์š”๋กœ ํ•  ๋•Œ

  • ๋ฉ”์ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌ๊ณ  ๋กœ๋”ฉ์ด ๋งค์šฐ ๋А๋ฆด ๋•Œ

  • ์›น ์‚ฌ์ดํŠธ ๋‚ด์—์„œ ์ƒํ˜ธ์ž‘์šฉ์ด ๋ณ„๋กœ ์—†์„ ๋•Œ

CSR

  • ๋„คํŠธ์›Œํฌ๊ฐ€ ๋น ๋ฅผ ๋•Œ

  • ์„œ๋ฒ„ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์„ ๋•Œ

  • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋งŽ์„ ๋•Œ

  • ๋ฉ”์ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ฐ€๋ฒผ์šธ ๋•Œ

  • SEO ์ตœ์ ํ™”๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์„ ๋•Œ

  • ์›น ์‚ฌ์ดํŠธ ๋‚ด์—์„œ ์ƒํ˜ธ์ž‘์šฉ์ด ๋งŽ์„ ๋•Œ


๐Ÿš€ Pre-rendering

์ถœ์ฒ˜ : https://www.blog.duomly.com/client-side-rendering-vs-server-side-rendering-vs-prerendering/

Next.js ๊ณต์‹๋ฌธ์„œ ๋„์ž…๋ถ€๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์™€์žˆ๋‹ค.

By default, Next.js pre-renders every page. This means that Next.js generates HTML for each page in advance, instead of having it all done by client-side JavaScript. Pre-rendering can result in better performance and SEO.

Each generated HTML is associated with minimal JavaScript code necessary for that page. When a page is loaded by the browser, its JavaScript code runs and makes the page fully interactive. (This process is called hydration.)

๊ธฐ๋ณธ์ ์œผ๋กœ Next.js ๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ pre-rendering ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” pre-rendering ์€ Next.js ๊ฐ€ client-side javascript ๋กœ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์‹ , ๋ฏธ๋ฆฌ ๊ฐ ํŽ˜์ด์ง€์— ๋Œ€ํ•ด html ์„ ๋งŒ๋“ค์–ด๋‘๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. pre-rendering ์€ SEO ์—์„œ ๋” ๋‚˜์€ ํผํฌ๋จผ์Šค๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ html ์€ ํŽ˜์ด์ง€๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋กœ๋“œ๋  ๋•Œ ํ•ด๋‹น JavaScript ์ฝ”๋“œ๊ฐ€ ๋Œ์•„๊ฐ€๊ณ  ์™„์ „ํ•œ interactive page๊ฐ€ ๋˜๋„๋ก ๋งŒ๋“œ๋Š”๋ฐ, ์ด๋ฅผ hydration์ด๋ผ๊ณ  ํ•œ๋‹ค.

Next.js ์—์„œ์˜ Server-side rendering ๊ณผ Static Generation ์€ ๋ชจ๋‘ pre-rendering ๋ฐฉ์‹์ด๋ฉฐ ํ•„์š”ํ•œ data fetching ๊ณผ HTML ๋ Œ๋”๋ง์ด client ์— ๋ณด๋‚ด์ง€๊ธฐ ์ „์— ์ด๋ฏธ ์ˆ˜ํ–‰์ด ๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด์„œ client ๋Š” non-interactive ํ•œ ํŽ˜์ด์ง€๋ฅผ ๋น ๋ฅธ ์‹œ๊ฐ„์— ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ปดํฌ๋„ŒํŠธ์— ํ•„์š”ํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์™€ ๊ฐ™์€ interactive ํ•œ ์†์„ฑ๋“ค์€ ๋ณ„๋„์˜ ๋ฒˆ๋“ค๋กœ ์ „๋‹ฌ์„ ๋ฐ›์•„์„œ client ์ธก์—์„œ hydration ์ด ์ด๋ฃจ์–ด์ง„ ๋’ค์— ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์›น์•ฑ์ด ๋œ๋‹ค.


๐ŸŒง๏ธ hydration

pre-rendering ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์ถ•๋œ ์ดˆ๊ธฐ DOM์€ ๋™์ ์ธ ์ด๋ฒคํŠธ๊ฐ€ ์—†๋Š” ๋ฉ”๋งˆ๋ฅธ ์ƒํƒœ์˜ ๋ผˆ๋Œ€์ด๋‹ค. ์ด ๋ฉ”๋งˆ๋ฅธ ๊ณณ์— ์ˆ˜๋ถ„์„ ๋ณด์ถฉํ•˜๋Š”, HTML ๊ณผ JavaScript ๋ฅผ ์„œ๋กœ ๋งค์นญ์‹œ์ผœ ๋™์ ์ธ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ๋ Œ๋”๋ง ์‹œํ‚ค๋Š” ๊ธฐ์ˆ ์„ Hydration ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์•„๋ž˜์˜ ๊ทธ๋ฆผ์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋” ์ดํ•ด๊ฐ€ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค.

render() ํ•จ์ˆ˜์™€ hydrate() ํ•จ์ˆ˜๋„ ๋น„๊ต๋ฅผ ํ•ด๋ณด์ž.

ReactDOM.render(element, container, [callback]);
// ์ œ๊ณต๋œ container ์— element ๋ฅผ ๋ Œ๋”ํ•˜๊ณ , component์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜
// ๊ธฐ์กด ์ž์‹์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ  ๊ธฐ์กด DOM ๋…ธ๋“œ์— ๊ตฌ์„ฑ์š”์†Œ๋ฅผ Insert

ReactDOM.render() ํ•จ์ˆ˜๋Š” ํŠน์ • ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธ๋”์ธ ์ง€์ •๋œ DOM ์š”์†Œ ํ•˜์œ„๋กœ ์ฃผ์ž…ํ•ด ๋ Œ๋”๋ง์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋˜๋ฉด ํŠน์ • ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ฝœ ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์„ธ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

ReactDOM.hydrate(element, container, [callback]);
// ๊ธฐ์กด ๋งˆํฌ์—…์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋ถ™์—ฌ์ฃผ๋Š” ๊ณผ์ •

ReactDOM.hydrate() ํ•จ์ˆ˜๋Š” ํŠน์ • ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ ์ง€์ •๋œ DOM ์š”์†Œ์˜ ํ•˜์œ„๋กœ hydrate ์ฒ˜๋ฆฌ๋งŒ ๋‹ด๋‹นํ•œ๋‹ค. ๋ Œ๋”๋ง์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์›น ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•  DOM ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๊ธฐ์กด DOM Tree ์—์„œ ํ•ด๋‹นํ•˜๋Š” DOM ์š”์†Œ๋ฅผ ์ฐพ์•„ ์ •ํ•ด์ง„ javascript ์†์„ฑ๋“ค๋งŒ ๋ถ€์ฐฉ์‹œํ‚จ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.


๐Ÿฅฒ ์ดํ•ด๊ฐ€ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„,

CSR ๊ณผ SSR ์˜ ๋ Œ๋”๋ง ๋ฐฉ์‹์˜ ์ฐจ์ด์ ์„ ์ด์•ผ๊ธฐํ•˜๋ผ๊ณ  ํ•˜๋ฉด ๋„ˆ๋ฌด๋‚˜ ๋ช…ํ™•ํ•ด์„œ, ์„ค๋ช…์ด ์‰ฌ์› ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ Pre-rendering ๊ณผ SSR์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ์ง€ ์ฒ˜์Œ์—๋Š” ๋ˆˆ์— ํ™• ๋“ค์–ด์˜ค์ง€ ์•Š์•˜๋‹ค. ๊ฒฐ๊ตญ์€ HTML ์„ ์„œ๋ฒ„์—์„œ ๊ทธ๋ ค์ฃผ๊ณ  ์‘๋‹ต์œผ๋กœ ๋‚ด๋ ค์ฃผ๋ฉด, ์ดํ›„์— JavaScript ์ฝ”๋“œ๊ฐ€ ๋Œ๋ฉด์„œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ ์›น์‚ฌ์ดํŠธ๊ฐ€ ๋œ๋‹ค๋Š”๊ฒƒ ์•„๋‹Œ๊ฐ€? ์‹ถ์—ˆ๊ธฐ์—..

ํ•˜์ง€๋งŒ ์ด ๋‘๊ฐ€์ง€์˜ ์ฐจ์ด์ ์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด JavaScript ์ฝ”๋“œ์˜ ๋‹ค์šด๋กœ๋“œ ์‹œ์ ์— ์ฃผ๋ชฉํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ๋“ค์„ ๋น„๊ตํ•˜๋ฉด Pre-rendering ์˜ ๊ฒฝ์šฐ์—๋Š” JavaScript ๋Š” ์„œ๋ฒ„์—์„œ static HTML ์„ ๋ณด๋‚ด์ฃผ๋Š” ์‹œ์ ์— ํ•จ๊ป˜ ์ „์†ก์ด ๋˜์ง€๋งŒ, SSR์˜ ๊ฒฝ์šฐ์—๋Š” HTML์„ ํด๋ผ์ด์–ธํŠธ ์ธก์— ๋ณด๋‚ด์–ด ๋ Œ๋”๋ง์„ ๋๋‚ธ ์‹œ์ ์— JavaScript ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค.

ํ  ๊ทธ๋Ÿผ SSR์—์„œ์˜ Pre-rendering ์œผ๋กœ Uncanny Valley ๋ฅผ ์ค„์˜€๋‹ค๊ณ  ๋ณด๋ฉด๋˜๋Š”๊ฑธ๊นŒ..? Hoxy ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋‹ฌ์•„์ฃผ์‹ญ์‡ผ!

์ถœ์ฒ˜ : https://www.blog.duomly.com/client-side-rendering-vs-server-side-rendering-vs-prerendering/


๐Ÿ‘ฉ๐Ÿปโ€๐ŸŒพ ๋งˆ๋ฌด๋ฆฌ

์‚ฌ์‹ค ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด์„œ ์‘ ๊ทธ๋ƒฅ ์ด๋Ÿฐ๊ฒŒ ์žˆ๊ตฌ๋‚˜~ ํ•˜๋ฉด์„œ ๋„˜๊ฒผ๋˜ ๋ถ€๋ถ„๋“ค์„ ์ œ๋Œ€๋กœ ์งš์„ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์‹ค ์ด๊ฒƒ๋“ค์„ ๋ณด๊ธฐ ์ „์— ๊ฒช๊ณ ์žˆ๋˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ์€ ๊ฐ์ด ์ข€ ์žกํžŒ ๊ฒƒ ๊ฐ™์•„์„œ ์–ผ๋ฅธ ๋‹ค์‹œ ์ฐพ์•„๋ด์•ผ๊ฒ ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋ถ€๋ถ„์ด ๋งž๋Š”์ง€โ€ฆ! ๊ทธ๋ฆฌ๊ณ  Next.js ์—์„œ์˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ Œ๋”๋ง ๋ฐฉ์‹๋„ ์กฐ๋งŒ๊ฐ„ ์ œ๋Œ€๋กœ ์ •๋ฆฌ๋ฅผ ํ•ด๋ด์•ผ๊ฒ ๋‹ค. ์˜ค๋Š˜๋„ ๊ณต๋ถ€ํ•  ๊ฒƒ๋“ค ํ•˜๋‚˜ ์ง€์› ๊ณ , ๋‘ ๊ฐœ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค! ๐Ÿ˜


์ฐธ๊ณ