Skip to content

Next.js Rendering Patterns (feat. SSG, SSR, ISR, CSR)

์•ˆ๋…•ํ•˜์„ธ์š” NextJS ์›น ํ”„๋ ˆ์ž„ ์›Œํฌ์— ๋Œ€ํ•ด ๋ฐœํ‘œํ•˜๊ฒŒ ๋œ ๊น€๋Œ€๊ฑด์ž…๋‹ˆ๋‹ค

โœ๏ธ NextJS ๋ž€ ? โ€‹

NextJS ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? NextJS ๊ณต์‹ ์›น์‚ฌ์ดํŠธ์— ๋“ค์–ด๊ฐ€๋ฉด

React Framework For the WEB

์›น์„ ์œ„ํ•œ ๋ฆฌ์•กํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ๋ผ๊ณ  ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค

๋ฆฌ์•กํŠธ๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ผ๋Š”๊ฒƒ์€ ์•„๋งˆ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ๊ฒฝํ—˜ํ•ด ๋ณธ ์‚ฌ๋žŒ๋“ค์€ ํ•œ๋ฒˆ์”ฉ ๋“ค์–ด๋ณด์…จ์„ ๊ฒ๋‹ˆ๋‹ค

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Client Side Routing ์„ ์œ„ํ•ด์„œ๋Š” React Router DOM ์„, ์‚ฌ์ „๋ Œ๋”๋ง๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์œ„ํ•ด์„œ๋Š” React Snap ์ด๋‚˜ SSR ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์•ผํ•˜๊ณ , Code Splitting ์„ ์œ„ํ•ด์„œ๋Š” React.lazy ๋‚˜ ๋ฒˆ๋“ค๋Ÿฌ ์„ค์ •์„ ์ถ”๊ฐ€๋กœ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

NextJS ๋Š” ๋ฆฌ์•กํŠธ ๊ธฐ๋ฐ˜์˜ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋“ค์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ์ค‘์—์„œ ์ €๋Š” ๋ Œ๋”๋ง ํŒจํ„ด์— ์ค‘์ ์„ ๋งž์ถ”์–ด ๋ฐœํ‘œ๋ฅผ ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

โœ๏ธ Rendering? ๋ Œ๋”๋ง์ด๋ž€? โ€‹

๊ทธ๋ ‡๋‹ค๋ฉด NextJS ์˜ ๋ Œ๋”๋ง ํŒจํ„ด์„ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ์— ์•ž์„œ, ๋ Œ๋”๋ง(Rendering) ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

์šฐ๋ฆฌ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์œ ํŠœ๋ธŒ์— ์ ‘์†ํ•˜๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

Client - Server ์•„ํ‚คํ…์ณ์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›น์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, WAS (Web Application Server) ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ ๋™์  ์ปจํ…์ธ ๋ฅผ ๋กœ๋“œํ•˜๊ณ , ์ถ”๊ฐ€์ ์œผ๋กœ ์š”์ฒญ์— ๋งž๋Š” HTML, CSS, JS ๋“ฑ๊ณผ ๊ฐ™์€ ์ •์  ์ž์›์„ ์‘๋‹ต์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋Š” HTML, CSS, JS ๋ฅผ ํ•ด์„ํ•˜์—ฌ ํ™”๋ฉด์— ์›นํŽ˜์ด์ง€๋ฅผ ๊ทธ๋ฆฌ๊ฒŒ๋˜๋Š”๋ฐ, ์ด ๊ณผ์ •์„ Rendering ๋ Œ๋”๋ง ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค

๊ทธ๋ ‡๋‹ค๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ Œ๋”๋ง์„ ์–ด๋–ค ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๋Š”์ง€ ๊ฐ„๋žตํ•˜๊ฒŒ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ Œ๋”๋งํ•˜๋Š” ๊ณผ์ •์„ Critical Rendering Path ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค

Construction ๋‹จ๊ณ„ โ€‹

