# [[Diffing Algorithm]] ## πŸ“Œ Brief Summary Diffing Algorithm(λ””ν•‘ μ•Œκ³ λ¦¬μ¦˜)은 Reactμ—μ„œ 이전 가상 DOM(Virtual DOM) νŠΈλ¦¬μ™€ μƒˆλ‘­κ²Œ κ³„μ‚°λœ 트리λ₯Ό λΉ„κ΅ν•˜μ—¬ μ‹€μ œ DOM을 κ°€μž₯ 효율적으둜 μ—…λ°μ΄νŠΈν•  방법을 κ²°μ •ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€ [1, 2]. 이둠적인 트리 비ꡐ μ•Œκ³ λ¦¬μ¦˜μ€ $O(n^3)$의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°€μ Έ μ‹€μ‹œκ°„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— λΆ€μ ν•©ν•˜μ§€λ§Œ, ReactλŠ” 두 κ°€μ§€ νœ΄λ¦¬μŠ€ν‹± 가정을 톡해 이λ₯Ό $O(n)$ λ³΅μž‘λ„λ‘œ μ΅œμ ν™”ν–ˆμŠ΅λ‹ˆλ‹€ [3-5]. 이 μ•Œκ³ λ¦¬μ¦˜μ€ 'Reconciliation(μž¬μ‘°μ •)' κ³Όμ •μ˜ ν•΅μ‹¬μœΌλ‘œ, λΆˆν•„μš”ν•œ DOM μ‘°μž‘μ„ μ΅œμ†Œν™”ν•˜μ—¬ λ Œλ”λ§ μ„±λŠ₯을 κ·ΉλŒ€ν™”ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€ [1, 2, 6]. ## πŸ“– Core Content * **μ•Œκ³ λ¦¬μ¦˜μ˜ κΈ°λ³Έ 원리 및 κ°€μ •:** React의 λ””ν•‘ μ•Œκ³ λ¦¬μ¦˜μ€ 두 κ°€μ§€ μ£Όμš” 가정에 κΈ°λ°˜ν•˜μ—¬ $O(n)$의 μ„±λŠ₯을 λ‹¬μ„±ν•©λ‹ˆλ‹€. 첫째, μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ˜ μš”μ†ŒλŠ” 근본적으둜 λ‹€λ₯Έ 트리λ₯Ό μƒμ„±ν•œλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€ [3, 5]. λ‘˜μ§Έ, κ°œλ°œμžκ°€ μ œκ³΅ν•˜λŠ” `key` prop을 톡해 μ—¬λŸ¬ λ Œλ”λ§ 사이클 λ™μ•ˆ μ•ˆμ •μ μœΌλ‘œ μœ μ§€λ˜λŠ” μžμ‹ μš”μ†Œλ₯Ό 식별할 수 μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€ [3, 5]. * **비ꡐ(Diffing) ν”„λ‘œμ„ΈμŠ€ λ©”μ»€λ‹ˆμ¦˜:** * **λ‹€λ₯Έ νƒ€μž…μ˜ μš”μ†Œ:** 루트 μš”μ†Œμ˜ νƒ€μž…μ΄ λ‹€λ₯Ό 경우(예: ``μ—μ„œ ``둜 λ³€κ²½), ReactλŠ” 이전 트리λ₯Ό μ™„μ „νžˆ ν—ˆλ¬Όκ³  μ²˜μŒλΆ€ν„° μƒˆλ‘œμš΄ 트리λ₯Ό κ΅¬μΆ•ν•©λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œ κΈ°μ‘΄ DOM λ…Έλ“œμ™€ μ—°κ΄€λœ μ»΄ν¬λ„ŒνŠΈμ˜ μƒνƒœ(State)λŠ” λͺ¨λ‘ νŒŒκ΄΄λ©λ‹ˆλ‹€ [7, 8]. * **λ™μΌν•œ νƒ€μž…μ˜ DOM μš”μ†Œ:** 두 μš”μ†Œμ˜ 속성을 λΉ„κ΅ν•˜μ—¬ λ™μΌν•œ κΈ°λ³Έ DOM λ…Έλ“œλ₯Ό μœ μ§€ν•œ 채 λ³€κ²½λœ 속성(예: `className`, `color`λ‚˜ `fontWeight` 같은 `style` λ“±)만 μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€ [9, 10]. * **λ™μΌν•œ νƒ€μž…μ˜ μ»΄ν¬λ„ŒνŠΈ μš”μ†Œ:** μ»΄ν¬λ„ŒνŠΈμ˜ μΈμŠ€ν„΄μŠ€κ°€ λ™μΌν•˜κ²Œ μœ μ§€λ˜μ–΄ μƒνƒœκ°€ λ³΄μ‘΄λ©λ‹ˆλ‹€. μƒˆλ‘œμš΄ μš”μ†Œμ— 맞게 prop이 μ—…λ°μ΄νŠΈλœ ν›„, ν•˜μœ„ μš”μ†Œλ“€μ— λŒ€ν•΄ μž¬κ·€μ μœΌλ‘œ λ””ν•‘ μ•Œκ³ λ¦¬μ¦˜μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€ [10, 11]. * **μžμ‹ μš”μ†Œμ˜ μž¬κ·€μ  μ²˜λ¦¬μ™€ Key의 μ—­ν• :** 기본적으둜 ReactλŠ” 두 ν•˜μœ„ μš”μ†Œ λͺ©λ‘μ„ λ™μ‹œμ— λ°˜λ³΅ν•˜λ©΄μ„œ 차이가 μžˆμ„ λ•Œλ§ˆλ‹€ 변이λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€ [11]. ν•˜μ§€λ§Œ 리슀트의 맨 μ•žμ— μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λŠ” 경우 λ“± μˆœμ„œκ°€ 변경될 λ•ŒλŠ” 전체λ₯Ό λ‹€μ‹œ λ Œλ”λ§ν•˜λŠ” 맀우 λΉ„νš¨μœ¨μ μΈ 상황이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€ [12]. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ κ³ μœ ν•œ `key` 속성을 μ‚¬μš©ν•˜λ©΄, ReactλŠ” κΈ°μ‘΄ νŠΈλ¦¬μ™€ μƒˆ 트리의 μžμ‹λ“€μ„ μΌμΉ˜μ‹œμΌœ μ΄λ™ν•œ μš”μ†Œλ§Œ νŒŒμ•…ν•˜λ―€λ‘œ λΆˆν•„μš”ν•œ DOM μž¬μƒμ„±μ„ λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [12, 13]. * **νŠΈλ ˆμ΄λ“œμ˜€ν”„ 및 μ£Όμ˜μ‚¬ν•­:** 이 μ•Œκ³ λ¦¬μ¦˜μ€ νœ΄λ¦¬μŠ€ν‹±μ— μ˜μ‘΄ν•˜κΈ° λ•Œλ¬Έμ— 가정이 μΆ©μ‘±λ˜μ§€ μ•ŠμœΌλ©΄ μ„±λŠ₯이 μ €ν•˜λ  수 μžˆμŠ΅λ‹ˆλ‹€ [14]. 예λ₯Ό λ“€μ–΄ ν•˜μœ„ νŠΈλ¦¬κ°€ ν˜•μ œ μš”μ†Œ 사이가 μ•„λ‹Œ μ•„μ˜ˆ λ‹€λ₯Έ κ³„μΈ΅μœΌλ‘œ μ΄λ™ν•˜λŠ” 경우, μ•Œκ³ λ¦¬μ¦˜μ€ ν•΄λ‹Ή ν•˜μœ„ 트리λ₯Ό μ™„μ „νžˆ λ‹€μ‹œ λ Œλ”λ§ν•©λ‹ˆλ‹€ [15]. λ˜ν•œ λ°°μ—΄μ˜ 인덱슀λ₯Ό ν‚€λ‘œ μ‚¬μš©ν•˜κ±°λ‚˜ `Math.random()` 같은 λΆˆμ•ˆμ •ν•œ ν‚€λ₯Ό μ‚¬μš©ν•˜λ©΄ λ¦¬μŠ€νŠΈκ°€ μž¬μ •λ ¬λ  λ•Œ μ»΄ν¬λ„ŒνŠΈ μƒνƒœκ°€ κΌ¬μ΄κ±°λ‚˜ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€ [14, 16]. ## πŸ”— Knowledge Connections - **Related Topics:** [[Virtual DOM]], [[Reconciliation]], [[React Fiber]] - **Projects/Contexts:** [[React Frontend Development]], [[Component-Based Architecture]] - **Contradictions/Notes:** 일반적인 트리 비ꡐ μ•Œκ³ λ¦¬μ¦˜μ€ $O(n^3)$의 λ³΅μž‘λ„λ₯Ό κ°€μ§€μ§€λ§Œ, React의 λ””ν•‘ μ•Œκ³ λ¦¬μ¦˜μ€ νœ΄λ¦¬μŠ€ν‹±(Heuristics)을 μ μš©ν•˜μ—¬ μ‹€μš©μ μΈ $O(n)$ λ³΅μž‘λ„λ‘œ κ΅¬ν˜„λ˜μ—ˆλ‹€λŠ” 점이 핡심적인 기술적 μ°¨μ΄μž…λ‹ˆλ‹€ [4, 5]. λ°°μ—΄μ˜ 인덱슀λ₯Ό `key`둜 μ‚¬μš©ν•˜λŠ” 것은 μš”μ†Œμ˜ μˆœμ„œκ°€ λ³€κ²½λ˜μ§€ μ•Šμ„ λ•Œλ§Œ μœ νš¨ν•˜λ©°, μž¬μ •λ ¬(Reorder) μ‹œμ—λŠ” λΉ„νš¨μœ¨μ μ΄κ³  μƒνƒœ 였λ₯˜λ₯Ό μΌμœΌν‚¬ 수 μžˆμœΌλ―€λ‘œ ꢌμž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ [13, 16]. --- *Last updated: 2026-04-25*