Rendering Patterns - team-yaza/mozi-client GitHub Wiki
์๋ ํ์ธ์ ์ํํธ์จ์ด ๋ง์์คํธ๋ก ์ฐ์์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์ดํ์ง ์ ๋๋ค. ์น ํ์ด์ง๋ฅผ ๊ทธ๋ฆฌ๋ ๋ค์ํ ๋ ๋๋ง ๋ฐฉ์ ์ฆ Rendering Pattern๋ค์ ๋ํด ์ด์ผ๊ธฐ ํด๋ณด๊ฒ ์ต๋๋ค.
๋ ๋๋ง์ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ์น ํ์ด์ง๋ฅผ ๊ทธ๋ฆฌ๋ ๊ฒ์ ๋งํฉ๋๋ค. ๋จผ์ ์ ์ ๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ์ด์ ์๋ต์ผ๋ก HTML, CSS, JavaScript๋ฅผ ๋ณด๋ด์ค๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฅผ ํด์ํ์ฌ ์น ํ์ด์ง๋ฅผ ๊ทธ๋ฆฝ๋๋ค. (๋ ๋๋ง์ ์ํํ๋ ๋ธ๋ผ์ฐ์ ์ ํ๋ก์ธ์ค๋ฅผ ๋ ๋๋ฌ ํ๋ก์ธ์ค๋ผ๊ณ ํฉ๋๋ค.)
๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ HTML, CSS, JavaScript๋ฅผ ๊ทธ๋ฆฌ๋ ๊ณผ์ (์ ์ฐจ)๋ฅผ CRP
(Critical Rendering Path)๋ผ๊ณ ํฉ๋๋ค.
์ด ๊ณผ์ ์ ์ฐ์ DOM Tree์ CSSOM Tree๋ฅผ ๋ง๋ค๊ณ , ์ด ๋์ ๊ฒฐํฉํ์ฌ Render Tree๋ฅผ ๋ง๋ญ๋๋ค. ๋ค์์๋ Render Tree๋ฅผ ๋ฐฐ์นํ๋ Layout๊ณผ์ , ํ๋ฉด์ ์ง์ ๊ทธ๋ฆฌ๋ Paint ๊ณผ์ ์ ๋ฐ๋ฆ
๋๋ค.
์ ๊ทธ๋ฆผ์์ DOM Tree ๋ถํฐ Render Tree๋ฅผ ๋ง๋ค๊ธฐ๊น์ง๋ฅผ Construction
๊ณผ์ , Layout๊ณผ Paint๋ฅผ Operation
๊ณผ์ ์ด๋ผ๊ณ ํฉ๋๋ค.
CRP
๋ฅผ ์์์ผํ๋ ์ด์ ๋ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋๊ฐ ๋ ๋๋ง์ ์ง์ ์ ์ผ๋ก ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์
๋๋ค.
์๋ฅผ ๋ค์ด ํน์ ์์๋ฅผ ์๋ณด์ด๊ฒ ์ฒ๋ฆฌํ๊ณ ์ถ์ ๋ display: none
์ ์ฌ์ฉํ๋ค๋ฉด Tree๋ค์ ๋ง๋๋ Construction
๊ณผ์ ๋ถํฐ Operation
๊ณผ์ ๊น์ง ๋ค์ ์งํํ๊ธฐ ๋๋ฌธ์ ๋ ๋๋ง ๊ณผ์ ์ ์์ด์ ๋นํจ์จ์ฑ์ ์ด๋ํฉ๋๋ค. ๋ฐ๋ผ์ opacity
๋ visibility
์์ฑ์ ์ฌ์ฉํ๋๊ฒ์ด ๋ ํจ์จ์ ์
๋๋ค.
์ด์ ์์์์ ์ ์ ์๋ ์ฌ์ค์ ๋ ๋๋ง์ UX
(User Experience)์ DX
(Developer Experience)์ ์ง์ ์ ์ผ๋ก ์ํฅ์ ๋ฏธ์น๋ค๋ ๊ฒ ์
๋๋ค. ๊ฐ๋ฐ์๊ฐ ์์ฑํ๋ ์ฝ๋์ ๋ฐ๋ผ ๋ ๋๋ง์ ์๋๊ฐ ๋ฌ๋ผ์ง ์ ์๊ณ ๊ฐ๋ฐ์๋ ์ดํ๋ฆฌ์ผ์ด์
์ ์ฒซ ์ฌ์ฉ์(First User)์ด๊ธฐ๋ ํ๋ฏ๋ก DX
์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๋ํ ๊ฐ๋ฐ์๊ฐ ์ฑํํ ๋ ๋๋ง ํจํด์ ์ต์ด ์ ์ ์ธ ๊ฐ๋ฐ์์๊ฒ ์ํฅ์ ๋ฏธ์น๊ณ ์ด๋ ๊ฒฐ๊ตญ UX
์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ฌ๋ฐ๋ฅธ ๋ ๋๋ง ๋ฐฉ๋ฒ์ ์ฑํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ค ๋ ๋๋ง ํจํด์ด ์ฌ๋ฐ๋ฅธ ๊ฒ ์ผ๊น์? ๋, ์ฌ๋ฐ๋ฅด๋ค๋ ๊ธฐ์ค์ ๋ฌด์์ผ๊น์?
์ฌ๋ฐ๋ฅธ ๋ ๋๋ง ํจํด์ด๋, ์ฐ๋ฆฌ์ ์ดํ๋ฆฌ์ผ์ด์
์ ํน์ฑ์ ๋ง๊ณ , UX
์ DX
๋ฅผ ๋ชจ๋ ๋์ฌ์ฃผ๋ ํจํด์ ๋งํฉ๋๋ค.
์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋ ๊ณ ๋ คํด์ผ ํ ์์๋ ๊ฒ์์์ง ์ต์ ํ, Web Performance๋ฑ์ด ์์ต๋๋ค. ๊ฒ์์์ง ์ต์ ํ๋ SSR(Server Side Rendering) ํด๊ฒฐํ ์ ์์ต๋๋ค.
Web Performance์์ ๊ณ ๋ คํ ์ ์ ๊ตฌ๊ธ์์ ์ ์ํ๋ ์น ์ฌ์ฉ์ ๊ฒฝํ์ ๋ํ ์งํ์ธ Core Web Vitals์ ๋๋ค.
TTFB
(Time To First Byte): ์น ํ์์ง ์ปจํ ์ธ ์ ์ฒซ byte๊ฐ ๋ธ๋ผ์ฐ์ ์ ๋๋ฌํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐFCP
(First Contentful Paint): ์ด๊ธฐ DOM ์ปจํ ์ธ ๋ฅผ ๋ ๋๋งํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐLCP
(Largest Contentful Paint): ๊ฐ์ฅ ํฐ ์ปจํ ์ธ (๋ณดํต ์ค์ํ ์ปจํ ์ธ ์ผ์๋ก ํฌ๊ธฐ๊ฐ ํผ)๋ฅผ ํ์ด์ง์ ๋ ๋๋งํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐTTI
(Time To Interactive): ์ปจํ ์ธ ์ ์ํธ์์ฉ๊น์ง์ ์๊ฐ(CSR์์๋ TTV(Time To View)์ TTI๊ฐ ๊ฐ๊ณ SSR์์๋ TTV์ TTI๊ฐ ๋ค๋ฅด๋ค.)CLS
(Cumulative Layout Shift): ๋์ ๋ ์ด์์ ์ด๋์ผ๋ก ์ฌ์ฉ์๊ฐ ์์์น ๋ชปํ ๋ ์ด์์ ์ด๋์ ๊ฒฝํํ๋ ๋น๋๋ฅผ ์๋ํ. ์๊ฐ์ ์์ ์ฑ์ ์ธก์ ํ ๋ ์ค์ํ ์ฌ์ฉ์ ์ค์ฌ ๋ฉํธ๋ฆญFID
(First Input Delay): ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ฒ์ ์ํธ ์์ฉํ ๋(๋ฒํผ ํด๋ฆญ ๋ฑ) ๋ถํฐ ํด๋น ์ํธ ์์ฉ์ ๋ํ ์๋ต์ผ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ์ค์ ๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ฒ๋ฆฌ๋ฅผ ์์ํ๊ธฐ๊น์ง์ ์๊ฐ์ ์ธก์ ํ๋ ์งํ.
์ด Core Web Vitals๋ '์ด๋ค ๋ฐฉ์์ผ๋ก ๋ ๋๋ง์ ํ๋'์ ๋ฐ๋ผ ์์น๊ฐ ๋ฌ๋ผ์ง๋๋ค.
'์ด๋ค ๋ฐฉ์์ผ๋ก ๋ ๋๋ง์ ํ๋'๋ ์ด๋ค ๋ ๋๋ง ํจํด์ผ๋ก ํ์ด์ง๋ฅผ ๋ ๋๋ง ํ ๊ฒ์ธ๊ฐ๋ก ๊ท๊ฒฐ๋ฉ๋๋ค.
Core Web Vitals๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ ๋๋ง ํจํด๋ค์ ํน์ง์ ์์๋ณด๊ฒ ์ต๋๋ค.
CSR์ ๋ ๋๋ง ๊ณผ์ ์ ๋จผ์ ์ ์ ์ ์์ฒญ์ ์ํด ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ก ํธ์๋ ์๋ฒ๋ก HTML์ ์์ฒญํฉ๋๋ค. ์๋ฒ๋ ๋น๋ ํ์์ ๋ฏธ๋ฆฌ ์์ฑํด ๋ HTML์ ์๋ตํฉ๋๋ค. ์ด HTML์๋ ๋ก๋๋ skeleton UI๊ฐ ๋ค์ด ์์ต๋๋ค.
๊ทธ ํ์ head ํ๊ทธ์ ์ ์๋ CSS์ ๊ฐ์ ๋ ๋๋ง ์ฐจ๋จ ๋ฆฌ์์ค(๋ค์ด๋ก๋๋๊ธฐ ์ ๊น์ง ๋ ๋๋ง์ ๋ง์)๋ฅผ ๋ค์ด ๋ฐ๋๋ฐ, ๋ณดํต ์ด๋ฐ ๋ฆฌ์์ค๋ ๋ธ๋ผ์ฐ์ ์ ์บ์ ์ฒ๋ฆฌํฉ๋๋ค.
๋ค์์ผ๋ก body ํ๊ทธ์ ๋ง์ง๋ง ๋ถ๋ถ์ ์์นํ React์ฑ์ด ๋ค์ด์๋ bundle์ ํ๋ก ํธ์๋ ์๋ฒ์ ์์ฒญํฉ๋๋ค. bundle์ bodyํ๊ทธ์ ๊ฐ์ฅ ์๋์ ์์น์ํค๋ ์ด์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฌธ์๋ฅผ ํ์ฑํ๋ค๊ฐ JavaScript๋ฅผ ๋ง๋๋ฉด ํ์ฑ์ ์ค์งํ๊ณ JavaScript ์์ง์๊ฒ ๊ถํ์ ๋๊ฒจ์ JS๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ ๋๋ค.(Parse Blocking Resource)
React์ฑ์ด ์คํ๋๋ฉด ์ด์ ์ปจํ ์ธ (๋ฐ์ดํฐ)๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด API ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ์์ ์ ์ ์๊ฒ ์ปจํ ์ธ ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์ ๋ด์ฉ์ ์ ๋ฆฌํ๋ฉด ์ ์ ๋ ์๋์ ๊ฐ์ ์์ฒญ์ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค.
- HTML ํ์ผ์ ์์ฒญํด์ ์๋ต์ ๋ฐ๊ณ
- JavaScript ๋ฒ๋ค์ ์์ฒญํด์ ์๋ต์ ๋ฐ๊ณ
- ๋ฒ๋ค์ ์คํํ๊ณ
- API ์๋ฒ๋ก ๋ถํฐ ์๋ต์ ๋ฐ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋ง
CSR์ Core Web Vitals ๊ด์ ์ผ๋ก ๋ณด๊ฒ ์ต๋๋ค. ์ฐ์ ์ค๋ฅธ์ชฝ ์๋์ ํ์๋ ํ๋์ ํ์๋ ๋ธ๋ผ์ฐ์ ์์ ์ผ์ด๋๋ ๊ณผ์ ์, ๋นจ๊ฐ์ ํ์๋ ์๋ฒ์์ ์ผ์ด๋๋ ๊ณผ์ ์ ๋ปํฉ๋๋ค. ๋ํ Network ๋ถ๋ถ๊ณผ Main Thread ๋ถ๋ถ์ ๋๋ด์ต๋๋ค.(Main Thread๋ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ฌ ํ๋ก์ธ์ค์ Main Thread๋ฅผ ๋งํฉ๋๋ค.) ์ ์ ๊ฐ HTML์ ์์ฒญํ๊ณ ์๋ฒ๊ฐ ์ด์ ์๋ตํ์ฌ ๋ธ๋ผ์ฐ์ ์ ์ปจํ ์ธ ์ ์ฒซ byte๊ฐ ๋๋ฌํ๋ ์๊ฐ์ TTFB๋ผ๊ณ ํฉ๋๋ค. ์ดํ์๋ HTML์ ํ์ฑํ๊ณ bodyํ๊ทธ ๋งจ ์๋์ script ํ๊ทธ์ ๋๋ฌํ๋ฉด bundle.jsํ์ผ์ ์๋ฒ์์ ๋ฐ์์ค๊ธฐ ์ํด ์์ฒญ์ ๋ณด๋ ๋๋ค. ์ด ๋ ๋ธ๋ผ์ฐ์ ์์๋ Operation๊ณผ์ ์ด ์ํ๋๊ณ bundle์ ๊ฐ์ ธ์ค๋ฉด ์ด์ JavaScript๋ฅผ Evaluationํ๋ฉด์ ๋ค์ Operation์ ์คํํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ง์น๋ฉด HTML์ JavaScript๊ฐ ์ฐ๊ฒฐ๋์ด์ ์ ์ ๊ฐ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ฐ๊ฒฐ๋ ๋ก์ง์ด ์ํ๋ฉ๋๋ค.(TTI)
์ด์ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด /api/buildings
๋ผ๋ ์๋ํฌ์ธํธ์ ์์ฒญ์ ๋ณด๋ด๊ณ , ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋ฐ๋ ๋ถ๋ถ์ ๋ค์ ๊ทธ๋ฆฌ๋๋ฐ ์ด ๊ณผ์ ์ hydration
์ด๋ผ๊ณ ํฉ๋๋ค.
hydration
์ด ์๋ฃ๋๋ ์๊ฐ์ด LCP
(Largest ContentFul Paint)๋ฅผ ์๋ฏธํฉ๋๋ค. LCP๋ ๋ณดํต ํ์ด์ง์์ ์ค์ํ ์์๋ฅผ ๋ก๋ํ๋๋ฐ ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ธ๋ฐ CSR์์๋ ์๋์ ์ผ๋ก ๋๋ฆฌ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
hydration
์ ์๊ฐ์ ์ผ๋ก ์ดํดํ๊ธฐ ์ํด ๋ฐ๋ชจ ํ์ด์ง๋ฅผ ๋ง๋ค์์ต๋๋ค.
hydrate
์ ์๋ถ์ ๊ณต๊ธํ๋ค
๋ผ๋ ๋ป์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ผ์ชฝ ๋ธ๋ผ์ฐ์ ์๋ skeleton UI๊ฐ ์๊ณ ์ค๋ฅธ์ชฝ ๋ธ๋ผ์ฐ์ ์๋ ๋น๋ฉ ๋ฐ์ดํฐ๊ฐ ์ฑ์์ ธ ์์ต๋๋ค.
์ฆhydration
์ด๋, API์์ฒญ์ ํตํด ๋ฐ์ดํฐ๋ผ๋ ์๋ถ์ ํ์ด์ง์ ๊ณต๊ธํด์ฃผ๋ ๊ฒ ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
hydration ํ์ด์ง๊ฐ ๋ธ๋ผ์ฐ์ ์ ๋ก๋๋๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์คํ๋๋ฉด์ ํ์ด์ง๊ฐ ์ธํฐ๋ ํฐ๋ธํ๊ฒ ๋์ํ๋ ์ํ๊ฐ ๋๋ ๊ณผ์
๋ค์์ผ๋ก SSR(Server Side Rendering)์ ๋๋ค. ์ ์ ๊ฐ ํ๋ก ํธ์์ค ์๋ฒ์ HTML ํ์ผ์ ์์ฒญํ๋ฉด ์๋ฒ๋ API ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ปจํ ์ธ ๋ฅผ ์ฑ์ฐ๊ณ ์์ฑ๋ HTML ํ์ผ์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ด์ค๋๋ค.
๊ธฐ์กด React์ฑ์ด ์คํ๋ ํ์ ๋ณด๋ด๋ API ์์ฒญ์ ์๋ฒ์์ ๋ฏธ๋ฆฌ ๋ณด๋ด๋ ๊ฒ ์ ๋๋ค. ๋ฐ๋ผ์ ์ ์ ๋ ํ๋ฒ์ ์์ฒญ๋ง์ผ๋ก ๋ณด๊ณ ์ถ์ ์ปจํ ์ธ ๋ฅผ ๋ฐ๋ก ๋ณด๊ฒ ๋ฉ๋๋ค.
SSR์ Core Web Vitals ๊ด์ ์ผ๋ก ๋ณด๊ฒ ์ต๋๋ค. SSR์ด ์ด๋ฃจ์ด์ง ํ ์ฒซ ๋ฐ์ดํธ๊ฐ ์ ์ ์๊ฒ ๋์ฐฉํ๊ณ , ์ ์ ์๊ฒ ๋์ฐฉํ HTML์ ์ปจํ ์ธ ๋ฅผ ํฌํจํ๊ธฐ ๋๋ฌธ์ ๊ทธ HTML์ ๋ ๋ํ๋ ์๊ฐ FCP(First Contentful Paint), LCP(Largest Contentful Paint)๊ฐ ๋์์ ๋ฐ์ํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก JS๋ฅผ ๋ก๋ฉํ๋ฉด ์ ์ ๊ฐ ์ธํฐ๋ ์ ๊ฐ๋ฅํ ํ์ด์ง๊ฐ ๋๋ฏ๋ก TTI๋ ๋ง์ง๋ง์ ์ผ์ด๋ฉ๋๋ค.
์ฌ๋ฌ๋ถ์ ์ปจํ
์ธ ๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ๋๋ค๋ฉด CSR๊ณผ SSR์ ๊ฐ์ด ํ์ฉํ ์ ์๋๋ฐ, SSR์ ๋ง์น๋ค์ hydration
๊ณผ์ ์ด ์ถ๊ฐ๋ฉ๋๋ค. hydration
๊ณผ์ ์๋ react-query๋ swr๊ฐ์ data-fetching ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฃผ๋ก ํ์ฉํฉ๋๋ค.
React์์๋ SSR์ ๊ตฌํํ๊ธฐ์ํด React ํ๋ ์์ํฌ์ธ Next.js๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Next.js๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ํ์ด์ง๋ฅผ pre-render(๋ฏธ๋ฆฌ ๋ ๋๋ง)ํฉ๋๋ค. Client Side JavaScript๊ฐ ํ์ด์ง์ HTML์ ๋ค ๊ทธ๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ ๋ฏธ๋ฆฌ ๊ฐ ํ์ด์ง๋ฅผ ์ํ HTML์ ์์ฑํฉ๋๋ค.
๊ฐ๊ฐ ์์ฑ๋ HTML ํ์ด์ง์๋ ์ต์ํ์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ฐ๊ฒฐ๋๊ณ Client Side์์๋ ์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ก hydration
๊ณผ์ ์ด ์ผ์ด๋ฉ๋๋ค.
Next.js์ pre-rendering ํํ๋ SSG
(Static Site Generation)๊ณผ SSR
(Server Side Rendering)์ผ๋ก ๋๋๋ฉฐ ๊ฐ ํ์ด์ง๋ณ๋ก ๋ค๋ฅด๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด Page A๋ SSG
๋ก, Page B๋ SSR
๋ก, Page C๋ CSR + SSR
๋ก, Page D๋ CSR
๋ก ๋ ๋๋ง ํ ์ ์์ต๋๋ค.
Next.js์ pre-rendering ํํ์ค SSG
์ ๋ํด์ ๋จผ์ ์์๋ณด๊ฒ ์ต๋๋ค. SSG
๋ ๋น๋ ํ์์ HTML ํ์ด์ง๋ฅผ ์์ฑํฉ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ API ์์ฒญ ๋ํ ๋น๋ ํ์์๋ง ์คํํฉ๋๋ค. ๋ฐ๋ผ์ API ์๋ฒ์ ๋ถํ๊ฐ ์ค์ด๋ญ๋๋ค. ๋ํ, ๋ง๋ค์ด์ง ์ปจํ
์ธ ๋ฅผ CDN์ ์บ์ํจ์ผ๋ก์จ ์ฌ์ฉ์์๊ฒ ์ปจํ
์ธ ๋ฅผ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ ๋ฌํ ์ ์์ต๋๋ค.
๋จ์ ์ผ๋ก๋ ๋น๋ ํ์์ ์ปจํ
์ธ ๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋ณํ๋ ๋ฐ์ดํฐ์ ์ทจ์ฝํฉ๋๋ค.
SSG
์ CSR
์ ๊ณ๋ค์ด๋ฉด ๋ณํ์ง ์๋ ๋ถ๋ถ์ ๋ณํ์ง ์๊ฒ ๊ณ ์ ํ๊ณ , ์ ๋์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ fetching ํด์ผํ๋ ๋ถ๋ถ์ CSR
๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.(hydration
) ๋ํ, ๋ ๋ ๋๋ง ๋ฐฉ์์ ํฉ์ณค๊ธฐ ๋๋ฌธ์ ์ฅ์ ๋ํ ํฉ์ณ์ง๋๋ค.
ISR
(Incremental Static ReGeneration)์ SSG
์์ revalidation
์ต์
์ ์ถ๊ฐํ ๊ฒ ์
๋๋ค. ๋น๋ ํ์์ HTML์ ์์ฑํ๋ ๊ฒ์ ๋์ผํ๋ ์ผ์ ์ฃผ๊ธฐ๋ง๋ค ๋ฐ์ดํฐ์ ์ต์ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํด์ ์
๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ก ํ์ด์ง๋ฅผ ๋ค์ ์์ฑํฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก CSR
์ ๊ณ๋ค์ด๋ฉด ๋ฐ๋๊ธด ํ๋๋ฐ ์์ฃผ ๋ณํ์ง ์๋ ๋ฐ์ดํฐ๋ ISR
์ ๋ ๋๋ง ๋ฐฉ๋ฒ์, ๋์ ์ผ๋ก ๊ณ์ ๋ฐ๋๋ ๋ฐ์ดํฐ๋ค์ CSR
๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ธ๋ก๊ทธ ๊ธ(์์ฃผ ์๋ฐ๋)๊ณผ ๋๊ธ(์์ฃผ ๋ฐ๋)์ ์ด ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก SSG
๋ํ Core Web Vitals ๊ด์ ์ผ๋ก ๋ณด๊ฒ ์ต๋๋ค.
SSG
๋ก ๋ง๋ค์ด์ง ์ฌ์ดํธ์ด๊ธฐ ๋๋ฌธ์ ๋น๋ ํ์์ ์ด๋ฏธ HTML์ด ์์ฑ๋์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋ฒ์์๋ ๋ง๋
ํ ํ ์ผ์ด ์๊ธฐ ๋๋ฌธ์ HTML์ ๋ฐ๋ก ์ฃผ๊ณ ํด๋ผ์ด์ธํธ๋ ๊ทธ HTML์ ๋ฐ๋ก ๋ ๋๋งํฉ๋๋ค. CSR
์ ๊ณ๋ค์ธ๋ค๋ฉด ๋ค์ hydration
๊ณผ์ ์ด ์ถ๊ฐ๋๊ฒ ์ฃ .
๋ค์ SSR
์
๋๋ค. SSR
์ด์ผ๊ธฐ๋ฅผ ๋ค์ ๊บผ๋ธ ์ด์ ๋ Next.jsSSR
์ Page๋จ์ data fetching์ ์์ต๋๋ค.
getServerSideProps
๋ผ๋ ํจ์๋ API์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ํ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ props๋ฅผ ๋ฆฌํดํด์ฃผ๋ฉด ํ์ด์ง ์ปดํฌ๋ํธ๋ ๊ทธ props๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ง์ฝ CSR
์์ SSR
๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ค๊ณ ํ๋ฉด ๊ธฐ์กด ํด๋ผ์ด์ธํธ ์ฌ์ด๋์ data fetching ๋ก์ง์ getServerSideProps
๋ก ์ฎ๊ธฐ๋ฉด ๋ฉ๋๋ค. ํ์ง๋ง ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ฌ๋ฌ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ fetching ํ๋ค๋ฉด ์ฒ๋ฆฌ๊ฐ ์ด๋ ค์์ง๋๋ค. ๋ํ props drilling์ ํ๋ฉด ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๊ฐ ๋์ง ์์ผ๋ฏ๋ก(์ ์์ ์์ A์ปดํฌ๋ํธ๋ data์ ๊ด์ฌ์ด ์์) ์ข์ง ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์
๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด RSC(React Server Component)์ ๋๋ค. RSC๋ ์ปดํฌ๋ํธ ๊ฐ๋ณ ๋จ์๋ณ๋ก ์๋ฒ์์ data fetching์ ํ ์ ์์ผ๋ฉฐ ์๋ฒ์ ๋ฆฌ์์ค์ ์์ ๋กญ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ํ ์๋ฒ์ปดํฌ๋ํธ๋ ํด๋ผ์ด์ธํธ๋ก ์ ์ก๋๋ ๋ฒ๋ค์ ํฌํจ๋์ง ์์ผ๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ์ ์งํ๋ฉฐ refetchํ ์ ์์ต๋๋ค.
๊ฒฐ๊ตญ ์ด๋ฐ ๋ ๋๋ง ํจํด๋ค์ ์์์ผํ๋ ์ด์ ๋ ๋ ๋๋ง ํจํด์ด UX์ DX์ ์ง์ ์ ์ผ๋ก ์ฐ๊ด์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฐ๋ฆฌ๋ ํํ ์ด๋ฐ ๊ฐ๋ฐ ์ฌ์ดํด์ ๋๊ณค ํฉ๋๋ค. ์์ฒญ๋ ์์ด๋์ด๊ฐ ๋ ์ค๋ฅด๊ณ , ๊ฐ๋ฐ์ ํ ํ ๋ฐฐํฌ๋ฅผ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ๊ณผ์ ์์ ๋ ๋๋ง ํจํด์ ์ธ์ ๊ณ ๋ ค๋์ด์ผ ํ ๊น์?
์ ๋ต์ ์์ต๋๋ค. ์ด๋์๋ ์ง ๋ ๋๋ง ํจํด์ ๊ณ ๋ คํ ์ ์์ง๋ง, ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ด๋ค ์ปจํ ์ธ ๋ฅผ ๋ ๋๋งํ๋์ ๋ฐ๋ผ ์ ์ฉํ ํจํด์ด ๋ฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ ๋ ํน์ ํจํด์ด ์ข๊ณ ๋์๊ณ ๋ฅผ ์ฃผ์ฅํ๋ ๊ฒ์ด ์๋๋๋ค. ๋จ์ง ์น์ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์๋ ๋ค์ํ ๋ ๋๋ง ํจํด์ด ์กด์ฌํ๊ณ , ์ด ํจํด๋ค์ ๋ชจ๋ trade-off๊ฐ ์์ ๋ฟ ์ ๋๋ค.
์ด ๋ฐํ๊ฐ ํจ์จ์ ์ธ ๋ ๋๋ง ํจํด์ ์ฐพ๋๋ฐ ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.