๋จผ์ € ๋ธŒ๋ผ์šฐ์ €๋Š”

  1. HTML ์„ ๋ฐ›์•„ ํŒŒ์‹ฑ์„ ์ง„ํ–‰ํ•˜๊ณ , DOM Tree ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค
  2. ์ดํ›„ <style/> ํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด DOM ์ƒ์„ฑ์„ ์ž ์‹œ ์ค‘๋‹จํ•˜๊ณ , CSS ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ CSSOM Tree ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. CSSOM Tree ๊ฐ€ ์™„์„ฑ๋˜๋ฉด, DOM ์ƒ์„ฑ์„ ์žฌ๊ฐœํ•˜๊ณ  <script/> ํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด ๋‹ค์‹œ DOM ์ƒ์„ฑ์„ ์ค‘๋‹จํ•˜๊ณ , ์ œ์–ด๊ถŒํ•œ๊ธฐ JS ์—”์ง„์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ด๋Š” DOM API (document.querySelector ์™€ ๊ฐ™์€ ํ•จ์ˆ˜) ๊ฐ€ DOM ์„ ์กฐ์ž‘ํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค
  4. JS ๋Š” ํŒŒ์‹ฑ๋˜์–ด ์ถ”์ƒ๊ตฌ๋ฌธํŠธ๋ฆฌ AST Tree ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ , JS ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค
  5. ์ดํ›„ DOM ํŠธ๋ฆฌ๋ฅผ ๋งˆ์ € ์™„์„ฑ์‹œํ‚ค๊ณ , DOM Tree, CSSOMTree ๋ฅผ ํ•ฉ์ณ Render Tree ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค

์—ฌ๊ธฐ ๊นŒ์ง€์˜ ๊ณผ์ •์„ construction ๋‹จ๊ณ„๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค

Operation ๋‹จ๊ณ„ โ€‹

๋‹ค์Œ์œผ๋กœ Render Tree ์˜ ๋…ธ๋“œ๋ฅผ ํ‘œ์‹œํ•  ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” Layout ๋‹จ๊ณ„์™€, Render Tree ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ Node ๋ฅผ ๊ทธ๋ฆฌ๋Š” Paint ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ,

z-index ๊ฐ€ ๋‚ฎ์€ ์š”์†Œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๋ ˆ์ด์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” composition ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค

โœ๏ธ Core Web Vitals โ€‹

๋ Œ๋”๋ง ํŒจํ„ด์€ UX ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ข‹์€, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋งž๋Š” ๋ Œ๋”๋ง ํŒจํ„ด์€ ๋ฌด์—‡์ผ๊นŒ์š”?

๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ Œ๋”๋ง ํŒจํ„ด๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ์— ์•ž์„œ์„œ, ๊ตฌ๊ธ€์—์„œ ์ œ์•ˆํ•˜๋Š” ์›น ํŽ˜์ด์ง€๋“ค์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ‰๊ฐ€ํ•˜๋Š” ์ง€ํ‘œ์ธ Core Web Vitals ์— ๋Œ€ํ•ด ์ž ๊น ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค


โœ๏ธ Rendering Patterns โ€‹

์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ Œ๋”๋ง ํŒจํ„ด๋“ค์— ๋Œ€ํ•ด ์›น์ด ๋ฐœ์ „ํ•˜๊ฒŒ ๋œ ์ˆœ์„œ๋Œ€๋กœ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

Static Site โ€‹

๊ฐ€์žฅ ๋จผ์ € Static Site ์ž…๋‹ˆ๋‹ค.

์ดˆ๊ธฐ์— ์›น์€ ์ •์ ์ธ ์ปจํ…์ธ ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š”๊ฒƒ์— ๊ทธ์ณค์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŠน์ • ํŽ˜์ด์ง€์— ์ ‘์†ํ•˜๋ฉด, ์ •์ ์ธ HTML, CSS, JS ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. AWS S3 ๋ฒ„ํ‚ท๊ณผ ๊ฐ™์€ ์ €์žฅ์†Œ์— ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜, NginX ๋“ฑ์„ ์‚ฌ์šฉํ•ด ์ •์ ์ธ ํŽ˜์ด์ง€๋Š” ์„œ๋น™๋ฉ๋‹ˆ๋‹ค

Static Site ๋ฅผ Core Web Vitals ๊ด€์ ์—์„œ ๋ณด๋ฉด,

์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ธ TTI ์™€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฒ˜์Œ ๊ทธ๋ ค์ง€๋Š” FCP ์™€์˜ ์‹œ๊ฐ„์ด ๋™์ผํ•œ ์žฅ์ ์ด ์žˆ๊ณ , ๊ฒ€์ƒ‰์—”์ง„ ํฌ๋กค๋ง ๋ด‡์ด, ํŽ˜์ด์ง€๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™” SEO ์— ์ข‹์Šต๋‹ˆ๋‹ค

ํ•˜์ง€๋งŒ, ๋™์  ๋ฐ์ดํ„ฐ์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Server Side Rendering (SSR) โ€‹

๋‹ค์Œ์œผ๋กœ๋Š” ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์ž…๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ ๋งˆ๋‹ค, ์„œ๋ฒ„์—์„œ HTML ๊ณผ Data ๊ฐ€ ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

