# [[가상 DOM ([[Virtual DOM]]) 및 Fiber]] ## πŸ“Œ[[ brief]] Summary 가상 DOM(Virtual DOM)은 μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€(UI)의 이상적인 μƒνƒœλ₯Ό λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜κ³  κ°€λ³κ²Œ ν‘œν˜„ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ 객체둜, μ‹€μ œ DOM과의 동기화(μž¬μ‘°μ •, [[Reconciliation]])λ₯Ό 톡해 직접적인 DOM μ‘°μž‘μ˜ λΉ„νš¨μœ¨μ„±μ„ μΆ”μƒν™”ν•˜λŠ” κ°œλ…μž…λ‹ˆλ‹€ [1-3]. [[React Fiber]]λŠ” μ΄λŸ¬ν•œ μž¬μ‘°μ • 엔진을 μ™„μ „νžˆ μž¬μž‘μ„±ν•˜μ—¬ React 16에 λ„μž…λœ μ•„ν‚€ν…μ²˜λ‘œ, 동기식 λ Œλ”λ§μ˜ ν•œκ³„λ₯Ό κ·Ήλ³΅ν•˜κ³  λ Œλ”λ§ μž‘μ—…μ„ 쀑단 및 μž¬κ°œν•  수 μžˆλŠ” λ™μ‹œμ„± λ Œλ”λ§([[Concurrent Rendering]])을 μ§€μ›ν•©λ‹ˆλ‹€ [4, 5]. Fiber μ•„ν‚€ν…μ²˜λŠ” λ Œλ”λ§ μž‘μ—…μ„ 'μž‘μ—… λ‹¨μœ„(Fiber node)'둜 λΆ„ν• ν•˜μ—¬ μš°μ„ μˆœμœ„μ— 따라 μŠ€μΌ€μ€„λ§ν•¨μœΌλ‘œμ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ°˜μ‘μ„±μ„ κ·ΉλŒ€ν™”ν•©λ‹ˆλ‹€ [6-8]. ## πŸ“– Core Content * **가상 DOMκ³Ό νœ΄λ¦¬μŠ€ν‹± μž¬μ‘°μ • μ•Œκ³ λ¦¬μ¦˜** μ‹€μ œ DOM을 직접 μˆ˜μ •ν•˜λŠ” 것은 λΈŒλΌμš°μ €μ˜ λ ˆμ΄μ•„μ›ƒ 및 페인트 단계λ₯Ό μœ λ°œν•˜λ―€λ‘œ 계산 λΉ„μš©μ΄ 많이 λ“­λ‹ˆλ‹€ [1]. ReactλŠ” 가상 DOM을 λ„μž…ν•˜μ—¬ 이전 가상 DOM νŠΈλ¦¬μ™€ μƒˆλ‘­κ²Œ κ³„μ‚°λœ 가상 DOM 트리λ₯Ό 비ꡐ(Diffing)ν•˜μ—¬ λ³€κ²½ 사항을 κ°μ§€ν•©λ‹ˆλ‹€ [2]. 이둠적인 트리 비ꡐ μ•Œκ³ λ¦¬μ¦˜μ˜ λ³΅μž‘λ„λŠ” $O(n^3)$μ΄μ§€λ§Œ, ReactλŠ” 두 κ°€μ§€ κ°€μ •(λ‹€λ₯Έ νƒ€μž…μ˜ μš”μ†ŒλŠ” λ‹€λ₯Έ 트리λ₯Ό μƒμ„±ν•˜λ©°, κ°œλ°œμžκ°€ λΆ€μ—¬ν•œ 'key'λ₯Ό 톡해 μ•ˆμ •μ μΈ μš”μ†Œλ₯Ό 식별함)을 λ°”νƒ•μœΌλ‘œ $O(n)$의 νœ΄λ¦¬μŠ€ν‹± μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•˜μ—¬ μ„±λŠ₯을 μ΅œμ ν™”ν•©λ‹ˆλ‹€ [9-11]. * **μŠ€νƒ μž¬μ‘°μ •μž(Stack Reconciler)의 ν•œκ³„μ™€ Fiber의 λ„μž…** Fiber λ„μž… μ΄μ „μ˜ ReactλŠ” μ»΄ν¬λ„ŒνŠΈ 트리λ₯Ό 단일 μž¬κ·€ 호좜둜 μ²˜λ¦¬ν•˜λŠ” 동기식 μŠ€νƒ μž¬μ‘°μ •μžλ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€ [6]. 이 방식은 μž‘μ—…μ΄ κΈΈμ–΄μ§ˆ 경우 16.6ms의 ν”„λ ˆμž„ μ˜ˆμ‚°μ„ μ΄ˆκ³Όν•˜μ—¬ 메인 μŠ€λ ˆλ“œλ₯Ό μ°¨λ‹¨ν•˜κ³  UIλ₯Ό λ©ˆμΆ”κ²Œ ν•˜λŠ” ν•œκ³„κ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€ [6]. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ“±μž₯ν•œ FiberλŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ³€κ²½ κ°€λŠ₯ν•œ 인메λͺ¨λ¦¬ ꡬ쑰(Fiber 데이터 ꡬ쑰)λ₯Ό 톡해 λ Œλ”λ§ μž‘μ—…μ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€ [12]. * **Fiber의 λ Œλ”λ§ 단계 (Render & Commit Phases)** FiberλŠ” μž¬μ‘°μ • 과정을 두 κ°€μ§€ λͺ…ν™•ν•œ λ‹¨κ³„λ‘œ λΆ„λ¦¬ν•˜μ—¬ μ‹€ν–‰ν•©λ‹ˆλ‹€ [13]. 1. **λ Œλ” 단계(Render Phase):** 이 λ‹¨κ³„λŠ” 비동기적이며 쀑단 κ°€λŠ₯ν•©λ‹ˆλ‹€ [13]. ReactλŠ” Fiber 트리λ₯Ό μˆœνšŒν•˜λ©° λ³€κ²½ 사항을 κ³„μ‚°ν•˜κ³  μ‹€μ œ DOM을 λ³€ν˜•ν•˜μ§€ μ•Šμ€ μ±„λ‘œ λΆ€μž‘μš©(Effect) λͺ©λ‘μ„ μž‘μ„±ν•©λ‹ˆλ‹€ [13, 14]. 처리 도쀑 μš°μ„ μˆœμœ„κ°€ 높은 μž‘μ—…(예: μ‚¬μš©μž μž…λ ₯)이 λ°œμƒν•˜λ©΄ λΈŒλΌμš°μ €μ— μ œμ–΄κΆŒμ„ 양보(Yield)ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [6, 15]. 2. **컀밋 단계(Commit Phase):** 이 λ‹¨κ³„λŠ” 동기적이며 쀑단할 수 μ—†μŠ΅λ‹ˆλ‹€ [16]. λ Œλ” λ‹¨κ³„μ—μ„œ μƒμ„±λœ λΆ€μž‘μš© λͺ©λ‘(DOM μ‚½μž…, μ—…λ°μ΄νŠΈ, μ‚­μ œ λ“±)을 μ‹€μ œ DOM에 ν•œ λ²ˆμ— μ μš©ν•˜κ³ , 동기식 λ ˆμ΄μ•„μ›ƒ 효과(`useLayoutEffect`)λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€ [16, 17]. * **μš°μ„ μˆœμœ„ 레인(Lane) λͺ¨λΈκ³Ό μŠ€μΌ€μ€„λ§** React의 μŠ€μΌ€μ€„λŸ¬λŠ” λΉ„νŠΈλ§ˆμŠ€ν¬(Bitmask) μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λŠ” 'Lane λͺ¨λΈ'을 톡해 λ™μ‹œμ„± μž‘μ—…μ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€ [18, 19]. μ—…λ°μ΄νŠΈμ˜ 성격에 따라 Sync Lane(μ‚¬μš©μž 타이핑, 클릭 λ“± μ¦‰μ‹œ 처리), InputContinuous Lane(슀크둀 λ“±), Default Lane, Idle Lane(λ°±κ·ΈλΌμš΄λ“œ μž‘μ—…) λ“±μœΌλ‘œ μš°μ„ μˆœμœ„λ₯Ό λΆ„λ₯˜ν•©λ‹ˆλ‹€ [20, 21]. 이λ₯Ό 톡해 무거운 연산이 μ§„ν–‰ 쀑이더라도 메인 μŠ€λ ˆλ“œλ₯Ό μ°¨λ‹¨ν•˜μ§€ μ•Šκ³  κΈ΄κΈ‰ν•œ μ‚¬μš©μž μƒν˜Έμž‘μš©μ— μ¦‰κ°μ μœΌλ‘œ λ°˜μ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [20, 22]. ## πŸ”— Knowledge Connections - **Related Topics:** [[μž¬μ‘°μ • (Reconciliation)]], [[λ™μ‹œμ„± λ Œλ”λ§ (Concurrent Rendering)]], [[Critical Rendering Path (CRP)]], λ ˆμ΄μ•„μ›ƒ μŠ€λž˜μ‹± ([[Layout Thrashing]]) - **Projects/Contexts:** React 16, [[React 18 Concurrent Features]] ([[useTransition]], [[useDeferredValue]]) - **Contradictions/Notes:** 가상 DOM νŠΈλ¦¬λŠ” 섀계상 λΆˆλ³€(Immutable)으둜 μ·¨κΈ‰λ˜μ§€λ§Œ, React λ‚΄λΆ€μ μœΌλ‘œλŠ” ν˜„μž¬ μ„€μΉ˜λœ μƒνƒœ(μ„€μΉ˜λœ DOM λ…Έλ“œμ— λŒ€ν•œ μ°Έμ‘° λ“±)λ₯Ό μΆ”μ ν•˜κΈ° μœ„ν•΄ λ³€κ²½ κ°€λŠ₯ν•œ(Mutable) "μ¦κ°•λœ DOM(Augmented DOM)" ν˜•νƒœμΈ Fiber 데이터 ꡬ쑰λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€ [12]. --- *Last updated: 2026-04-25*