# [[Reflow 및 Repaint μ΅œμ ν™”]] ## πŸ“Œ Brief Summary ReflowλŠ” λΈŒλΌμš°μ €κ°€ λ¬Έμ„œμ˜ λ ˆμ΄μ•„μ›ƒμ΄λ‚˜ μš”μ†Œμ˜ κΈ°ν•˜ν•™μ  ꡬ쑰(λ„ˆλΉ„, 높이, μœ„μΉ˜ λ“±)λ₯Ό λ‹€μ‹œ κ³„μ‚°ν•˜λŠ” 과정이며, RepaintλŠ” λ ˆμ΄μ•„μ›ƒμ—λŠ” 영ν–₯을 μ£Όμ§€ μ•ŠλŠ” μ‹œκ°μ  λ³€ν™”(색상, λ°°κ²½ λ“±)λ₯Ό 화면에 λ‹€μ‹œ κ·Έλ¦¬λŠ” 과정이닀 [1, 2]. 이 두 과정은 처리 λΉ„μš©μ΄ 맀우 λ†’μ•„ κ³Όλ„ν•˜κ²Œ λ°œμƒν•  경우 CSS μ• λ‹ˆλ©”μ΄μ…˜κ³Ό μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ„±λŠ₯을 μ €ν•˜μ‹œν‚€κ³  ν™”λ©΄μ˜ 버벅거림(Janky)을 μœ λ°œν•œλ‹€ [3-5]. λ”°λΌμ„œ 효율적인 CSS 속성 선택과 DOM μ‘°μž‘μ˜ μ΅œμ†Œν™”λ₯Ό 톡해 Reflow와 Repaint의 λ°œμƒμ„ μ€„μ΄λŠ” 것은 μœ μ§€λ³΄μˆ˜ κ°€λŠ₯ν•˜κ³  ν™•μž₯μ„± μžˆλŠ” ν”„λ‘ νŠΈμ—”λ“œ μ•„ν‚€ν…μ²˜λ₯Ό κ΅¬μΆ•ν•˜κΈ° μœ„ν•œ ν•„μˆ˜μ μΈ λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈ μ΅œμ ν™” 기법이닀 [5-7]. ## πŸ“– Core Content * **Reflow와 Repaint의 κ°œλ… 및 λ°œμƒ 원인** * **Repaint:** μš”μ†Œμ˜ μŠ€ν‚¨(outline, visibility, background color λ“±)이 λ³€κ²½λ˜μ–΄ κ°€μ‹œμ„±μ—λ§Œ λ³€ν™”κ°€ 생길 λ•Œ λ°œμƒν•œλ‹€ [2]. λΈŒλΌμš°μ €κ°€ DOM 트리의 λ‹€λ₯Έ λ…Έλ“œλ“€μ˜ κ°€μ‹œμ„±κΉŒμ§€ 확인해야 ν•˜λ―€λ‘œ λΉ„μš©μ΄ λ“ λ‹€ [2]. * **Reflow:** μš”μ†Œμ˜ 크기(width, height, margin, padding λ“±)λ‚˜ μœ„μΉ˜κ°€ λ³€κ²½λ˜μ–΄ νŽ˜μ΄μ§€μ˜ λ ˆμ΄μ•„μ›ƒμ΄ λ°”λ€” λ•Œ λ°œμƒν•œλ‹€ [2, 3]. ν•œ μš”μ†Œμ˜ ReflowλŠ” μžμ‹ μš”μ†Œ, 쑰상 μš”μ†Œ, 그리고 DOM νŠΈλ¦¬μ—μ„œ λ’€λ”°λ₯΄λŠ” μš”μ†Œλ“€μ˜ 연쇄적인 Reflowλ₯Ό μœ λ°œν•˜μ—¬ 거의 전체 νŽ˜μ΄μ§€λ₯Ό λ‹€μ‹œ λ ˆμ΄μ•„μ›ƒν•˜λŠ” 것과 같은 μ—„μ²­λ‚œ 처리 λΉ„μš©μ„ μš”κ΅¬ν•œλ‹€ [2, 4, 8]. * **μ£Όμš” 원인:** μ°½ 크기 쑰절, 폰트 λ³€κ²½, `:hover` λ“±μ˜ 가상 클래슀 ν™œμ„±ν™”, 슀크립트λ₯Ό ν†΅ν•œ DOM μ‘°μž‘, `offsetWidth` λ˜λŠ” `offsetHeight` 계산, 인라인 μŠ€νƒ€μΌ λ³€κ²½ 등이 λͺ¨λ‘ Reflowλ₯Ό νŠΈλ¦¬κ±°ν•œλ‹€ [9, 10]. * **CSS 및 μ• λ‹ˆλ©”μ΄μ…˜ μ΅œμ ν™” μ „λž΅** * **λ ˆμ΄μ•„μ›ƒ 속성 μ• λ‹ˆλ©”μ΄μ…˜ μ§€μ–‘:** `width`, `height`, `margin`, `left`, `top` λ“±μ˜ 속성을 μ• λ‹ˆλ©”μ΄μ…˜ν™”ν•˜λ©΄ 지속적인 Reflow와 Repaint 사이클이 λ°œμƒν•˜μ—¬ μ„±λŠ₯을 크게 λ–¨μ–΄λœ¨λ¦°λ‹€ [3, 5, 8, 11]. λŒ€μ‹  λ ˆμ΄μ•„μ›ƒ μž¬κ³„μ‚°μ„ ν”Όν•˜κ³  GPU 가속(Compositing)을 ν™œμš©ν•  수 μžˆλŠ” `transform`κ³Ό `opacity`λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€ [8, 12, 13]. * **κ³ λΉ„μš© 속성 μ΅œμ†Œν™” 및 `will-change` ν™œμš©:** `box-shadow`, `filter`, `border-radius`와 같이 λ Œλ”λ§ λ¦¬μ†ŒμŠ€λ₯Ό 많이 μ†Œλͺ¨ν•˜λŠ” μ†μ„±μ˜ μ‚¬μš©μ„ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€ [12, 14]. λΈŒλΌμš°μ €μ—κ²Œ 변경이 일어날 μš”μ†Œλ₯Ό 미리 μ•Œλ €μ£ΌλŠ” `will-change` 속성을 ν™œμš©ν•˜λ©΄ μ„±λŠ₯ μ΅œμ ν™”μ— 도움이 λ˜μ§€λ§Œ, λ„ˆλ¬΄ λ§Žμ€ μš”μ†Œμ— λ‚¨μš©ν•˜λ©΄ μ„±λŠ₯ μ €ν•˜λ₯Ό μœ λ°œν•  수 μžˆλ‹€ [7, 15, 16]. * **μ• λ‹ˆλ©”μ΄μ…˜ μš”μ†Œμ˜ μœ„μΉ˜ 독립:** μ• λ‹ˆλ©”μ΄μ…˜μ„ μ μš©ν•  μš”μ†Œμ— `position: fixed` λ˜λŠ” `absolute`λ₯Ό μ„€μ •ν•˜λ©΄ λ‹€λ₯Έ μš”μ†Œμ˜ λ ˆμ΄μ•„μ›ƒμ— 영ν–₯을 μ£Όμ§€ μ•Šμ•„ 무거운 Reflow λŒ€μ‹  μƒλŒ€μ μœΌλ‘œ κ°€λ²Όμš΄ Repaint만 λ°œμƒν•˜κ²Œ ν•  수 μžˆλ‹€ [17, 18]. * **DOM μ‘°μž‘ 및 슀크립트 μ‹€ν–‰ μ΅œμ ν™”** * **DOM μ‘°μž‘ μ΅œμ†Œν™” 및 일괄 처리:** `documentFragment`λ₯Ό μ‚¬μš©ν•΄ DOM μ—…λ°μ΄νŠΈλ₯Ό μΌκ΄„λ‘œ μ²˜λ¦¬ν•˜κ±°λ‚˜ λ…Έλ“œλ₯Ό λ³΅μ‚¬ν•˜μ—¬ λ³€κ²½ν•œ ν›„ 원본과 ν•œ λ²ˆμ— κ΅μ²΄ν•˜λŠ” λ°©μ‹μœΌλ‘œ Reflow/Repaint 횟수λ₯Ό 쀄일 수 μžˆλ‹€ [6, 19]. λ˜ν•œ μ—¬λŸ¬ 개의 인라인 μŠ€νƒ€μΌμ„ λ°˜λ³΅ν•΄μ„œ μ„€μ •ν•˜κΈ°λ³΄λ‹€λŠ” CSS 클래슀 ν•œ 번의 λ³€κ²½μœΌλ‘œ μŠ€νƒ€μΌμ„ μ μš©ν•΄μ•Ό ν•œλ‹€ [17, 19]. * **λ ˆμ΄μ•„μ›ƒ μŠ€λž˜μ‹±(Layout Thrashing) λ°©μ§€:** DOM 읽기와 μ“°κΈ°λ₯Ό 쒁은 루프 μ•ˆμ—μ„œ λ²ˆκ°ˆμ•„ μˆ˜ν–‰ν•˜λ©΄, λΈŒλΌμš°μ €λŠ” μ •ν™•ν•œ 수치λ₯Ό λ°˜ν™˜ν•˜κΈ° μœ„ν•΄ κ°•μ œλ‘œ 동기적인 Reflowλ₯Ό μ‹€ν–‰ν•˜κ²Œ λ˜μ–΄ μ‹¬κ°ν•œ 병λͺ© ν˜„μƒμ΄ λ°œμƒν•œλ‹€ [7, 10]. 이λ₯Ό 막기 μœ„ν•΄ 읽기/μ“°κΈ° μž‘μ—…μ„ λΆ„λ¦¬ν•˜κ³ , `requestAnimationFrame`을 μ‚¬μš©ν•˜μ—¬ λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ 주기에 λ§žμΆ”μ–΄ μ—…λ°μ΄νŠΈν•΄μ•Ό ν•œλ‹€ [7, 10]. * **ꡬ쑰적 μ΅œμ ν™” 고렀사항** * **DOM 트리 ν•˜λ‹¨μ—μ„œμ˜ 클래슀 λ³€κ²½:** Reflow의 νŒŒκΈ‰ λ²”μœ„λ₯Ό μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄, μƒμœ„ 래퍼(wrapper) μš”μ†Œλ³΄λ‹€λŠ” DOM νŠΈλ¦¬μ—μ„œ μ΅œλŒ€ν•œ ν•˜λ‹¨μ— μœ„μΉ˜ν•œ μš”μ†Œμ˜ 클래슀λ₯Ό λ³€κ²½ν•˜λŠ” 것이 μœ λ¦¬ν•˜λ‹€ [20]. * **ν…Œμ΄λΈ” λ ˆμ΄μ•„μ›ƒ μ§€μ–‘ 및 μ„ νƒμž λ‹¨μˆœν™”:** ν…Œμ΄λΈ” λ ˆμ΄μ•„μ›ƒμ€ λ Œλ”λ§ μ‹œ μ—¬λŸ¬ 번의 계산 νŒ¨μŠ€κ°€ ν•„μš”ν•˜κ³ , μž‘μ€ 변경에도 λ‚΄λΆ€μ˜ λͺ¨λ“  λ…Έλ“œμ— Reflowλ₯Ό μœ λ°œν•˜λ―€λ‘œ ν”Όν•΄μ•Ό ν•œλ‹€(ν•„μš”μ‹œ `table-layout: fixed` μ‚¬μš©) [21, 22]. λ”λΆˆμ–΄ λΆˆν•„μš”ν•˜κ²Œ 깊게 μ€‘μ²©λ˜κ³  λ³΅μž‘ν•œ CSS μ„ νƒμžλŠ” λ Œλ”λ§ νŒŒμ‹± 속도λ₯Ό λŠ¦μΆ”λ―€λ‘œ λ‹¨μˆœν•˜κ³  직접적인 μ„ νƒμžλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€ [19, 23, 24]. ## πŸ”— Knowledge Connections - **Related Topics:** CSS μ„±λŠ₯ μ΅œμ ν™”, CSS μ• λ‹ˆλ©”μ΄μ…˜(transition / keyframes), DOM μ‘°μž‘κ³Ό λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈ, GPU 가속(Compositing) - **Projects/Contexts:** ν™•μž₯ κ°€λŠ₯ν•œ CSS μ•„ν‚€ν…μ²˜ 섀계, μ‹€λ¬΄μ—μ„œμ˜ CSS μƒνƒœ 관리 및 ν”„λ‘ νŠΈμ—”λ“œ μ„±λŠ₯ κ°œμ„  - **Contradictions/Notes:** λΈŒλΌμš°μ € μ œμ‘°μ‚¬λ“€μ΄ μ„±λŠ₯ μ €ν•˜μ˜ μ£Όλ²”μœΌλ‘œ μ§€λͺ©ν•˜λŠ” Reflow와 Repaint 자체λ₯Ό λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ μ™„μ „νžˆ 없앨 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ κ°œλ°œμžλŠ” λΆˆν•„μš”ν•œ λ ˆμ΄μ•„μ›ƒ 속성 λ³€κ²½μ΄λ‚˜ λ ˆμ΄μ•„μ›ƒ μŠ€λž˜μ‹±μ„ ν”Όν•˜λ„λ‘ μ„€κ³„ν•¨μœΌλ‘œμ¨ κ·Έ 영ν–₯을 획기적으둜 μ΅œμ†Œν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [20, 25, 26]. `will-change` 속성 λ˜ν•œ λΈŒλΌμš°μ € μ΅œμ ν™”λ₯Ό λ•λŠ” ν›Œλ₯­ν•œ λ„κ΅¬μ΄μ§€λ§Œ, κ³Όλ„ν•˜κ²Œ μ‚¬μš©ν•  경우 였히렀 λ””λ°”μ΄μŠ€ λ¦¬μ†ŒμŠ€λ₯Ό κ³ κ°ˆμ‹œμΌœ ν”„λ ˆμž„ λ“œλžμ„ μœ λ°œν•  수 μžˆμœΌλ―€λ‘œ μ΅œν›„μ˜ μˆ˜λ‹¨μœΌλ‘œ μ‹ μ€‘νžˆ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [15, 16, 27]. --- *Last updated: 2026-04-26*