์š”์ฒญ์— ๋”ฐ๋ผ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•œ ์™„์„ฑ๋œ HTML ์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. JSP, TimeLeaf, HandleBars ๋“ฑ๊ณผ ๊ฐ™์€ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Static Site ์™€ ๋™์ผํ•˜๊ฒŒ TTI ์™€ FCP ๊ฐ€ ๋™์ผํ•˜๋‹ค๋Š” ์ ๊ณผ SEO ์— ์ข‹๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ์‚ฝ์ž… ํ›„, ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ด๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— TTFP ๊ฐ€ ๋А๋ฆฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๊ณ , ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ์ ‘์†ํ•  ๋•Œ ๋งˆ๋‹ค, ์ƒˆ๋กœ์šด HTML ์„ ์š”์ฒญํ•˜๊ณ  ํ™”๋ฉด์ด ๊นœ๋ฐ•์—ฌ UX ์— ์ข‹์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค

Client Side Rendering (CSR) ์™€ Single Page Application (SPA) โ€‹

์ฒ˜์Œ์—๋Š” ์œ„ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœ์ด ๋˜์—ˆ๋Š”๋ฐ, AJAX ๋ผ๋Š” ๊ธฐ์ˆ ์ด ๋‚˜์˜ค๊ฒŒ ๋˜๋ฉด์„œ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ๋™์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด์กŒ๊ณ ,

์ด์— ๋”ฐ๋ผ React, Angular, Vue ์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ฐœ์ „ํ•˜์—ฌ ์•ฑ๊ณผ๊ฐ™์€ ๋ถ€๋“œ๋Ÿฌ์šด ํ™”๋ฉด ์ „ํ™˜์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค

ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜๋ฉด, HTML ๊ณผ CSS ๋ฅผ ๋ฐ›๊ณ , ๋นŒ๋“œ๋œ JS ๋ฒˆ๋“ค ํŒŒ์ผ์„ ์‘๋‹ต์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค

์ดํ›„, ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ JS (React) ๋ฅผ ์‚ฌ์šฉํ•ด DOM ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋ฉฐ ๋ Œ๋”๋ง์„ ์ง„ํ–‰ํ•˜๊ณ , AJAX ์š”์ฒญ์„๋ณด๋‚ด์„œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋™์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค

์•ฑ์ฒ˜๋Ÿผ ๋ถ€๋“œ๋Ÿฌ์šด ์ „ํ™˜๊ณผ ์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ UX ์— ์ข‹์ง€๋งŒ, ๊ฒ€์ƒ‰์—”์ง„ ํฌ๋กค๋ง ๋ด‡์ด ํ…… ๋นˆ HTML ์„ ํฌ๋กค๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™” SEO ์— ์ข‹์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค ๋˜ํ•œ, JS ๋ฒˆ๋“ค ํŒŒ์ผ์ด ํฌ๋‹ค๋ฉด, TTFP ๊ฐ€ ๋А๋ ค์ง€๊ณ , FCP ์™€ TTI ์˜ ์ฐจ์ด๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค

SSR with Hydration โ€‹

๋‹ค์Œ์œผ๋กœ ์•Œ์•„๋ณผ ํŒจํ„ด์€ NextJS ์—์„œ ์ง€์›ํ•˜๋Š” ๋ Œ๋”๋ง ํŒจํ„ด๋“ค์ž…๋‹ˆ๋‹ค.

๋จผ์ € SSR with Hydration ์ž…๋‹ˆ๋‹ค.

์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ์•ž์„œ ๋ดค๋˜ SSR ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค

NextJS ๋‚ด๋ถ€์ ์œผ๋กœ ์„œ๋ฒ„์‚ฌ์ด๋“œ์—์„œ ๋ฆฌ์•กํŠธ๋ฅผ ์ด์šฉํ•ด ๋ Œ๋”๋ง์„ ์ง„ํ–‰ํ•˜๊ณ , API ์š”์ฒญ์„ ๋ณด๋‚ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž… ํ›„, ์™„์„ฑ๋œ HTML ์„ ์‘๋‹ต์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค

์—ฌ๊ธฐ๊นŒ์ง€๋Š” SSR ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค

์ดํ›„, ์ถ”๊ฐ€์ ์œผ๋กœ React ์ฝ”๋“œ๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋กœ ํ•จ๊ป˜ ์ „์†ก๋˜์–ด Hydration ์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค

Hydration ์ด๋ž€, ์„œ๋ฒ„์—์„œ ์‚ฌ์ „๋ Œ๋”๋ง๋˜์–ด ๋งŒ๋“ค์–ด์ง„ HTML ์— React ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด, ์ดํ›„๋กœ๋Š” Client Side Rendering ์œผ๋กœ ์ „ํ™˜๋˜์–ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค

