React hydrateμ λν μ’ ν© κ°μ΄λλ‘, μλ² μ¬μ΄λ λ λλ§, νμ΄λλ μ΄μ , μΌλ°μ μΈ λ¬Έμ λ° κ³ μ±λ₯ μΉ μ± κ΅¬μΆμ μν λͺ¨λ² μ¬λ‘λ₯Ό λ€λ£Ήλλ€.
React Hydrate: μλ² μ¬μ΄λ λ λλ§ νμ΄λλ μ΄μ κ³Ό 리νμ΄λλ μ΄μ μλ²½ ν΄λΆ
νλ μΉ κ°λ° μΈκ³μμλ λΉ λ₯΄κ³ λ§€λ ₯μ μΈ μ¬μ©μ κ²½νμ μ 곡νλ κ²μ΄ 무μλ³΄λ€ μ€μν©λλ€. μλ² μ¬μ΄λ λ λλ§(SSR)μ νΉν React μ ν리μΌμ΄μ μμ μ΄λ₯Ό λ¬μ±νλ λ° μ€μν μν μ ν©λλ€. νμ§λ§ SSRμ 볡μ‘μ±μ μΌκΈ°νλ©°, Reactμ `hydrate` ν¨μλ₯Ό μ΄ν΄νλ κ²μ κ³ μ±λ₯μ SEO μΉνμ μΈ μΉμ¬μ΄νΈλ₯Ό ꡬμΆνλ λ° ν΅μ¬μ λλ€. μ΄ μ’ ν© κ°μ΄λμμλ κΈ°λ³Έ κ°λ λΆν° κ³ κΈ μ΅μ ν κΈ°μ κΉμ§ React hydrateμ 볡μ‘ν λΆλΆμ κΉμ΄ νκ³ λλλ€.
μλ² μ¬μ΄λ λ λλ§(SSR)μ΄λ 무μμΈκ°?
μλ² μ¬μ΄λ λ λλ§μ μλ²μμ React μ»΄ν¬λνΈλ₯Ό λ λλ§νκ³ μμ ν λ λλ§λ HTMLμ λΈλΌμ°μ λ‘ λ³΄λ΄λ κ²μ ν¬ν¨ν©λλ€. μ΄λ λΈλΌμ°μ κ° μ΅μνμ HTML νμ΄μ§λ₯Ό λ€μ΄λ‘λν λ€μ JavaScriptλ₯Ό μ€ννμ¬ μ 체 μ ν리μΌμ΄μ μ λ λλ§νλ ν΄λΌμ΄μΈνΈ μ¬μ΄λ λ λλ§(CSR)κ³Όλ λ€λ¦ λλ€.
SSRμ μ₯μ :
- ν₯μλ SEO: κ²μ μμ§ ν¬λ‘€λ¬κ° μμ ν λ λλ§λ HTMLμ μ½κ² μΈλ±μ±ν μ μμ΄ κ²μ μμ§ μμκ° ν₯μλ©λλ€. μ΄λ μ μ μκ±°λ νλ«νΌμ΄λ λΈλ‘κ·Έμ κ°μ΄ μ½ν μΈ κ° λ§μ μΉμ¬μ΄νΈμ νΉν μ€μν©λλ€. μλ₯Ό λ€μ΄, λ°λμ κΈ°λ°μ λ ν¨μ μλ§€μ 체λ SSRμ μ¬μ©νλ©΄ CSRλ§ μ¬μ©νλ κ²½μμ μ²΄λ³΄λ€ κ΄λ ¨ κ²μμ΄μ λν΄ λ λμ μμλ₯Ό μ°¨μ§ν κ²μ λλ€.
- λ λΉ λ₯Έ μ΄κΈ° λ‘λ© μκ°: μ¬μ©μλ μ½ν μΈ λ₯Ό λ 빨리 λ³΄κ² λμ΄ λ λμ μ¬μ©μ κ²½νμ μ 곡νκ³ μ΄νλ₯ μ μ€μ λλ€. λμΏμ μ¬μ©μκ° μΉμ¬μ΄νΈμ μ μνλ€κ³ μμν΄ λ³΄μμμ€. SSRμ μ¬μ©νλ©΄ λλ¦° μ°κ²°μμλ κ±°μ μ¦μ μ΄κΈ° μ½ν μΈ λ₯Ό λ³Ό μ μμ΅λλ€.
- μ μ¬μ κΈ°κΈ°μμμ λ λμ μ±λ₯: λ λλ§μ μλ²λ‘ μ€νλ‘λνλ©΄ μ¬μ©μ κΈ°κΈ°μ μ²λ¦¬ λΆλ΄μ΄ μ€μ΄λλλ€. μ΄λ ꡬν λλ μ μ¬μ λͺ¨λ°μΌ κΈ°κΈ°λ₯Ό μ¬μ©νλ μ§μμ μ¬μ©μμκ² νΉν μ μ©ν©λλ€.
- μμ λ―Έλμ΄ μ΅μ ν: μμ λ―Έλμ΄ νλ«νΌμμ λ§ν¬λ₯Ό 곡μ ν λ SSRμ μ νν λ©νλ°μ΄ν°μ 미리보기 μ΄λ―Έμ§κ° νμλλλ‘ λ³΄μ₯ν©λλ€.
SSRμ κ³Όμ :
- μλ² λΆν μ¦κ°: μλ²μμ μ»΄ν¬λνΈλ₯Ό λ λλ§νλ €λ©΄ λ λ§μ μλ² λ¦¬μμ€κ° νμν©λλ€.
- μ½λ 볡μ‘μ±: SSRμ ꡬννλ©΄ μ½λλ² μ΄μ€μ 볡μ‘μ±μ΄ μΆκ°λ©λλ€.
- κ°λ° λ° λ°°ν¬ μ€λ²ν€λ: SSRμ λ μ κ΅ν κ°λ° λ° λ°°ν¬ νλ‘μΈμ€λ₯Ό νμλ‘ ν©λλ€.
νμ΄λλ μ΄μ (Hydration)κ³Ό 리νμ΄λλ μ΄μ (Rehydration)μ μ΄ν΄
μλ²κ° HTMLμ λΈλΌμ°μ λ‘ λ³΄λ΄λ©΄ React μ ν리μΌμ΄μ μ μνΈμμ©μ΄ κ°λ₯ν΄μΌ ν©λλ€. λ°λ‘ μ¬κΈ°μ νμ΄λλ μ΄μ μ΄ μμλ©λλ€. νμ΄λλ μ΄μ μ μλ²μμ λ λλ§λ HTMLμ μ΄λ²€νΈ 리μ€λλ₯Ό λΆμ¬ ν΄λΌμ΄μΈνΈ μΈ‘μμ μνΈμμ©ν μ μλλ‘ λ§λλ κ³Όμ μ λλ€.
μ΄λ κ² μκ°ν΄ 보μΈμ: μλ²λ *ꡬ쑰*(HTML)λ₯Ό μ 곡νκ³ , νμ΄λλ μ΄μ μ *λμ*(JavaScript κΈ°λ₯)μ μΆκ°ν©λλ€.
React Hydrateμ μν :
- μ΄λ²€νΈ 리μ€λ λΆμ°©: Reactλ μλ²μμ λ λλ§λ HTMLμ μννλ©° μμμ μ΄λ²€νΈ 리μ€λλ₯Ό λΆμ°©ν©λλ€.
- κ°μ DOM μ¬κ΅¬μΆ: Reactλ ν΄λΌμ΄μΈνΈ μΈ‘μμ κ°μ DOMμ λ€μ λ§λ€μ΄ μλ²μμ λ λλ§λ HTMLκ³Ό λΉκ΅ν©λλ€.
- DOM μ λ°μ΄νΈ: κ°μ DOMκ³Ό μλ² λ λλ§ HTML κ°μ λΆμΌμΉκ° μλ κ²½μ°(μ: ν΄λΌμ΄μΈνΈ μΈ‘ λ°μ΄ν° νμΉμΌλ‘ μΈν΄), Reactλ κ·Έμ λ°λΌ DOMμ μ λ°μ΄νΈν©λλ€.
HTML μΌμΉμ μ€μμ±
μ΅μ μ νμ΄λλ μ΄μ μ μν΄μλ μλ²μμ λ λλ§λ HTMLκ³Ό ν΄λΌμ΄μΈνΈ μΈ‘ JavaScriptμμ λ λλ§λ HTMLμ΄ λμΌν΄μΌ ν©λλ€. μ°¨μ΄κ° μμΌλ©΄ Reactλ DOMμ μΌλΆλ₯Ό λ€μ λ λλ§ν΄μΌ νλ―λ‘ μ±λ₯ λ¬Έμ μ μ μ¬μ μΈ μκ°μ κ²°ν¨μ΄ λ°μν μ μμ΅λλ€.
HTML λΆμΌμΉμ μΌλ°μ μΈ μμΈμ λ€μκ³Ό κ°μ΅λλ€:
- μλ²μμ λΈλΌμ°μ μ μ© API μ¬μ©: μλ² νκ²½μ `window`λ `document`μ κ°μ λΈλΌμ°μ APIμ μ κ·Όν μ μμ΅λλ€.
- μλͺ»λ λ°μ΄ν° μ§λ ¬ν: μλ²μμ κ°μ Έμ¨ λ°μ΄ν°κ° ν΄λΌμ΄μΈνΈμμ κ°μ Έμ¨ λ°μ΄ν°μ λ€λ₯΄κ² μ§λ ¬νλ μ μμ΅λλ€.
- μκ°λ λΆμΌμΉ: μκ°λ μ°¨μ΄λ‘ μΈν΄ λ μ§μ μκ°μ΄ μλ²μ ν΄λΌμ΄μΈνΈμμ λ€λ₯΄κ² λ λλ§λ μ μμ΅λλ€.
- ν΄λΌμ΄μΈνΈ μΈ‘ μ 보μ κΈ°λ°ν μ‘°κ±΄λΆ λ λλ§: λΈλΌμ°μ μΏ ν€λ μ¬μ©μ μμ΄μ νΈμ λ°λΌ λ€λ₯Έ μ½ν μΈ λ₯Ό λ λλ§νλ©΄ λΆμΌμΉκ° λ°μν μ μμ΅λλ€.
React Hydrate API
Reactλ μλ² λ λλ§ μ ν리μΌμ΄μ μ νμ΄λλ μ΄μ νκΈ° μν `hydrateRoot` API(React 18μ λμ )λ₯Ό μ 곡ν©λλ€. μ΄λ μ΄μ μ `ReactDOM.hydrate` APIλ₯Ό λ체ν©λλ€.
`hydrateRoot` μ¬μ©λ²:
```javascript import { createRoot } from 'react-dom/client'; import App from './App'; const container = document.getElementById('root'); const root = createRoot(container); root.hydrate(μ€λͺ :
- `createRoot(container)`: μ§μ λ 컨ν μ΄λ μμ(μΌλ°μ μΌλ‘ IDκ° "root"μΈ μμ) λ΄μμ React νΈλ¦¬λ₯Ό κ΄λ¦¬νκΈ° μν 루νΈλ₯Ό μμ±ν©λλ€.
- `root.hydrate(
)`: μ ν리μΌμ΄μ μ νμ΄λλ μ΄μ νμ¬ μ΄λ²€νΈ 리μ€λλ₯Ό λΆμ°©νκ³ μλ² λ λλ§ HTMLμ μνΈμμ© κ°λ₯νκ² λ§λλλ€.
`hydrateRoot` μ¬μ© μ μ£Όμ κ³ λ € μ¬ν:
- μλ² μ¬μ΄λ λ λλ§μ΄ νμ±νλμλμ§ νμΈ: `hydrateRoot`λ `container` λ΄μ HTML μ½ν μΈ κ° μλ²μμ λ λλ§λμμ κ²μΌλ‘ μμν©λλ€.
- ν λ²λ§ μ¬μ©: μ ν리μΌμ΄μ μ λ£¨νΈ μ»΄ν¬λνΈμ λν΄ `hydrateRoot`λ₯Ό ν λ²λ§ νΈμΆνμμμ€.
- νμ΄λλ μ΄μ μ€λ₯ μ²λ¦¬: νμ΄λλ μ΄μ κ³Όμ μμ λ°μνλ λͺ¨λ μ€λ₯λ₯Ό ν¬μ°©νκΈ° μν΄ μ€λ₯ κ²½κ³(error boundary)λ₯Ό ꡬννμμμ€.
μΌλ°μ μΈ νμ΄λλ μ΄μ λ¬Έμ ν΄κ²°
νμ΄λλ μ΄μ μ€λ₯λ λλ²κΉ νκΈ° μ΄λ €μΈ μ μμ΅λλ€. Reactλ μλ² λ λλ§ HTMLκ³Ό ν΄λΌμ΄μΈνΈ μ¬μ΄λ λ λλ§ HTML κ°μ λΆμΌμΉλ₯Ό κ°μ§νλ©΄ λΈλΌμ°μ μ½μμ κ²½κ³ λ₯Ό νμν©λλ€. μ΄λ¬ν κ²½κ³ μλ μ’ μ’ λ¬Έμ λ₯Ό μΌμΌν€λ νΉμ μμμ λν ννΈκ° ν¬ν¨λ©λλ€.
μΌλ°μ μΈ λ¬Έμ λ° ν΄κ²°μ± :
- "ν
μ€νΈ μ½ν
μΈ κ° μΌμΉνμ§ μμ΅λλ€" μ€λ₯:
- μμΈ: μμμ ν μ€νΈ μ½ν μΈ κ° μλ²μ ν΄λΌμ΄μΈνΈ κ°μ λ€λ¦ λλ€.
- ν΄κ²°μ±
:
- λ°μ΄ν° μ§λ ¬νλ₯Ό λ€μ νμΈνκ³ μλ²μ ν΄λΌμ΄μΈνΈ λͺ¨λμμ μΌκ΄λ νμμ μ¬μ©νλλ‘ νμμμ€. μλ₯Ό λ€μ΄, λ μ§λ₯Ό νμνλ κ²½μ° μμͺ½μμ λμΌν μκ°λμ λ μ§ νμμ μ¬μ©νκ³ μλμ§ νμΈνμμμ€.
- ν μ€νΈ λ λλ§μ μν₯μ μ€ μ μλ λΈλΌμ°μ μ μ© APIλ₯Ό μλ²μμ μ¬μ©νκ³ μμ§ μμμ§ νμΈνμμμ€.
- "μΆκ° μμ±" λλ "λλ½λ μμ±" μ€λ₯:
- μμΈ: μμμ μλ² λ λλ§ HTMLκ³Ό λΉκ΅νμ¬ μΆκ° μμ±μ΄ μκ±°λ λλ½λ μμ±μ΄ μμ΅λλ€.
- ν΄κ²°μ±
:
- μ»΄ν¬λνΈ μ½λλ₯Ό μ£Όμ κΉκ² κ²ν νμ¬ λͺ¨λ μμ±μ΄ μλ²μ ν΄λΌμ΄μΈνΈ λͺ¨λμμ μ¬λ°λ₯΄κ² λ λλ§λκ³ μλμ§ νμΈνμμμ€.
- λμ μΌλ‘ μμ±λλ μμ±, νΉν ν΄λΌμ΄μΈνΈ μΈ‘ μνμ μμ‘΄νλ μμ±μ μ£Όμλ₯Ό κΈ°μΈμ΄μμμ€.
- "μμμΉ λͺ»ν ν
μ€νΈ λ
Έλ" μ€λ₯:
- μμΈ: μΌλ°μ μΌλ‘ 곡백 μ°¨μ΄λ μλͺ» μ€μ²©λ μμλ‘ μΈν΄ DOM νΈλ¦¬μ μμμΉ λͺ»ν ν μ€νΈ λ Έλκ° μμ΅λλ€.
- ν΄κ²°μ±
:
- HTML ꡬ쑰λ₯Ό μ£Όμ κΉκ² κ²μ¬νμ¬ μμμΉ λͺ»ν ν μ€νΈ λ Έλλ₯Ό μλ³νμμμ€.
- μ»΄ν¬λνΈ μ½λκ° μ ν¨ν HTML λ§ν¬μ μ μμ±νλμ§ νμΈνμμμ€.
- μ½λ ν¬λ§·ν°λ₯Ό μ¬μ©νμ¬ μΌκ΄λ 곡백μ μ μ§νμμμ€.
- μ‘°κ±΄λΆ λ λλ§ λ¬Έμ :
- μμΈ: νμ΄λλ μ΄μ μ΄ μλ£λκΈ° μ μ μ»΄ν¬λνΈκ° ν΄λΌμ΄μΈνΈ μΈ‘ μ 보(μ: μΏ ν€, μ¬μ©μ μμ΄μ νΈ)λ₯Ό κΈ°λ°μΌλ‘ λ€λ₯Έ μ½ν μΈ λ₯Ό λ λλ§ν©λλ€.
- ν΄κ²°μ±
:
- μ΄κΈ° λ λλ§ μ€μλ ν΄λΌμ΄μΈνΈ μΈ‘ μ 보μ κΈ°λ°ν μ‘°κ±΄λΆ λ λλ§μ νΌνμμμ€. λμ , νμ΄λλ μ΄μ μ΄ μλ£λ λκΉμ§ κΈ°λ€λ¦° λ€μ ν΄λΌμ΄μΈνΈ μΈ‘ λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ DOMμ μ λ°μ΄νΈνμμμ€.
- μλ²μμ νλ μ΄μ€νλλ₯Ό λ λλ§ν λ€μ νμ΄λλ μ΄μ ν ν΄λΌμ΄μΈνΈμμ μ€μ μ½ν μΈ λ‘ κ΅μ²΄νλ "μ΄μ€ λ λλ§"μ΄λΌλ κΈ°μ μ μ¬μ©νμμμ€.
μμ : μκ°λ λΆμΌμΉ μ²λ¦¬
μΉμ¬μ΄νΈμ μ΄λ²€νΈ μκ°μ νμνλ μλ리μ€λ₯Ό μμν΄ λ³΄μμμ€. μλ²λ UTCλ‘ μ€ν μ€μΌ μ μμ§λ§ μ¬μ©μμ λΈλΌμ°μ λ λ€λ₯Έ μκ°λμ μμ μ μμ΅λλ€. μ£Όμνμ§ μμΌλ©΄ μ΄λ‘ μΈν΄ νμ΄λλ μ΄μ μ€λ₯κ° λ°μν μ μμ΅λλ€.
μλͺ»λ μ κ·Ό λ°©μ:
```javascript // μ΄ μ½λλ νμ΄λλ μ΄μ μ€λ₯λ₯Ό μΌμΌν¬ κ°λ₯μ±μ΄ λμ΅λλ€ function EventTime({ timestamp }) { const date = new Date(timestamp); return{date.toLocaleString()}
; } ```μ¬λ°λ₯Έ μ κ·Ό λ°©μ:
```javascript import { useState, useEffect } from 'react'; function EventTime({ timestamp }) { const [formattedTime, setFormattedTime] = useState(null); useEffect(() => { // ν΄λΌμ΄μΈνΈ μΈ‘μμλ§ μκ° νμμ μ§μ ν©λλ€ const date = new Date(timestamp); setFormattedTime(date.toLocaleString()); }, [timestamp]); return{formattedTime || 'Loading...'}
; } ```μ€λͺ :
- `formattedTime` μνλ `null`λ‘ μ΄κΈ°νλ©λλ€.
- `useEffect` ν μ νμ΄λλ μ΄μ ν ν΄λΌμ΄μΈνΈ μΈ‘μμλ§ μ€νλ©λλ€.
- `useEffect` ν λ΄λΆμμ λ μ§λ `toLocaleString()`μ μ¬μ©νμ¬ νμμ΄ μ§μ λκ³ `formattedTime` μνκ° μ λ°μ΄νΈλ©λλ€.
- ν΄λΌμ΄μΈνΈ μΈ‘ ν¨κ³Όκ° μ€νλλ λμ νλ μ΄μ€νλ("Loading...")κ° νμλ©λλ€.
리νμ΄λλ μ΄μ : λ κΉμ΄ μμ보기
"νμ΄λλ μ΄μ "μ΄ μΌλ°μ μΌλ‘ μλ² λ λλ§ HTMLμ μνΈμμ© κ°λ₯νκ² λ§λλ μ΄κΈ° νλ‘μΈμ€λ₯Ό μλ―Ένλ λ°λ©΄, "리νμ΄λλ μ΄μ "μ μ΄κΈ° νμ΄λλ μ΄μ μ΄ μλ£λ νμ νμ DOM μ λ°μ΄νΈλ₯Ό μλ―Έν μ μμ΅λλ€. μ΄λ¬ν μ λ°μ΄νΈλ μ¬μ©μ μνΈμμ©, λ°μ΄ν° νμΉ λλ κΈ°ν μ΄λ²€νΈμ μν΄ νΈλ¦¬κ±°λ μ μμ΅λλ€.
μ±λ₯ λ³λͺ© νμμ νΌνκΈ° μν΄ λ¦¬νμ΄λλ μ΄μ μ΄ ν¨μ¨μ μΌλ‘ μνλλλ‘ νλ κ²μ΄ μ€μν©λλ€. λ€μμ λͺ κ°μ§ νμ λλ€:
- λΆνμν μ¬λ λλ§ μ΅μν: Reactμ λ©λͺ¨μ΄μ μ΄μ κΈ°μ (μ: `React.memo`, `useMemo`, `useCallback`)μ μ¬μ©νμ¬ μ»΄ν¬λνΈκ° λΆνμνκ² μ¬λ λλ§λλ κ²μ λ°©μ§νμμμ€.
- λ°μ΄ν° νμΉ μ΅μ ν: νμ¬ λ·°μ νμν λ°μ΄ν°λ§ κ°μ Έμ€μμμ€. νμ΄μ§λ€μ΄μ λ° μ§μ° λ‘λ©κ³Ό κ°μ κΈ°μ μ μ¬μ©νμ¬ λ€νΈμν¬λ₯Ό ν΅ν΄ μ μ‘ν΄μΌ νλ λ°μ΄ν° μμ μ€μ΄μμμ€.
- λκ·λͺ¨ λͺ©λ‘μ κ°μν μ¬μ©: λκ·λͺ¨ λ°μ΄ν° λͺ©λ‘μ λ λλ§ν λ κ°μν κΈ°μ μ μ¬μ©νμ¬ λ³΄μ΄λ νλͺ©λ§ λ λλ§νμμμ€. μ΄λ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
- μ ν리μΌμ΄μ νλ‘νμΌλ§: Reactμ νλ‘νμΌλ¬λ₯Ό μ¬μ©νμ¬ μ±λ₯ λ³λͺ© νμμ μλ³νκ³ κ·Έμ λ°λΌ μ½λλ₯Ό μ΅μ ννμμμ€.
νμ΄λλ μ΄μ μ΅μ νλ₯Ό μν κ³ κΈ κΈ°μ
μ νμ νμ΄λλ μ΄μ
μ νμ νμ΄λλ μ΄μ μ μ¬μ©νλ©΄ μ ν리μΌμ΄μ μ νΉμ λΆλΆλ§ μ νμ μΌλ‘ νμ΄λλ μ΄μ νκ³ λ€λ₯Έ λΆλΆμ νμ΄λλ μ΄μ μ λμ€μΌλ‘ λ―Έλ£° μ μμ΅λλ€. μ΄λ νΉν μ¦μ 보μ΄μ§ μκ±°λ μνΈμμ©νμ§ μλ μ»΄ν¬λνΈκ° μλ κ²½μ° μ ν리μΌμ΄μ μ μ΄κΈ° λ‘λ© μκ°μ κ°μ νλ λ° μ μ©ν μ μμ΅λλ€.
Reactλ μ νμ νμ΄λλ μ΄μ μ λκΈ° μν΄ `useDeferredValue` λ° `useTransition` ν (React 18μ λμ )μ μ 곡ν©λλ€. μ΄ ν λ€μ μ¬μ©νλ©΄ νΉμ μ λ°μ΄νΈμ λ€λ₯Έ μ λ°μ΄νΈλ³΄λ€ μ°μ μμλ₯Ό λΆμ¬νμ¬ μ ν리μΌμ΄μ μ κ°μ₯ μ€μν λΆλΆμ΄ λ¨Όμ νμ΄λλ μ΄μ λλλ‘ ν μ μμ΅λλ€.
μ€νΈλ¦¬λ° SSR
μ€νΈλ¦¬λ° SSRμ μ 체 νμ΄μ§κ° λ λλ§λ λκΉμ§ κΈ°λ€λ¦¬λ λμ , μλ²μμ μ¬μ© κ°λ₯ν΄μ§λ λλ‘ HTMLμ μΌλΆλ₯Ό λΈλΌμ°μ λ‘ λ³΄λ΄λ κ²μ ν¬ν¨ν©λλ€. μ΄λ TTFB(Time to First Byte)μ μ²΄κ° μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
Next.jsμ κ°μ νλ μμν¬λ μ€νΈλ¦¬λ° SSRμ κΈ°λ³Έμ μΌλ‘ μ§μν©λλ€.
λΆλΆμ νμ΄λλ μ΄μ (μ€νμ κΈ°λ₯)
λΆλΆμ νμ΄λλ μ΄μ μ μ ν리μΌμ΄μ μ μνΈμμ©μ μΈ λΆλΆλ§ νμ΄λλ μ΄μ νκ³ μ μ μΈ λΆλΆμ νμ΄λλ μ΄μ νμ§ μμ μνλ‘ λλ μ€νμ μΈ κΈ°μ μ λλ€. μ΄λ ν΄λΌμ΄μΈνΈ μΈ‘μμ μ€νν΄μΌ νλ JavaScriptμ μμ ν¬κ² μ€μ¬ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
λΆλΆμ νμ΄λλ μ΄μ μ μμ§ μ€νμ μΈ κΈ°λ₯μ΄λ©° λ리 μ§μλμ§ μμ΅λλ€.
SSRκ³Ό νμ΄λλ μ΄μ μ λ¨μννλ νλ μμν¬ λ° λΌμ΄λΈλ¬λ¦¬
μ¬λ¬ νλ μμν¬μ λΌμ΄λΈλ¬λ¦¬κ° React μ ν리μΌμ΄μ μμ SSRκ³Ό νμ΄λλ μ΄μ μ λ μ½κ² ꡬνν μ μλλ‘ λμμ€λλ€:
- Next.js: SSR, μ μ μ¬μ΄νΈ μμ±(SSG), API λΌμ°νΈλ₯Ό κΈ°λ³Έμ μΌλ‘ μ§μνλ μΈκΈ° μλ React νλ μμν¬μ λλ€. λ² λ₯Όλ¦°μ μκ·λͺ¨ μ€ννΈμ λΆν° μ€λ¦¬μ½ 밸리μ λκΈ°μ μ μ΄λ₯΄κΈ°κΉμ§ μ μΈκ³ κΈ°μ μμ λ리 μ¬μ©λ©λλ€.
- Gatsby: Reactλ₯Ό μ¬μ©νλ μ μ μ¬μ΄νΈ μμ±κΈ°μ λλ€. Gatsbyλ μ½ν μΈ μ€μ¬μ μΉμ¬μ΄νΈμ λΈλ‘κ·Έλ₯Ό ꡬμΆνλ λ° μ ν©ν©λλ€.
- Remix: μΉ νμ€κ³Ό μ±λ₯μ μ€μ μ λ νμ€ν μΉ νλ μμν¬μ λλ€. Remixλ SSR λ° λ°μ΄ν° λ‘λ©μ κΈ°λ³Έμ μΌλ‘ μ§μν©λλ€.
κΈλ‘λ² μ»¨ν μ€νΈμμμ SSRκ³Ό νμ΄λλ μ΄μ
κΈλ‘λ² μ¬μ©μλ₯Ό λμμΌλ‘ μΉ μ ν리μΌμ΄μ μ ꡬμΆν λλ λ€μ μ¬νμ κ³ λ €νλ κ²μ΄ μ€μν©λλ€:
- μ§μν λ° κ΅μ ν(i18n): μ ν리μΌμ΄μ μ΄ μ¬λ¬ μΈμ΄μ μ§μμ μ§μνλλ‘ νμμμ€. λ²μ λ° μ§μνλ₯Ό μ²λ¦¬νκΈ° μν΄ `i18next`μ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμμμ€.
- μ½ν μΈ μ μ‘ λ€νΈμν¬(CDN): CDNμ μ¬μ©νμ¬ μ ν리μΌμ΄μ μ μμ°μ μ μΈκ³ μλ²μ λ°°ν¬νμμμ€. μ΄λ κ² νλ©΄ λ€λ₯Έ μ§λ¦¬μ μμΉμ μ¬μ©μλ₯Ό μν΄ μ ν리μΌμ΄μ μ μ±λ₯μ΄ ν₯μλ©λλ€. μκ·λͺ¨ CDN μ 곡μ 체λ‘λΆν° μλΉμ€κ° λΆμ‘±ν μ μλ λ¨λ―Έλ μν리카μ κ°μ μ§μμ κ±°μ μ λ CDNμ κ³ λ €νμμμ€.
- μΊμ±: μλ²μ ν΄λΌμ΄μΈνΈ λͺ¨λμ μΊμ± μ λ΅μ ꡬννμ¬ μλ² λΆνλ₯Ό μ€μ΄κ³ μ±λ₯μ ν₯μμν€μμμ€.
- μ±λ₯ λͺ¨λν°λ§: μ±λ₯ λͺ¨λν°λ§ λꡬλ₯Ό μ¬μ©νμ¬ μ¬λ¬ μ§μμμ μ ν리μΌμ΄μ μ μ±λ₯μ μΆμ νκ³ κ°μ ν μμμ μλ³νμμμ€.
κ²°λ‘
React hydrateλ μλ² μ¬μ΄λ λ λλ§μ μ¬μ©νμ¬ κ³ μ±λ₯μ SEO μΉνμ μΈ React μ ν리μΌμ΄μ μ ꡬμΆνλ λ° μ€μν κ΅¬μ± μμμ λλ€. νμ΄λλ μ΄μ μ κΈ°λ³Έ μ¬νμ μ΄ν΄νκ³ , μΌλ°μ μΈ λ¬Έμ λ₯Ό ν΄κ²°νλ©°, κ³ κΈ μ΅μ ν κΈ°μ μ νμ©ν¨μΌλ‘μ¨ μ μΈκ³ μ¬μ©μμκ² λ°μ΄λ μ¬μ©μ κ²½νμ μ 곡ν μ μμ΅λλ€. SSRκ³Ό νμ΄λλ μ΄μ μ΄ λ³΅μ‘μ±μ λνμ§λ§, SEO, μ±λ₯ λ° μ¬μ©μ κ²½ν μΈ‘λ©΄μμ μ 곡νλ μ΄μ μ λ§μ μΉ μ ν리μΌμ΄μ μ μμ΄ κ°μΉ μλ ν¬μκ° λ©λλ€.
React hydrateμ νμ λ°μλ€μ¬ λΉ λ₯΄κ³ , λ§€λ ₯μ μ΄λ©°, μ μΈκ³ μ¬μ©μκ° μ κ·Όν μ μλ μΉ μ ν리μΌμ΄μ μ λ§λμμμ€. μλ²μ ν΄λΌμ΄μΈνΈ κ°μ μ νν HTML μΌμΉλ₯Ό μ°μ μνκ³ , μ ν리μΌμ΄μ μ μ±λ₯μ μ§μμ μΌλ‘ λͺ¨λν°λ§νμ¬ μ΅μ νν λΆλΆμ μλ³νλ κ²μ μμ§ λ§μμμ€.