π Chapter 4: μ¬μ‘°μ (reconciliation)
μ¬μ‘°μ μ΄ν΄νκΈ°β
μΌκ΄ μ²λ¦¬β
리μ‘νΈλ μ¬μ‘°μ κ³Όμ μμ μ¬λ¬ κ°μ DOM μ λ°μ΄νΈλ₯Ό λͺ¨μ ν λ²μ DOM μ λ°μ΄νΈλ‘ κ²°ν©ν ν μ€μ DOMμ λν μ λ°μ΄νΈλ₯Ό μΌκ΄ μ²λ¦¬ν©λλ€. μ΄λ κ² νλ©΄ μ€μ DOMμ μ λ°μ΄νΈνλ νμκ° μ€μ΄ μΉ μ ν리μΌμ΄μ μ μ±λ₯μ΄ κ°μ λ©λλ€.
function Example() {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount((prevCount) => prevCount + 1);
setCount((prevCount) => prevCount + 1);
setCount((prevCount) => prevCount + 1);
}
return (
<div>
<p>μΉ΄μ΄νΈ: {count}</p>
<button onClick={handleClick}>μ¦κ°</button>
</div>
)
}
리μ‘νΈλ μΌκ΄ μ λ°μ΄νΈλ₯Ό μννκΈ° λλ¬Έμ count + 1μ λ°λ‘ μ€νν΄ DOMμ μΈ λ² μ λ°μ΄νΈνλ λμ count + 3λ‘ DOMμ ν λ²λ§ μ λ°μ΄νΈν©λλ€.
κΈ°μ‘΄ κΈ°μ β
μ€ν μ¬μ‘°μ μβ
μ€ν μ¬μ‘°μ μλ μμ
μ μΌμ μ€μ§νκ±°λ μ°κΈ°νμ§ μκ³ μμ°¨μ μΌλ‘ λ³κ²½ μ¬νμ λ λλ§ν©λλ€.
κ³μ° λΉμ©μ΄ λΉμΌ μ»΄ν¬λνΈκ° λ λλ§μ λ§μ λ²λ¦¬λ©΄ μ¬μ©μ μ
λ ₯μ΄ λμ λκ° λ²λ²
거리며 νλ©΄μ νμλ©λλ€. μ€ν μ¬μ‘°μ μλ μ
λ°μ΄νΈμ μ°μ μμλ₯Ό μ€μ νμ§ μμ΅λλ€. κ·Έλμ λ μ€μν μ
λ°μ΄νΈκ° λ μ€μν μ
λ°μ΄νΈλ₯Ό λ°©ν΄ν μ μμμ΅λλ€.
νμ΄λ² μ¬μ‘°μ μβ
νμ΄λ² μ¬μ‘°μ μλ μ‘°μ μλ₯Ό μν μμ λ¨μλ₯Ό λνλ΄λ νμ΄λ²λΌλ λ°μ΄ν° κ΅¬μ‘°κ° μ¬μ©λ©λλ€. νμ΄λ²λ 리μ‘νΈ μ리먼νΈμμ μμ±λλλ°, ν΅μ¬μ μΈ μ°¨μ΄μ μ νμ΄λ²λ μνλ₯Ό μ μ₯νκ³ μλͺ μ΄ κΈ΄ λ°λ©΄ 리μ‘νΈ μ리먼νΈλ μμμ μ΄κ³ μνκ° μλ€λ κ²μ λλ€.
λ°μ΄ν° ꡬ쑰λ¬μμ νμ΄λ²β
νμ΄λ² μ¬μ‘°μ μλ μ
λ°μ΄νΈμ μ°μ μμλ₯Ό μ νκ³ μ΄μ λ°λΌ λμ μ€νμ κ°λ₯μΌ ν΄μ 리μ‘νΈ μ ν리μΌμ΄μ
μ μ±λ₯κ³Ό μλ΅μ±μ ν₯μμν΅λλ€. νμ΄λ² λ°μ΄ν° ꡬ쑰λ λ³κ²½ κ°λ₯ν μΈμ€ν΄μ€λ‘ μ€κ³λμμΌλ©° μ‘°μ κ³Όμ μμ νμμ λ°λΌ μ
λ°μ΄νΈλκ³ μ¬λ°°μΉλ©λλ€.
νμ΄λ² μ¬μ‘°μ μλ νμ¬ νμ΄ λ² νΈλ¦¬μ λ€μ νμ΄λ² νΈλ¦¬λ₯Ό λΉκ΅ν΄ μ΄λ λ
Έλλ₯Ό μ
λ°μ΄νΈ, μΆκ°, μ κ±°ν μ§ νμ
νλ μμ
μ΄ ν¬ν¨λ©λλ€.
μ‘°μ κ³Όμ μ€μ νμ΄λ² μ¬μ‘°μ μλ κ°μ DOMμ κ° λ¦¬μ‘νΈ μ리먼νΈμ λν΄ νμ΄λ² λ
Έλλ₯Ό μμ±ν©λλ€. νμ΄λ² λ
Έλκ° μμ±λλ©΄ νμ΄λ² μ¬μ‘°μ μλ μμ
루ν(work loop)λ₯Ό μ¬μ©ν΄ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό μ
λ°μ΄νΈν©λλ€. μμ
루νλ 루ν νμ΄λ² λ
Έλμμ μμν΄ μ»΄ν¬λνΈ νΈλ¦¬λ₯Ό λ°λΌ λ΄λ €κ°λ©΄μ μ
λ°μ΄νΈκ° νμν κ²½μ° κ° νμ΄λ² λ
Έλλ₯Ό "λν°"λ‘ νμν©λλ€. λμ λλ¬νλ©΄ λ€μ λ°λλ‘ μννλ©΄μ λΈλΌμ°μ μ DOM νΈλ¦¬μλ λΆλ¦¬λ μ DOM νΈλ¦¬λ₯Ό λ©λͺ¨λ¦¬μ μμ±ν©λλ€. μ DOM νΈλ¦¬λ μ΄ν νλ©΄μ λ°μλ©λλ€.
μ΄ μμ
μ λ κ°μ§ ν¨μλ‘ ννν μ μμ΅λλ€. beginWork(μμ
μμ)λ μμμ μλλ‘ μ΄λνλ©° μ»΄ν¬λνΈλ₯Ό "μ
λ°μ΄νΈκ° νμν¨"μΌλ‘ νμνκ³ , completeWork(μμ
μλ£)λ λ€μ μλ‘ μ΄λνλ©° λΈλΌμ°μ μμ λΆλ¦¬λ μ€μ DOM μ리먼νΈμ νΈλ¦¬λ₯Ό λ©λͺ¨λ¦¬μ ꡬμ±ν©λλ€. μ΄λ¬ν μ€νμ€ν¬λ¦° λ λλ§ νλ‘μΈμ€λ μ¬μ©μκ° λ³Ό μ μμΌλ―λ‘ μΈμ λ μ§ μ€λ¨νκ³ λ²λ¦΄ μ μμ΅λλ€.
λλΈ λ²νΌλ§β
λλΈ λ²νΌλ§μ μ»΄ν¨ν° κ·Έλν½ λ° λΉλμ€ μ²λ¦¬μμ κΉλ°μμ μ€μ΄κ³ μ²΄κ° μ±λ₯μ κ°μ νλ κΈ°μ μ λλ€. μ΄ κΈ°μ μ μ΄λ―Έμ§λ νλ μμ μ μ₯νκΈ° μν λ κ°μ λ²νΌ(λλ λ©λͺ¨λ¦¬ 곡κ°)λ₯Ό μμ±νκ³ μΌμ κ°κ²©μΌλ‘ λ λ²νΌλ₯Ό μ νν΄ μ΅μ’ μ΄λ―Έμ§λ λμμμ νμν©λλ€.
νμ΄λ² μ¬μ‘°μ μ λλΈ λ²νΌλ§κ³Ό λΉμ·ν©λλ€. μ λ°μ΄νΈκ° λ°μνλ©΄ νμ¬ νμ΄λ² νΈλ¦¬κ° ν¬ν¬λμ΄ μ£Όμ΄μ§ μ¬μ©μ μΈν°νμ΄μ€μ μλ‘μ΄ μνλ₯Ό λ°μνλλ‘ μ λ°μ΄νΈλ©λλ€. μ΄λ₯Ό λ λλ§μ΄λΌκ³ ν©λλ€. κ·Έ ν νμ¬ νΈλ¦¬λ₯Ό λ체ν νΈλ¦¬κ° μ€λΉλκ³ μ¬μ©μκ° κΈ°λνλ μνλ₯Ό μ ννκ² λ°μνλ©΄, λλΈ λ²νΌλ§μμ λΉλμ€ λ²νΌλ₯Ό κ΅μ²΄νλ κ²μ²λΌ νμ¬ νμ΄λ² νΈλ¦¬μ κ΅μ²΄λ©λλ€. μ΄λ₯Ό μ¬μ‘°μ μ μ»€λ° λ¨κ³ λλ 컀λ°μ΄λΌκ³ ν©λλ€.
νμ΄λ² μ¬μ‘°μ μλ₯Ό μ¬μ©νλ©΄ JSX μ리먼νΈμ μ¬μ©μ μ μ νΈλ¦¬μμ λ κ°μ§ νΈλ¦¬κ° λ§λ€μ΄μ§λλ€. "νμ¬" νμ΄λ²λ₯Ό ν¬ν¨νλ νΈλ¦¬μ μμ μ© νμ΄λ²λ₯Ό ν¬ν¨νλ νΈλ¦¬μ λλ€.
νμ΄λ² μ¬μ‘°μ β
νμ΄λ² μ¬μ‘°μ μ λ λλ§ λ¨κ³μ μ»€λ° λ¨κ³λ‘ μ΄λ£¨μ΄μ§λλ€. 리μ‘νΈλ λ λλ§ μμ μ μννκ³ μ΄λ₯Ό DOMμ 컀λ°ν΄μ μ¬μ©μμκ² λ³΄μ¬ μ£ΌκΈ° μ μ μΈμ λ νκΈ°ν μ μκ² λμμ΅λλ€. λ λλ§ μ€λ¨μ΄ κ°λ₯ν΄μ§ κ²μ λλ€. λ λλ§μ΄ μ€λ¨ κ°λ₯ν λ― λ³΄μ΄λ μ΄μ λ 리μ‘νΈ μ€μΌμ€λ¬κ° 5λ°λ¦¬μ΄λ§λ€ μ€νμ λ©μΈ μ€λ λλ‘ λλ €μ£ΌκΈ° λλ¬Έμ λλ€.
λ λλ§ λ¨κ³β
λ λλ§ λ¨κ³λ νμ¬ νΈλ¦¬μμ μν λ³κ²½ μ΄λ²€νΈκ° λ°μνλ©΄ μμν©λλ€. 리μ‘νΈλ κ° νμ΄λ²λ₯Ό μ¬κ·μ , λ¨κ³μ μΌλ‘ μννκ³ μ λ°μ΄νΈκ° 보λ₯ μ€μ΄λΌλ μ νΈ νλκ·Έλ₯Ό μ€μ ν΄ λ체 νΈλ¦¬μ μ€νμ€ν¬λ¦° λ³κ²½ μμ μ μνν©λλ€.
beginWork(μμ μμ)β
beginWorkλ μμ μ© νΈλ¦¬μ μλ νμ΄λ² λ Έλμ μ λ°μ΄νΈ νμ μ¬λΆλ₯Ό λνλ΄λ νλκ·Έλ₯Ό μ€μ ν©λλ€. μ¬λ¬ νλκ·Έλ₯Ό μ€μ νκ³ κ³μν΄μ λ€μ νμ΄λ² λ Έλλ‘ μ΄λνλ©° νΈλ¦¬μ 맨 μλμ λλ¬ν λκΉμ§ λμΌν μμ μ μνν©λλ€. μ΄ μμ μ΄ μλ£λλ©΄ νμ΄λ² λ Έλμμ completeWorkλ₯Ό νΈμΆνκ³ λ€μ κ±°μ¬λ¬ μ¬λΌκ°λ©° μνν©λλ€.
completeWork(μμ μλ£)β
completeWork ν¨μλ μμ μ© νμ΄λ² λ Έλμ μ λ°μ΄νΈλ₯Ό μ μ©νκ³ μ ν리μΌμ΄μ μ μ λ°μ΄νΈλ μνλ₯Ό λνλ΄λ μ€μ DOM νΈλ¦¬λ₯Ό μλ‘κ² μμ±ν©λλ€. μ΄ μμ μ ν΅ν΄ DOMμμ λΆλ¦¬λ νΈλ¦¬λ₯Ό λΈλΌμ°μ κ° μκ°μ μΌλ‘ νννλ μμ λ°κΉ₯μ ꡬμ±ν©λλ€. μ΄ μλ¦¬λ¨ΌνΈ νΈλ¦¬κ° μμ§ λΈλΌμ°μ λ΄ λ¬Έμμ μΆκ°λμ§ μμ μνμΈ κ²μ μ μνμΈμ. 리μ‘νΈλ νλ©΄ λ°μμ λ€μμ λ³΄μ¬ μ€ UIλ₯Ό λ§λ€μμ λΏμ λλ€. νλ©΄ λ°μμ μ΄ μμ μ μννλ©΄ μ€λ¨ν μ μμ΅λλ€. 리μ‘νΈκ° κ³μ°νλ λ€μ μνλ μμ§ νλ©΄μ κ·Έλ €μ§μ§ μμμΌλ―λ‘, λ§μ½ μ°μ μμκ° λ λμ μ λ°μ΄νΈκ° μμ½λλ©΄ μ¬κΈ°μ λ§λ€μ΄μ§ UIλ λ²λ €μ§ μ μμ΅λλ€.
beginWorkκ° νμ΄λ² λ Έλμμ "μ λ°μ΄νΈκ° νμν¨" μνμ λν νλκ·Έ μμ± μν μ νλ€λ©΄, completeWorkλ νΈμ€νΈ νκ²½μ 컀λ°ν μ νΈλ¦¬λ₯Ό ꡬμ±νλ μν μ ν©λλ€.
μ»€λ° λ¨κ³β
μ»€λ° λ¨κ³λ λ λλ§ λ¨κ³μμ κ°μ DOMμ μ μ©λ λ³κ²½ μ¬νμ μ€μ DOMμ λ°μν©λλ€. μ»€λ° λ¨κ³μμλ μ κ°μ DOM νΈλ¦¬κ° νΈμ€νΈ νκ²½μ 컀λ°λκ³ μμ
μ© νΈλ¦¬κ° νμ¬ νΈλ¦¬λ‘ λ°λλλ€.
μ»€λ° λ¨κ³λ λ³ν λ¨κ³μ λ μ΄μμ λ¨κ³λ‘ λλ©λλ€.
λ³ν λ¨κ³β
λ³ν λ¨κ³λ μ»€λ° λ¨κ³μ 첫 λΆλΆμΌλ‘, κ°μ DOMμ μ μ©λ λ³κ²½ μ¬νμ μ€μ DOMμ λ°μν©λλ€. μ΄ λ¨κ³μμ 리μ‘νΈλ μ μ©ν μ
λ°μ΄νΈλ₯Ό μλ³νκ³ commitMutationEffects
λΌλ νΉμ ν¨μλ₯Ό νΈμΆν©λλ€. μ΄ ν¨μλ λ λλ§ λ¨κ³μμ μμ
μ© νΈλ¦¬μ νμ΄λ² λ
Έλμ μ μ©λ μ
λ°μ΄νΈλ₯Ό μ€μ DOMμ λ°μν©λλ€.
λ μ΄μμ λ¨κ³β
μ»€λ° λ¨κ²μ λμ¬ λΆλΆμΌλ‘, DOMμμ μ
λ°μ΄νΈλ λ
Έλμ μ λ μ΄μμμ κ³μ°ν©λλ€. μ΄ λ¨κ³μμ 리μ‘νΈλ commitLayoutEffects
λΌλ νΉμ ν¨μλ₯Ό νΈμΆν©λλ€. μ΄ ν¨μλ DOMμμ μ
λ°μ΄νΈλ λ
Έλμ μ λ μ΄μμμ κ³μ°ν©λλ€.
λ μ΄μμ λ¨κ³κ° μλ£λλ©΄, 리μ‘νΈλ λ λλ§ λ¨κ³μμ κ°μ DOMμ μ μ©λμλ λ³κ²½ μ¬νμ μ€μ¬ DOMμ μ±κ³΅μ μΌλ‘ λ°μνκ² λ©λλ€.
νλ©΄μ λͺ¨λ νμνκΈ°β
리μ‘νΈλ νμ¬ νΈλ¦¬λ μμ
μ© νΈλ¦¬ μ€ νλ μμ FiberRootNode
λ₯Ό λ‘λλ€. FiberRootNode
λ μ¬μ‘°μ κ³Όμ μ μ»€λ° λ¨κ³λ₯Ό κ΄λ¦¬νλ ν΅μ¬ λ°μ΄ν° ꡬ쑰μ
λλ€.
κ°μ DOMμ΄ μ
λ°μ΄νΈλλ©΄ 리μ‘νΈλ νμ¬ νΈλ¦¬λ₯Ό λ³κ²½νμ§ μμ μ± μμ
μ© νΈλ¦¬λ₯Ό μ
λ°μ΄νΈν©λλ€. μ΄λ₯Ό ν΅ν΄ μ ν리μΌμ΄μ
μ νμ¬ μνλ₯Ό μ μ§νλ©΄μ κ°μ DOMμ κ³μ λ λλ§νκ³ μ
λ°μ΄νΈν μ μμ΅λλ€.
λ λλ§ νλ‘μΈμ€κ° μλ£λλ©΄ 리μ‘νΈλ commitRoot ν¨μλ₯Ό νΈμΆν΄ μμ
μ© νΈλ¦¬μ μ μ©λ λ³κ²½ μ¬νμ μ€μ DOMμ 컀λ°ν©λλ€. commitRootλ FiberRootNode
μ ν¬μΈν°λ₯Ό νμ¬ νΈλ¦¬μμ μμ
μ© νΈλ¦¬λ‘ μ ννκ³ , μμ
μ© νΈλ¦¬λ₯Ό μλ‘μ΄ νμ¬ νΈλ¦¬λ‘ λ§λλλ€.
μ΄ μμ λΆν° ν₯ν λͺ¨λ μ λ°μ΄νΈλ μλ‘μ΄ νμ¬ νΈλ¦¬ κΈ°λ°μΌλ‘ μ΄λ£¨μ΄μ§λλ€. μ΄ κ³Όμ μ ν΅ν΄μ μ ν리μΌμ΄μ μ΄ μΌκ΄λ μνλ₯Ό μ μ§νκ³ , μ λ°μ΄νΈλ₯Ό μ ννκ³ ν¨μ¨μ μΌλ‘ μ μ©ν μ μμ΅λλ€. κ·Έλ¦¬κ³ μ΄ λͺ¨λ μμ μ μ¦μ λΈλΌμ°μ μ λ°μλ©λλ€.