# [[λ¦¬ν”Œλ‘œμš°(Reflow)]] ## πŸ“Œ Brief Summary λ¦¬ν”Œλ‘œμš°(Reflow)λŠ” μ›Ή νŽ˜μ΄μ§€μ˜ λ ˆμ΄μ•„μ›ƒμ΄λ‚˜ ꡬ쑰가 변경될 λ•Œ, λΈŒλΌμš°μ €κ°€ 전체 νŽ˜μ΄μ§€ λ˜λŠ” 일뢀 μ˜μ—­μ˜ κΈ°ν•˜ν•™μ  ꡬ쑰(크기, μœ„μΉ˜ λ“±)와 λ ˆμ΄μ•„μ›ƒμ„ λ‹€μ‹œ κ³„μ‚°ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€ [1, 2]. μ΄λŠ” λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈ 쀑 κ°€μž₯ λ¦¬μ†ŒμŠ€λ₯Ό 많이 μ†Œλͺ¨ν•˜λŠ” μž‘μ—…μœΌλ‘œ, κ³Όλ„ν•˜κ²Œ λ°œμƒν•  경우 μ• λ‹ˆλ©”μ΄μ…˜μ΄ λŠκΈ°κ±°λ‚˜ 슀크립트 싀행이 λŠλ €μ§€λŠ” λ“± ν”„λ‘ νŠΈμ—”λ“œ μ„±λŠ₯을 크게 μ €ν•˜μ‹œν‚€λŠ” μ£Όμš” 원인이 λ©λ‹ˆλ‹€ [3, 4]. λ”°λΌμ„œ μœ μ§€λ³΄μˆ˜ κ°€λŠ₯ν•˜κ³  ν™•μž₯μ„± μžˆλŠ” CSS μ•„ν‚€ν…μ²˜ 섀계 μ‹œ λ¦¬ν”Œλ‘œμš°λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 것은 ν•„μˆ˜μ μΈ μ΅œμ ν™” κ³Όμ œμž…λ‹ˆλ‹€ [4, 5]. ## πŸ“– Core Content * **λ°œμƒ 원인과 λ©”μ»€λ‹ˆμ¦˜** * λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈ(Style 계산 -> Layout(λ¦¬ν”Œλ‘œμš°) -> Paint(리페인트) -> Composite)μ—μ„œ Layout 단계에 ν•΄λ‹Ήν•˜λ©°, 전체 μš”μ†Œ 트리의 κΈ°ν•˜ν•™μ  ꡬ쑰λ₯Ό λ‹€μ‹œ κ³„μ‚°ν•˜λ„λ‘ κ°•μ œν•©λ‹ˆλ‹€ [4]. * λ¦¬ν”Œλ‘œμš°λŠ” `width`, `height`, `margin`, `padding`, `top`, `left` λ“± λ ˆμ΄μ•„μ›ƒμ— 영ν–₯을 λ―ΈμΉ˜λŠ” 속성을 λ³€κ²½ν•  λ•Œ λ°œμƒν•©λ‹ˆλ‹€ [6, 7]. * μ°½ 크기 쑰절, 폰트 λ³€κ²½, DOM 슀크립트 μ‘°μž‘, 클래슀 속성 μ‘°μž‘, `:hover`와 같은 가상 클래슀 ν™œμ„±ν™”, 그리고 `offsetWidth`λ‚˜ `offsetHeight`λ₯Ό κ³„μ‚°ν•˜κΈ° μœ„ν•΄ 값을 읽어 듀일 λ•Œλ„ νŠΈλ¦¬κ±°λ©λ‹ˆλ‹€ [8, 9]. * νŠΉμ • μš”μ†Œμ— λ¦¬ν”Œλ‘œμš°κ°€ λ°œμƒν•˜λ©΄ ν•΄λ‹Ή μš”μ†Œμ˜ μžμ‹, 쑰상 λ…Έλ“œλΏλ§Œ μ•„λ‹ˆλΌ DOM νŠΈλ¦¬μ—μ„œ κ·Έ 뒀에 μ˜€λŠ” λͺ¨λ“  μš”μ†Œμ˜ λ¦¬ν”Œλ‘œμš°λ₯Ό μ—°μ‡„μ μœΌλ‘œ μœ λ°œν•©λ‹ˆλ‹€ [2]. * **μ„±λŠ₯에 λ―ΈμΉ˜λŠ” 영ν–₯** * λ¦¬ν”Œλ‘œμš°λŠ” 전체 νŽ˜μ΄μ§€μ˜ λ ˆμ΄μ•„μ›ƒμ„ λ‹€μ‹œ μž‘λŠ” 것과 λ§žλ¨Ήμ„ μ •λ„λ‘œ μ„±λŠ₯ λΉ„μš©μ΄ λ†’μŠ΅λ‹ˆλ‹€ [3]. * 특히 μŠ€ν¬λ¦½νŠΈκ°€ DOM의 값을 읽고 μ“°λŠ” μž‘μ—…μ„ λ°˜λ³΅ν•˜λŠ” **λ ˆμ΄μ•„μ›ƒ μŠ€λž˜μ‹±(Layout Thrashing)**이 λ°œμƒν•˜λ©΄, λΈŒλΌμš°μ €κ°€ λ‚΄λΆ€ λ ˆμ΄μ•„μ›ƒ 큐λ₯Ό κ°•μ œλ‘œ λΉ„μš°κ³  λ™κΈ°μ μœΌλ‘œ λ¦¬ν”Œλ‘œμš°λ₯Ό μˆ˜ν–‰ν•΄μ•Ό ν•˜λ―€λ‘œ ν”„λ ˆμž„ 속도(FPS)κ°€ κΈ‰κ²©νžˆ λ–¨μ–΄μ§‘λ‹ˆλ‹€ [9, 10]. * **μ΅œμ ν™” 및 κ°μ†Œ 기법** * **μ• λ‹ˆλ©”μ΄μ…˜ μ΅œμ ν™”:** μ• λ‹ˆλ©”μ΄μ…˜μ—λŠ” λ ˆμ΄μ•„μ›ƒ 속성 λŒ€μ‹  `transform`κ³Ό `opacity`λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 속성듀은 λ¦¬ν”Œλ‘œμš°μ™€ 리페인트 단계λ₯Ό κ±΄λ„ˆλ›°κ³  GPU 가속을 톡해 Composite λ‹¨κ³„λ§Œ κ±°μΉ˜λ―€λ‘œ μ„±λŠ₯에 μœ λ¦¬ν•©λ‹ˆλ‹€ [7, 11]. * **DOM 계측 μ΅œμ†Œν™”:** CSS 클래슀λ₯Ό λ³€κ²½ν•  λ•ŒλŠ” 영ν–₯을 λ°›λŠ” λ…Έλ“œμ˜ 수λ₯Ό 쀄이기 μœ„ν•΄ DOM 트리의 μ΅œλŒ€ν•œ ν•˜μœ„ λ…Έλ“œμ—μ„œ λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆλ‹€ [12]. * **DOM μ‘°μž‘ 일괄 처리:** `documentFragment`λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ `requestAnimationFrame`을 톡해 DOM μ‘°μž‘κ³Ό μ• λ‹ˆλ©”μ΄μ…˜μ„ 일괄 μ²˜λ¦¬ν•˜μ—¬ λ Œλ”λ§ μ£ΌκΈ°λ₯Ό 동기화해야 ν•©λ‹ˆλ‹€ [9, 13]. 읽기와 μ“°κΈ° μž‘μ—…μ„ λΆ„λ¦¬ν•˜μ—¬ λ ˆμ΄μ•„μ›ƒ μŠ€λž˜μ‹±μ„ λ°©μ§€ν•˜λŠ” 것도 ν•„μˆ˜μ μž…λ‹ˆλ‹€ [10]. * **ν…Œμ΄λΈ” λ ˆμ΄μ•„μ›ƒ μ§€μ–‘:** ν…Œμ΄λΈ”μ€ λ ˆμ΄μ•„μ›ƒμ„ ν™•μ •ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ 번의 λ Œλ”λ§ νŒ¨μŠ€κ°€ ν•„μš”ν•˜λ©° μž‘μ€ 변경에도 λͺ¨λ“  λ…Έλ“œμ˜ λ¦¬ν”Œλ‘œμš°λ₯Ό μœ λ°œν•˜λ―€λ‘œ λ ˆμ΄μ•„μ›ƒμš©μœΌλ‘œ μ‚¬μš©ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€ [14]. * **μœ„μΉ˜ 속성 ν™œμš©:** μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ μš©λ˜λŠ” μš”μ†Œμ—λŠ” `position: fixed` λ˜λŠ” `absolute`λ₯Ό μ μš©ν•˜μ—¬ μ£Όλ³€ μš”μ†Œμ˜ λ ˆμ΄μ•„μ›ƒμ— 영ν–₯을 μ£Όμ§€ μ•Šκ³  리페인트만 μœ λ°œν•˜λ„λ‘ κ²©λ¦¬ν•©λ‹ˆλ‹€ [15]. * **사전 힌트 제곡:** 변경이 λΉˆλ²ˆν•œ μš”μ†Œμ—λŠ” `will-change` 속성을 μ‚¬μš©ν•˜μ—¬ λΈŒλΌμš°μ €κ°€ λ Œλ”λ§ μ΅œμ ν™”λ₯Ό 미리 μ€€λΉ„ν•  수 μžˆλ„λ‘ 힌트λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€ [10, 16]. ## πŸ”— Knowledge Connections - **Related Topics:** [[리페인트(Repaint)]], [[λ ˆμ΄μ•„μ›ƒ μŠ€λž˜μ‹±(Layout Thrashing)]], CSS μ• λ‹ˆλ©”μ΄μ…˜ μ„±λŠ₯ μ΅œμ ν™”, DOM μ‘°μž‘(DOM Manipulation), [[λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈ(Rendering Pipeline)]] - **Projects/Contexts:** CSS μ‹€μ „ 섀계, [[μ„±λŠ₯ μ΅œμ ν™”(Performance Optimization)]], μœ μ§€λ³΄μˆ˜ κ°€λŠ₯ν•œ ν”„λ‘ νŠΈμ—”λ“œ μ•„ν‚€ν…μ²˜ - **Contradictions/Notes:** λ¦¬ν”Œλ‘œμš°λŠ” μ„±λŠ₯ μ €ν•˜μ˜ μ£Όλ²”μ΄λ―€λ‘œ ν”Όν•˜λŠ” 것이 일반적인 μ›μΉ™μ΄μ§€λ§Œ, λ•Œλ‘œλŠ” λΈŒλΌμš°μ €μ˜ λ””μŠ€ν”Œλ ˆμ΄ 였λ₯˜(예: νƒ­ μ „ν™˜ μ‹œ 높이가 λ§žμ§€ μ•Šκ±°λ‚˜ 리슀트 정렬이 κΉ¨μ§€λŠ” ν˜„μƒ)λ₯Ό λ°”λ‘œμž‘κΈ° μœ„ν•΄ μ˜λ„μ μœΌλ‘œ 더미 클래슀λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ λ””μŠ€ν”Œλ ˆμ΄λ₯Ό ν† κΈ€ν•˜μ—¬ κ°•μ œλ‘œ λ¦¬ν”Œλ‘œμš°λ₯Ό μœ λ°œν•˜λŠ” 기법이 μ‚¬μš©λ˜κΈ°λ„ ν•©λ‹ˆλ‹€ [17, 18]. --- *Last updated: 2026-04-26*