VirtualDOM
νμ΅ ν€μλ
Virtual Dom λ?
DOMμ΄λ?
μΉ λΈλΌμ°μ μ λ λλ§ κ³Όμ
νμ±,λ λλ§,DOM,CSSOM,Render Tree,리λ λλ§,μλ°μ€ν¬λ¦½νΈ νμ±,
μΉ λΈλΌμ°μ κ° νλ©΄μ μ λ°μ΄νΈ νλ κ³Όμ
Reconciliation(μ¬μ‘°μ ) κ³Όμ μ 무μμΈκ°?
React μ±λ₯ μ΅μ ν λ°©λ²
React Developer Tools
React StrictMode
Virtual Dom
π Virtual DOMμ νμ λ°°κ²½
1.DOMμ΄λ?
Document Object Model
λΈλΌμ°μ λ λ¬Έμμ΄ νμμ HTMLμ κ³§λ°λ‘ μ΄ν΄ν μ μκΈ° λλ¬Έμ, λΈλΌμ°μ κ° μ΄ν΄νκ³ νμ©ν μ μλ ꡬ쑰λ‘μ λ³νμ΄ νμνλ€. DOM(Document Object Model)μ λΈλΌμ°μ λ λλ§ μμ§μ HTML parserμ μν΄ μμ±λ 'νΈλ¦¬' ꡬ쑰μ Node κ°μ²΄ λͺ¨λΈ μ΄λ€.

2. μΉ λΈλΌμ°μ μ λ λλ§ κ³Όμ
λ λλ§ μμ§ μ΄ URIλ₯Ό ν΅ν΄ μμ²μ λ°μ ν΄λΉνλ λ°μ΄ν°λ₯Ό λ λλ§ νλ μνμ μν.
Critical Rendering path
λΈλΌμ°μ λ HTML,CSS, μλ°μ€ν¬λ¦½νΈ, μ΄λ―Έμ§, ν°νΈ νμΌ λ± λ λλ§μ νμν 리μμ€λ₯Ό μμ²νκ³ μλ²λ‘ λΆν° μλ΅ λ°λλ€.
λΈλΌμ°μ μ λ λλ§ μμ§μ μλ²λ‘λΆν° μλ΅λ HTML,CSSλ₯Ό νμ±νμ¬ DOM(Document Object Model)κ³Ό CSSOM(CSS Object Model)λ₯Ό μμ±νκ³ μ΄λ€μ κ²°ν©νμ¬ Render Treeλ₯Ό μμ±νλ€.
λΈλΌμ°μ μ μλ°μ€ν¬λ¦½νΈ μμ§μ μλ²λ‘ λΆν° μλ΅λ μλ°μ€ν¬λ¦½νΈλ₯Ό νμ±νμ¬ AST(Abstract Syntax Tree)λ₯Ό μμ±νκ³ λ°μ΄νΈμ½λλ‘ λ³ννμ¬ μ€ννλ€. μ΄λ μλ°μ€ν¬λ¦½νΈλ DOM APIλ₯Ό ν΅ν΄ DOMμ΄λ CSSOMλ₯Ό λ³κ²½ ν μ μλ€. λ³κ²½λ DOMκ³Ό CSSOMμ λ€μ Render Treeλ‘ κ²°ν©λλ€.
Render Treeλ₯Ό κΈ°λ°μΌλ‘ HTMLμμμ λ μ΄μμμ κ³μ°νκ³ λΈλΌμ°μ μ νλ©΄μ νμΈν νλ€.
3λ² κ³Όμ μ μν΄μ 4λ²μμ λ€μ λ μ΄μμμ μ¬κ³μ° νλ μν©μ ReflowλΌκ³ λΆλ₯Έλ€.
3. μΉ λΈλΌμ°μ κ° νλ©΄μ μ
λ°μ΄νΈ νλ κ³Όμ

DOMμ μμ ν λλ§λ€ Render Treeμ μμ±λΆν° Layout(Reflow),Painting(Repaint)μ κ³Όμ μ λ€μ μνν΄μΌ νλ€.

