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 객체 λͺ¨λΈ 이닀.

DOM

2. μ›Ή λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ κ³Όμ •

  • λ Œλ”λ§ μ—”μ§„ 이 URIλ₯Ό 톡해 μš”μ²­μ„ λ°›μ•„ ν•΄λ‹Ήν•˜λŠ” 데이터λ₯Ό λ Œλ”λ§ ν•˜λŠ” μ—­ν™œμ„ μˆ˜ν–‰.

  • Critical Rendering path

    1. λΈŒλΌμš°μ €λŠ” HTML,CSS, μžλ°”μŠ€ν¬λ¦½νŠΈ, 이미지, 폰트 파일 λ“± λ Œλ”λ§μ— ν•„μš”ν•œ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•˜κ³  μ„œλ²„λ‘œ λΆ€ν„° 응닡 λ°›λŠ”λ‹€.

    2. λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ 엔진은 μ„œλ²„λ‘œλΆ€ν„° μ‘λ‹΅λœ HTML,CSSλ₯Ό νŒŒμ‹±ν•˜μ—¬ DOM(Document Object Model)κ³Ό CSSOM(CSS Object Model)λ₯Ό μƒμ„±ν•˜κ³  이듀을 κ²°ν•©ν•˜μ—¬ Render Treeλ₯Ό μƒμ„±ν•œλ‹€.

    3. λΈŒλΌμš°μ €μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ„œλ²„λ‘œ λΆ€ν„° μ‘λ‹΅λœ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό νŒŒμ‹±ν•˜μ—¬ AST(Abstract Syntax Tree)λ₯Ό μƒμ„±ν•˜κ³  λ°”μ΄νŠΈμ½”λ“œλ‘œ λ³€ν™˜ν•˜μ—¬ μ‹€ν–‰ν•œλ‹€. μ΄λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” DOM APIλ₯Ό 톡해 DOMμ΄λ‚˜ CSSOMλ₯Ό λ³€κ²½ ν•  수 μžˆλ‹€. λ³€κ²½λœ DOMκ³Ό CSSOM은 λ‹€μ‹œ Render Tree둜 κ²°ν•©λœλ‹€.

    4. 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λ₯Ό 기반으둜 λ‹€μ‹œ 화면에 페인트 ν•˜λŠ” 것을 λ§ν•œλ‹€.

VirtualDOM

μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ 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이 λ Œλ”λ§μ„ μ„±λŠ₯을 κ°œμ„ ν•˜κΈ° μœ„ν•œ λ„κ΅¬μ΄μ§€λ§Œ, 도ꡬλ₯Ό 잘λͺ» μ‚¬μš©ν•˜κ²Œ λœλ‹€λ©΄ 였히렀 μ—­νš¨κ³Όκ°€ λ‚  수 μžˆλ‹€. λ˜ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 크기가 컀질 수둝 μ„±λŠ₯λ¬Έμ œλŠ” λ°œμƒ λœλ‹€. 그렇기에 μ΅œμ ν™”λ₯Ό ν•˜κΈ° μœ„ν•œ μ „λž΅λ“€μ΄ μ‘΄μž¬ν•œλ‹€.

  1. λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§ ν”Όν•˜κΈ°

    • shouldComponentUpdate라이프 사이클 λ©”μ†Œλ“œ,React.memo μ‚¬μš©ν•΄μ„œ λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§ λ°©μ§€

  2. list λ Œλ”λ§ μ‹œ key 속성 μ‚¬μš©

    • keyλ₯Ό μ‚¬μš©ν•˜λ©΄ λ³€κ²½λœ ν•­λͺ©, μƒˆλ‘œμš΄ ν•­λͺ© λ˜λŠ” μ‚­μ œλœ ν•­λͺ©μ„ λΉ λ₯΄κ²Œ 식별 ν•  수 μžˆλ‹€.

  3. μ»΄ν¬λ„ŒνŠΈμ˜ μ§€μ—° λ‘œλ”©

    • ν•„μš”ν•˜μ§€ μ•Šμ€ μ»΄ν¬λ„ŒνŠΈκ°€ μžˆλŠ” 경우 React.lazy()λ₯Ό μ‚¬μš©ν•˜μ—¬ μ§€μ—° λ‘œλ”© μ΄ˆκΈ°λ‘œλ“œν•΄μ•Ό ν•˜λŠ” μ½”λ“œμ–‘μ„ 쀄어듀어 더 λΉ λ₯Έ λ‘œλ“œ μ‹œκ°„μ„ 얻을 수 μžˆλ‹€.

  4. 배포 μ‹œ ν”„λ‘œλ•μ…˜ λΉŒλ“± μ‚¬μš©

    • 개발용 React λΉŒλ“œμ—λŠ” 개발 쀑에 도움이 λ˜λŠ” μΆ”κ°€ κ²½κ³ κ°€ ν¬ν•¨λ˜μ–΄ μžˆμ§€λ§Œ, μ‹€μ œλ‘œ 앱을 μ‚¬μš©ν•  λ•ŒλŠ” λΆˆν•„μš”ν•˜λ©° μ•± μ„±λŠ₯을 μ €ν•˜μ‹œν‚΄

  5. μ•±μ˜ μ„±λŠ₯ ν”„λ‘œνŒŒμΌλ§

    • 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 Devloper Tools

