# [[Reflow & Repaint|Reflow & Repaint]] ## πŸ“Œ Brief Summary λ¦¬ν”Œλ‘œμš°(Reflow)λŠ” λΈŒλΌμš°μ €κ°€ λ Œλ” 트리λ₯Ό 기반으둜 λ¬Έμ„œ λ‚΄ μš”μ†Œλ“€μ˜ μ •ν™•ν•œ μœ„μΉ˜μ™€ 크기(κΈ°ν•˜ν•™μ  ꡬ쑰)λ₯Ό κ³„μ‚°ν•˜μ—¬ λ°°μΉ˜ν•˜λŠ” 과정이며, 리페인트(Repaint)λŠ” κ³„μ‚°λœ λ ˆμ΄μ•„μ›ƒμ„ λ°”νƒ•μœΌλ‘œ 화면에 μ‹€μ œ 픽셀을 κ·Έλ¦¬λŠ” μ‹œκ°μ  μ—…λ°μ΄νŠΈ 과정이닀 [1-6]. λ¦¬ν”Œλ‘œμš°λŠ” μš”μ†Œμ˜ μΆ”κ°€/μ‚­μ œλ‚˜ 크기 λ³€κ²½ μ‹œ λ°œμƒν•˜λ©° 계산 λΉ„μš©μ΄ 맀우 높은 반면, λ¦¬νŽ˜μΈνŠΈλŠ” λ°°κ²½μƒ‰μ΄λ‚˜ 그림자 λ“± μ‹œκ°μ  μ†μ„±λ§Œ 변경될 λ•Œ λ°œμƒν•œλ‹€ [5-7]. 이 두 과정은 λΈŒλΌμš°μ €μ˜ μ€‘μš” λ Œλ”λ§ 경둜([[Critical Rendering Path|Critical Rendering Path]])의 핡심 λ‹¨κ³„λ‘œ, κ³Όλ„ν•˜κ²Œ λ°œμƒν•  경우 λΈŒλΌμš°μ € μ„±λŠ₯ μ €ν•˜μ™€ ν™”λ©΄ λŠκΉ€(Jank) ν˜„μƒμ„ μœ λ°œν•˜λ―€λ‘œ μ›Ή ν”„λ‘ νŠΈμ—”λ“œ μ„±λŠ₯ μ΅œμ ν™”μ— μžˆμ–΄ ν•„μˆ˜μ μœΌλ‘œ 관리해야 ν•˜λŠ” μš”μ†Œμ΄λ‹€ [5, 8-10]. ## πŸ“– Core Content **λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈ λ‚΄μ˜ μ—­ν• ** λΈŒλΌμš°μ €λŠ” μˆ˜μ‹ λœ HTMLκ³Ό CSSλ₯Ό νŒŒμ‹±ν•˜μ—¬ [[DOM (Document Object Model)|DOM(Document Object Model]]κ³Ό CSSOM을 κ΅¬μΆ•ν•œ ν›„, κ°€μ‹œμ μΈ μ½˜ν…μΈ λ§Œ ν¬ν•¨ν•˜λŠ” λ Œλ” 트리([[Render Tree|Render Tree]])λ₯Ό μƒμ„±ν•œλ‹€ [11-14]. 이 λ Œλ” νŠΈλ¦¬κ°€ μ™„μ„±λ˜λ©΄ μš”μ†Œλ“€μ„ 화면에 λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ λ¦¬ν”Œλ‘œμš°(Layout)와 리페인트(Paint) 단계가 순차적으둜 μ‹€ν–‰λœλ‹€ [1, 13]. **λ¦¬ν”Œλ‘œμš° (Reflow / Layout)** * λ¦¬ν”Œλ‘œμš°λŠ” λ Œλ” 트리의 λ£¨νŠΈλΆ€ν„° μ•„λž˜λ‘œ νƒμƒ‰ν•˜λ©° 뷰포트 크기와 λ°•μŠ€ λͺ¨λΈμ„ 기반으둜 λͺ¨λ“  ν‘œμ‹œλ˜λŠ” μš”μ†Œμ˜ μ •ν™•ν•œ λ„ˆλΉ„, 높이, x/y μœ„μΉ˜ μ’Œν‘œλ₯Ό κ³„μ‚°ν•˜λŠ” 과정이닀 [1, 3, 7, 15]. * HTML μš”μ†Œλ“€μ€ 연속적인 λ¬Έμ„œ νλ¦„μ˜ 일뢀이기 λ•Œλ¬Έμ—, νŠΉμ • μš”μ†Œ ν•˜λ‚˜μ˜ κΈ°ν•˜ν•™μ  λ³€ν™”λ§ŒμœΌλ‘œλ„ 트리 전체에 걸친 연쇄적인 μž¬κ³„μ‚°(Cascade of recalculations)을 μœ λ°œν•  수 μžˆλ‹€ [1, 5, 16]. * λΈŒλΌμš°μ € μ°½ 크기 쑰절, DOM λ…Έλ“œμ˜ μΆ”κ°€ 및 제거, `width`, `height`, `margin`, `padding` λ“±μ˜ λ ˆμ΄μ•„μ›ƒ κ΄€λ ¨ 속성을 μ‘°μž‘ν•  λ•Œ λ°œμƒν•œλ‹€ [5, 7, 17, 18]. * μ΄λŠ” 맀우 계산 집약적인 μž‘μ—…μ΄λ©°, μ‹€ν–‰λ˜λŠ” λ™μ•ˆ λΈŒλΌμš°μ € 메인 μŠ€λ ˆλ“œμ—μ„œ μ‚¬μš©μžμ˜ μƒν˜Έμž‘μš©μ„ 차단(User-[[Blocking|Blocking]])ν•  수 μžˆλ‹€ [5, 7, 16]. **리페인트 (Repaint / Paint)** * λ ˆμ΄μ•„μ›ƒ 계산이 μ™„λ£Œλœ ν›„, κΈ°ν•˜ν•™μ  ꡬ쑰와 μŠ€νƒ€μΌμ„ λ°”νƒ•μœΌλ‘œ ν…μŠ€νŠΈ, 색상, 그림자 λ“±μ˜ μ‹œκ°μ  μš”μ†Œλ₯Ό 화면에 ν”½μ…€λ‘œ λž˜μŠ€ν„°ν™”(Rasterize)ν•˜μ—¬ κ·Έλ¦¬λŠ” 단계이닀 [2, 4, 6, 7]. * `background-color`, `box-shadow`, `visibility`, ν…μŠ€νŠΈ 색상 λ“± λ ˆμ΄μ•„μ›ƒμ΄λ‚˜ μš”μ†Œμ˜ 크기에 영ν–₯을 μ£Όμ§€ μ•ŠλŠ” μ‹œκ°μ μΈ μ†μ„±λ§Œ 변경될 λ•Œ λ…λ¦½μ μœΌλ‘œ λ°œμƒν•œλ‹€ [6, 7, 18]. * κΈ°ν•˜ν•™μ  계산을 μˆ˜λ°˜ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ¦¬ν”Œλ‘œμš°λ³΄λ‹€λŠ” 계산 λΉ„μš©μ΄ 적게 λ“€μ§€λ§Œ, μ‹œκ°μ  변경이 κ³Όλ„ν•˜κ²Œ λ°œμƒν•  경우 (예: 배경색 μ• λ‹ˆλ©”μ΄μ…˜) λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈμ„ λ°©ν•΄ν•˜μ—¬ ν”„λ ˆμž„ λ“œλ‘­(Jank)을 μΌμœΌν‚¬ 수 μžˆλ‹€ [2, 19, 20]. **μ„±λŠ₯ μ΅œμ ν™” μ „λž΅** * **λΆˆν•„μš”ν•œ μ—°μ‚° μ΅œμ†Œν™”:** DOM 트리의 깊이λ₯Ό 쀄이고, λ³΅μž‘ν•œ CSS μ„ νƒμž(특히 μžμ† μ„ νƒμž)λ‚˜ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” CSS κ·œμΉ™μ„ μ œκ±°ν•˜μ—¬ λΈŒλΌμš°μ €μ˜ λ§€μΉ­ 및 계산 뢀담을 쀄여야 ν•œλ‹€ [21, 22]. * **λ°°μΉ­([[Batching|Batching]]) 및 λ ˆμ΄μ•„μ›ƒ μŠ€λž˜μ‹± λ°©μ§€:** DOM λ³€κ²½ 사항을 가급적 일괄 μ²˜λ¦¬ν•˜κ³ , λ¦¬ν”Œλ‘œμš°λ₯Ό μœ λ°œν•˜λŠ” 속성을 읽고 μ“°λŠ” μž‘μ—…μ„ μ½”λ“œ λ‚΄μ—μ„œ λ²ˆκ°ˆμ•„ μ‹€ν–‰ν•˜μ—¬ λ°œμƒν•˜λŠ” 'λ ˆμ΄μ•„μ›ƒ μŠ€λž˜μ‹±([[Layout Thrashing|Layout Thrashing]])' ν˜„μƒμ„ ν”Όν•΄μ•Ό ν•œλ‹€ [7, 10, 23]. * **λ¬Έμ„œ 흐름 뢄리:** λ³΅μž‘ν•œ λ Œλ”λ§ λ³€κ²½μ΄λ‚˜ μ• λ‹ˆλ©”μ΄μ…˜μ„ μˆ˜ν–‰ν•  λ•ŒλŠ” λŒ€μƒ μš”μ†Œμ— `position: absolute` λ˜λŠ” `position: fixed`λ₯Ό μ μš©ν•˜μ—¬ 일반적인 λ¬Έμ„œ νλ¦„μ—μ„œ 뢄리(Out of the flow)μ‹œν‚΄μœΌλ‘œμ¨ λ‹€λ₯Έ μš”μ†Œλ“€μ— λ―ΈμΉ˜λŠ” 연쇄적인 λ¦¬ν”Œλ‘œμš°λ₯Ό λ°©μ§€ν•  수 μžˆλ‹€ [22]. * **GPU 가속 ν™œμš©:** `top`μ΄λ‚˜ `left` λŒ€μ‹  `transform: translate()` 속성을 ν™œμš©ν•˜κ±°λ‚˜ `opacity`λ₯Ό μ œμ–΄ν•˜λ©΄, λ ˆμ΄μ•„μ›ƒμ΄λ‚˜ 페인트 사이클을 μœ λ°œν•˜μ§€ μ•Šκ³  GPUλ₯Ό ν™œμš©ν•œ μ»΄ν¬μ§€νŒ…(Compositing) λ‹¨κ³„μ—μ„œ 화면을 μ—…λ°μ΄νŠΈν•  수 μžˆμ–΄ 60fps의 λΆ€λ“œλŸ¬μš΄ μ• λ‹ˆλ©”μ΄μ…˜μ„ μœ μ§€ν•  수 μžˆλ‹€ [2, 20, 24, 25]. ## πŸ”— Knowledge Connections - **Related Topics:** [[Critical Rendering Path|Critical Rendering Path]], DOM & CSSOM, [[Render Tree|Render Tree]], GPU Compositing - **Projects/Contexts:** [[Frontend|Frontend]] Performance Optimization, React Virtual DOM and [[Reconciliation|Reconciliation]] - **Contradictions/Notes:** μ†ŒμŠ€μ— λ”°λ₯΄λ©΄ 리페인트(Repaint)λŠ” λ ˆμ΄μ•„μ›ƒ μž¬κ³„μ‚°μ΄ μ—†κΈ° λ•Œλ¬Έμ— λ¦¬ν”Œλ‘œμš°(Reflow)보닀 μƒλŒ€μ μœΌλ‘œ μ‹œμŠ€ν…œ λΉ„μš©μ΄ 덜 λ“œλŠ” μž‘μ—…μœΌλ‘œ μ„€λͺ…λœλ‹€ [2, 20]. κ·ΈλŸ¬λ‚˜ 두 μž‘μ—… λͺ¨λ‘ κ³Όλ„ν•˜κ²Œ 트리거될 경우 메인 μŠ€λ ˆλ“œλ₯Ό μ μœ ν•˜κ³  배터리 μ†Œλͺ¨ 및 λ²„λ²…μž„(Jank)을 μœ λ°œν•˜λ―€λ‘œ, μ„±λŠ₯ μ΅œμ ν™” μ‹œμ—λŠ” λ‘˜ 쀑 μ–΄λŠ ν•˜λ‚˜λ₯Ό λ¬΄μ‹œν•˜μ§€ μ•Šκ³  두 κ³Όμ • λͺ¨λ‘λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 것이 λΈŒλΌμš°μ € λ Œλ”λ§ μ΅œμ ν™”μ˜ 핡심이닀 [19, 20]. --- *Last updated: 2026-04-25*