μ±λ₯ μ νμ μ£Όμ μμΈμ DOMμ μμ ν λ λ°μνλ Reflow, Repaint κ³Όμ μ μλ€. Reflowκ° λΉλ²νκ² λ°μνλ κ²½μ° λΈλΌμ°μ μμλ μ±λ₯μ νκ° λ°μνλ©°, μΉ νμ΄μ§μ DOMμ΄ λ³΅μ‘νκ² κ΅¬μ±λμ΄ μκ³ CSSκ° λ§μ΄ μ μ©λ μ¬μ΄νΈμΌμλ‘ λμ± μ¬ν΄μ§λ€.
Reflow λ μ΄μμ κ³μ°μ λ€μ νλ κ²μΌλ‘, Reflowκ° λ°μνλ©΄ Repaintλ νμ°μ μΌλ‘ λ°μ HTML μμλ€μ΄ μμΉμ ν¬κΈ°λ₯Ό λ€μ κ³μ°ν΄μΌ νκΈ° λλ¬Έμ, 리νμΈνΈμ λΉν΄μ μκ°μ΄ μ€λ κ±Έλ¦°λ€. μ¦, λ³κ²½νλ €λ νΉμ μμμ μμΉμ ν¬κΈ°λΏ μλλΌ, μ°κ΄λ λ€λ₯Έ μμλ€μ μμΉμ ν¬κΈ°κΉμ§ μ¬κ³μ° ν΄μΌνκΈ° λλ¬Έμ΄λ€.
Repaint μ¬κ²°ν©λ Render Treeλ₯Ό κΈ°λ°μΌλ‘ λ€μ νλ©΄μ νμΈνΈ νλ κ²μ λ§νλ€.