πŸ“– React StrictModeλž€ 무엇인가?

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 엄격 λͺ¨λ“œκ°€ μžˆλ‹€. μ½”λ“œ 파일 상단에 "use strict"λ₯Ό 써 λ†“μœΌλ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‹€ν–‰ν•  λ•Œ 쑰금 더 μ—„κ²©ν•˜κ²Œ μ½”λ“œλ₯Ό κ²€μ‚¬ν•œλ‹€. λ¦¬μ•‘νŠΈμ—λ„ 이와 μœ μ‚¬ν•œ λͺ©μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” <StrictMode />λΌλŠ” μ»΄ν¬λ„ŒνŠΈκ°€ μžˆλ‹€.

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ˜ 잠재적인 문제λ₯Ό μ•Œμ•„λ‚΄κΈ° μœ„ν•œ 도ꡬ

  • Fragment와 같이 UIλ₯Ό λ Œλ”λ§ν•˜μ§€ μ•ŠμœΌλ©°, μžμ†λ“€μ— λŒ€ν•œ 뢀가적인 검사와 κ²½κ³ λ₯Ό ν™œμ„±ν™”ν•œλ‹€.

  • Strict λͺ¨λ“œλŠ” 개발 λͺ¨λ“œμ—μ„œλ§Œ ν™œμ„±ν™”λ˜κΈ° λ•Œλ¬Έμ—, ν”„λ‘œλ•μ…˜ λΉŒλ“œμ—λŠ” 영ν–₯을 λΌμΉ˜μ§€ μ•ŠλŠ”λ‹€.

  • StrictModeλŠ” μ•„λž˜μ™€ 같은 λΆ€λΆ„μ—μ„œ 도움이 λœλ‹€.

    • μ•ˆμ „ν•˜μ§€ μ•Šμ€ 생λͺ…μ£ΌκΈ°λ₯Ό μ‚¬μš©ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ 발견

    • λ ˆκ±°μ‹œ λ¬Έμžμ—΄ ref μ‚¬μš©μ— λŒ€ν•œ κ²½κ³ 

    • ꢌμž₯λ˜μ§€ μ•ŠλŠ” findDOMNode μ‚¬μš©μ— λŒ€ν•œ κ²½κ³ 

    • μ˜ˆμƒμΉ˜ λͺ»ν•œ λΆ€μž‘μš© 검사

    • λ ˆκ±°μ‹œ context API 검사

    • Ensuring reusable state

Strict λͺ¨λ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λ¦¬μ•‘νŠΈκ°€ μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό κ²€μ‚¬ν•˜κ³  잘λͺ» μ‚¬μš©λœ 뢀뢄을 μš°λ¦¬μ—κ²Œ μ•Œλ €μ€€λ‹€. 이런 κ²½κ³  메세지듀은 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ— 잠재된 문제λ₯Ό ν•΄κ²° ν•  수 μžˆλ„λ‘ 도와쀀닀.

πŸ”— μ°Έκ³ 

Last updated