SSG with Hydration โ€‹

SSG with Hydration (Static Site Generation with Hydration) ์€ SSR with Hydration ๊ณผ ์œ ์‚ฌํ•˜๋‚˜,

์š”์ฒญ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋นŒ๋“œ์‹œ๊ฐ„์— ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์€ HTML ๋กœ ์ƒ์„ฑํ•ด๋‘๊ณ 

์ดํ›„, React ์ฝ”๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜๋Š” Hydration ์ด ์ง„ํ–‰๋˜๊ณ , API ์š”์ฒญ์€ AJAX ๋ฅผ ํ†ตํ•ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค

๋‘ ๋ Œ๋”๋ง ํŒจํ„ด ๋ชจ๋‘ ๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™”์— ์ข‹์ง€๋งŒ, TTFB ๊ฐ€ ๋А๋ฆฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค

Incremental Static Regeneration (ISR) โ€‹

๋งˆ์ง€๋ง‰์œผ๋กœ ISR ์ฆ๋ถ„์ •์  ์ƒ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค

SSR with Hydration ๊ณผ SSG with Hydration ์„ ํ•ฉ์นœ ๋ Œ๋”๋ง ํŒจํ„ด์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๋นŒ๋“œํƒ€์ž„์— ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์ „๋ Œ๋”๋ง๋œ HTML ์„ ์บ์‹ฑํ•˜๊ณ  (SSG with Hydration ๊ณผ ์œ ์‚ฌ) ์‘๋‹ต์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค

์ดํ›„, ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๊ณ  ์บ์‹œ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์„๋•Œ (๋งŒ๋ฃŒ ๋˜์—ˆ์„๋•Œ, revalidate ์‹œ๊ฐ„ ์ง€์ •) ์„œ๋ฒ„์—์„œ ๊ฐœ๋ณ„ ํŽ˜์ด์ง€๋ฅผ ์žฌ์ƒ์„ฑํ•˜์—ฌ ์บ์‹ฑํ•ฉ๋‹ˆ๋‹ค

์บ์‹ฑ๋œ ํŽ˜์ด์ง€์— ๋Œ€ํ•ด์„œ๋Š” TTFB ๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ๊ฐ€ ์ž์ฃผ ๋ฐ”๋€Œ๋Š” ์‚ฌ์ดํŠธ์—์„œ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

โœ๏ธ ๋งˆ์น˜๋ฉฐ โ€‹

alt text

๊ทธ๋ž˜์„œ ์ข‹์€ ๋ Œ๋”๋ง ํŒจํ„ด์€ ๋ญ๊ณ , ๋ญ˜ ์จ์•ผํ•œ๋‹ค ๋ผ๊ณ  ๋ฌป๋Š”๋‹ค๋ฉด, ๋”ฑํžˆ ์ •ํ•ด์ง„ ์ข‹์€ ํŒจํ„ด์€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ง•์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค

์˜ˆ๋ฅผ๋“ค์–ด

์ด๋ ฅ์„œ, ์ž๊ธฐ์†Œ๊ฐœ ํŽ˜์ด์ง€์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ๋“œ๋ฌธ ์‚ฌ์ดํŠธ์˜ ๊ฒฝ์šฐ, ๋นŒ๋“œ ํƒ€์ž„์— ์ •์ ์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” SSG ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ธ”๋กœ๊ทธ ๊ธ€๊ฐ™์€ ๊ฒฝ์šฐ ISR ์„, ์ž์ฃผ ๊ธ€์ด ์ถ”๊ฐ€, ์‚ญ์ œ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๊ฒŒ์‹œํŒ ์‚ฌ์ดํŠธ์˜ ๊ฒฝ์šฐ SSR ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ ํ•ฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์†Œ๊ฐœํ•ด๋“œ๋ฆฐ ๋ Œ๋”๋ง ํŒจํ„ด๋“ค ์™ธ์—๋„, React 18 ๋ฒ„์ „ ๋ถ€ํ„ฐ React Server Components ๊ฐ€ ๋„์ž…๋˜๋ฉด์„œ Streaming SSR, Island Architecture ๋“ฑ ์—ฌ๋Ÿฌ ํŒจํ„ด๋“ค์ด ๋งŒ๋“ค์–ด์ง€๊ณ  ์žˆ๋Š”๋ฐ, ๊ฐ ๋ Œ๋”๋ง ํŒจํ„ด์˜ ์žฅ๋‹จ์ ๊ณผ ํŠน์ง•์„ ์•Œ๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋†’์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค

๋ฐœํ‘œ ๋“ค์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

์ฐธ๊ณ  ์ž๋ฃŒ โ€‹