μλ°μ€ν¬λ¦½νΈλ‘ DOMμ‘°μμ λ³νλ μνλ₯Ό λ°μνκΈ° μν΄ λΈλΌμ°μ λ λ€μ λ λλ§νκ² λλ€. λ λλ§νλ κ³Όμ μμ Layoutμ μ¬κ³μ°νλ κ³Όμ μ λΉμ©μ΄ μμλκ³ μκ° μμκ° λλ κ³Όμ μ΄λ€. μ΄κΈ°μ μΉνμ΄μ§μμλ DOMμ μ‘°μνλ κ³Όμ μ΄ λ§μ§ μμμ§λ§ νλ λμ μΈ μΉμ μ¬μ©μμμ κ΅λ₯κ° νλ°νκ² μΌμ΄λκΈ°μ DOMμ μ‘°μν΄μΌνλ μν©μ΄ λΉλ²νκ² λ°μνκ² λλ€. μ¦μ λ λλ§μΌλ‘ Reflow νμ κ³μ λ°μνκ² λλ€λ©΄ μ±λ₯μ νμ μμΈμ΄ λκ² λλ€. μ±λ₯μ νλ₯Ό μ΅μννκΈ° μν΄μλ κ²°κ΅ DOMμ μ΅μνμΌλ‘ μμ ν΄μΌ νλ€. μ΄λ¬ν λ¬Έμ μ μ κ°μ νκΈ° μν΄ Reactλ Virtual DOMμ νμνκ² νλ€.
π Virtual DOMλ?
μ€μ DOMμ ꡬ쑰μ λΉμ·ν, React κ°μ²΄μ νΈλ¦¬
Virtual DOMμ λ³κ²½ λ΄μμ ν λ²μ λͺ¨μΌκ³ (λ²νΌλ§) μ€μ DOMκ³Ό λ³κ²½λ Virtual DOMμ μ°¨μ΄λ₯Ό νλ¨ν ν, ꡬμ±μμμ λ³κ²½μ΄ λΆλΆλ§ μ°Ύμ λ³κ²½νκ³ κ·Έμ λ°λ₯Έ λ λλ§μ ν λ²λ§ νλ κ²μΌλ‘ λ λλ§ λ¬Έμ λ₯Ό κ°μ νλ€.
Reconciliation(μ¬μ‘°μ )κ³Όμ μ 무μμΈκ°?
UIμ κ°μμ μΈ ννμ λ©λͺ¨λ¦¬μ μ μ₯νκ³ React DOMκ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬μ μν΄ μ€μ DOMκ³Ό λκΈ°ννλ νλ‘κ·Έλμ κ°λ
Virtual DOMμ μ¬μ©νλ©΄ μ€μ DOMμ μ κ·Όνλ©° μ‘°μνλ λμ , μ΄λ₯Ό μΆμνν μλ°μ€ν¬λ¦½νΈ κ°μ²΄λ₯Ό ꡬμ±νμ¬ μ¬μ©νλ€. DOMμ μνλ₯Ό λ©λͺ¨λ¦¬μ μ μ₯νκ³ , λ³κ²½ μ κ³Ό λ³κ²½ νμ μνλ₯Ό λΉκ΅ νλ€ μ΅μνμ λ΄μ©λ§ λ°μνμ¬ μ±λ₯ ν₯μμ μ΄λμ΄λΈλ€. DOMμ μνλ₯Ό λ©λͺ¨λ¦¬ μμ κ³μ μ¬λ €λκ³ , DOMμ λ³κ²½ μμ κ²½μ° ν΄λΉ λ³κ²½ μ¬νλ§ λ°μνλ κ²μ΄λ€.
βπ» VirtualDOMμ λν μ 리
Reactμ VirtualDOMμ μ€μ DOM λ λλ§ κ³Όμ μ μ΅μνμΌλ‘ μ°μ°νκ² νμ¬ λΈλΌμ°μ μ μ±λ₯μ ν₯μ ν΄μ€λ€.
Virtual DOMμ λΉκ΅(DIFF)λ₯Ό ν΅ν΄ λ³κ²½λ λΆλΆλ§ μΌλΆλΆμ μ€μ DOMμ λ°μνμ¬ λ λλ§νκ² νλ€.
VirtualDOMμ μΆμννκΈ° λλ¬Έμ μ§κ΄μ μΌλ‘ νμΈ ν μ μμ§λ§, DOMμ΄ λ³νλ λΆλΆμ κ°μ§νκ³ μ€μ DOMμ λκΈ°ν ν΄μ€μΌλ‘μ μ μ§λ³΄μκ° κ°λ₯ν μ΄ν리μΌμ΄μ μ λ§λλκ²μ λμμ£Όκ³ μΆ©λΆν λΉ λ₯΄κ² ν΄μ€λ€.
리μ‘νΈμ μμ°μ±(μλνλ°μΆμν)μ κ·Ήλν νκΈ° μν΄μ μ΅μ ν νλ μμ μ΄ νμνλ.
π μ°Έκ³
π React μ±λ₯ μ΅μ ν
Reactμ VirtualDOMμ΄ λ λλ§μ μ±λ₯μ κ°μ νκΈ° μν λꡬμ΄μ§λ§, λꡬλ₯Ό μλͺ» μ¬μ©νκ² λλ€λ©΄ μ€νλ € μν¨κ³Όκ° λ μ μλ€. λν μ ν리μΌμ΄μ μ ν¬κΈ°κ° μ»€μ§ μλ‘ μ±λ₯λ¬Έμ λ λ°μ λλ€. κ·Έλ κΈ°μ μ΅μ νλ₯Ό νκΈ° μν μ λ΅λ€μ΄ μ‘΄μ¬νλ€.
λΆνμν 리λ λλ§ νΌνκΈ°
shouldComponentUpdateλΌμ΄ν μ¬μ΄ν΄ λ©μλ,React.memoμ¬μ©ν΄μ λΆνμν 리λ λλ§ λ°©μ§
list λ λλ§ μ key μμ± μ¬μ©
keyλ₯Ό μ¬μ©νλ©΄ λ³κ²½λ νλͺ©, μλ‘μ΄ νλͺ© λλ μμ λ νλͺ©μ λΉ λ₯΄κ² μλ³ ν μ μλ€.
μ»΄ν¬λνΈμ μ§μ° λ‘λ©
νμνμ§ μμ μ»΄ν¬λνΈκ° μλ κ²½μ° React.lazy()λ₯Ό μ¬μ©νμ¬ μ§μ° λ‘λ© μ΄κΈ°λ‘λν΄μΌ νλ μ½λμμ μ€μ΄λ€μ΄ λ λΉ λ₯Έ λ‘λ μκ°μ μ»μ μ μλ€.
λ°°ν¬ μ νλ‘λμ λΉλ± μ¬μ©
κ°λ°μ© React λΉλμλ κ°λ° μ€μ λμμ΄ λλ μΆκ° κ²½κ³ κ° ν¬ν¨λμ΄ μμ§λ§, μ€μ λ‘ μ±μ μ¬μ©ν λλ λΆνμνλ©° μ± μ±λ₯μ μ νμν΄
μ±μ μ±λ₯ νλ‘νμΌλ§
React DevToolsμ Profiler νμ μ¬μ©νμ¬ μ±μ λ λλ§ "λΉμ©"μ μΈ‘μ νκ³ μ΅μ νκ° νμν λΆλΆμ μλ³
π₯ μ±λ₯ μ΅μ νλ₯Ό μν μ λ΅
λ³λͺ© νμ μλ³ λ° μμ
React Developer Toolsμ
Profilerμ¬μ©νμ¬ λΆνμν 리λ λλ§μ΄λ λ©λͺ¨λ¦¬ λμ λ±μ λ³λͺ© νμμ μλ³νλ€.
λ©λͺ¨μ΄μ μ΄μ
λμΌν propsλ₯Ό κ°μ§ ν¨μ μ»΄ν¬λνΈμ λΆνμν λ€μ λ λλ§μ λ°©μ§νκΈ° μν΄
React.memoλ₯Ό μ¬μ©νλ€.
useCallback
μμ‘΄μ± μ€ νλκ° λ³κ²½λ λλ§ λ³κ²½λλ λ©λͺ¨μ΄μ μ΄μ λ μ½λ°± ν¨μλ₯Ό λ°ννκΈ° μν΄
useCallbackμ μ¬μ©νλ€.
useMemo
μμ‘΄μ± μ€ νλκ° λ³κ²½λ λλ§ λ€μ κ³μ°λλ λ©λͺ¨μ΄μ μ΄μ λ κ°μ λ°ννκΈ° μν΄
useMemoμ μ¬μ©νλ€.
μ§μ° λ‘λ©κ³Ό μ½λ λΆν
React.lazyμ Suspenseλ₯Ό μ¬μ©νμ¬ μ½λ λΆν κ³Ό μ§μ° λ‘λ©μ ꡬννμ¬ μ΄κΈ° λ²λ€ ν¬κΈ°λ₯Ό μ€μ΄κ³ μ±λ₯μ ν₯μμν΅λλ€.
π μ°Έκ³
React Developer Tools
π οΈ React Developer Tools
νμ₯νλ‘κ·Έλ¨μ ν΅ν΄ React μ»΄ν¬λνΈμ ꡬ쑰λ₯Ό νμΈ ν μ μλ profilerλ₯Ό ν΅ν΄ μ±λ₯ 체ν¬λ₯Ό ν μ μλ λꡬμ΄λ€.

π React StrictModeλ 무μμΈκ°?
μλ°μ€ν¬λ¦½νΈμμλ μ격 λͺ¨λκ° μλ€. μ½λ νμΌ μλ¨μ "use strict"λ₯Ό μ¨ λμΌλ©΄ μλ°μ€ν¬λ¦½νΈλ₯Ό μ€νν λ μ‘°κΈ λ μ격νκ² μ½λλ₯Ό κ²μ¬νλ€. 리μ‘νΈμλ μ΄μ μ μ¬ν λͺ©μ μΌλ‘ μ¬μ©νλ
<StrictMode />λΌλ μ»΄ν¬λνΈκ° μλ€.
μ ν리μΌμ΄μ λ΄μ μ μ¬μ μΈ λ¬Έμ λ₯Ό μμλ΄κΈ° μν λꡬ
Fragmentμ κ°μ΄ UIλ₯Ό λ λλ§νμ§ μμΌλ©°, μμλ€μ λν λΆκ°μ μΈ κ²μ¬μ κ²½κ³ λ₯Ό νμ±ννλ€.
Strict λͺ¨λλ κ°λ° λͺ¨λμμλ§ νμ±νλκΈ° λλ¬Έμ, νλ‘λμ λΉλμλ μν₯μ λΌμΉμ§ μλλ€.
StrictModeλ μλμ κ°μ λΆλΆμμ λμμ΄ λλ€.
μμ νμ§ μμ μλͺ μ£ΌκΈ°λ₯Ό μ¬μ©νλ μ»΄ν¬λνΈ λ°κ²¬
λ κ±°μ λ¬Έμμ΄ ref μ¬μ©μ λν κ²½κ³
κΆμ₯λμ§ μλ findDOMNode μ¬μ©μ λν κ²½κ³
μμμΉ λͺ»ν λΆμμ© κ²μ¬
λ κ±°μ context API κ²μ¬
Ensuring reusable state
Strict λͺ¨λλ₯Ό μ¬μ©νλ©΄ 리μ‘νΈκ° μμ μ»΄ν¬λνΈλ₯Ό κ²μ¬νκ³ μλͺ» μ¬μ©λ λΆλΆμ μ°λ¦¬μκ² μλ €μ€λ€. μ΄λ° κ²½κ³ λ©μΈμ§λ€μ μ΄ν리μΌμ΄μ μ μ μ¬λ λ¬Έμ λ₯Ό ν΄κ²° ν μ μλλ‘ λμμ€λ€.
π μ°Έκ³
Last updated