# Reflow / Repaint ## πŸ“Œ[[ brief]] Summary **Reflow(λ ˆμ΄μ•„μ›ƒ)**λŠ” λΈŒλΌμš°μ €κ°€ 화면에 ν‘œμ‹œλ  DOM μš”μ†Œλ“€μ˜ μ •ν™•ν•œ μœ„μΉ˜μ™€ κΈ°ν•˜ν•™μ  크기λ₯Ό μž¬κ³„μ‚°ν•˜λŠ” 과정이며, **Repaint(페인트)**λŠ” λ ˆμ΄μ•„μ›ƒμ˜ λ³€ν™” 없이 μš”μ†Œμ˜ μƒ‰μƒμ΄λ‚˜ 그림자 같은 μ‹œκ°μ  μ†μ„±λ§Œμ„ 화면에 λ‹€μ‹œ κ·Έλ¦¬λŠ” κ³Όμ •μž…λ‹ˆλ‹€ [1-6]. 이 두 과정은 μ›Ή νŽ˜μ΄μ§€ λ Œλ”λ§μ— ν•„μˆ˜μ μ΄μ§€λ§Œ μ—°μ‚° λΉ„μš©μ΄ λ†’μ•„ κ³Όλ„ν•˜κ²Œ λ°œμƒν•  경우 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯ μ €ν•˜μ™€ 버벅거림(Jank)을 μœ λ°œν•˜λ―€λ‘œ ν”„λ‘ νŠΈμ—”λ“œ μ΅œμ ν™”μ˜ 핡심 λŒ€μƒμ΄ λ©λ‹ˆλ‹€ [7-9]. ## πŸ“– Core Content * **Reflow (Layout) κ°œλ… 및 λ°œμƒ 원인** * ReflowλŠ” λ¬Έμ„œ 흐름 λ‚΄μ—μ„œ μš”μ†Œμ˜ μœ„μΉ˜, 크기(width, height, margin, padding, border λ“±)λ₯Ό κ³„μ‚°ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€ [1, 4, 6]. * DOM μš”μ†Œμ˜ μΆ”κ°€ 및 제거, λΈŒλΌμš°μ € μ°½ 크기 쑰절, 폰트 크기 λ³€κ²½, λ˜λŠ” λ ˆμ΄μ•„μ›ƒμ— 영ν–₯을 μ£ΌλŠ” CSS 속성 λ³€κ²½ μ‹œ νŠΈλ¦¬κ±°λ©λ‹ˆλ‹€ [4-6, 10]. * μ›Ή λ¬Έμ„œλŠ” 연속적인 νλ¦„μœΌλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμ–΄, 단일 μš”μ†Œμ˜ ꡬ쑰적 λ³€ν™”κ°€ λΆ€λͺ¨λ‚˜ μžμ‹ μš”μ†Œ λ“± DOM 트리 전체에 걸친 μž¬κ³„μ‚°μ„ μ—°μ‡„μ μœΌλ‘œ μœ λ°œν•  수 μžˆμœΌλ―€λ‘œ μ—°μ‚° λΉ„μš©μ΄ 맀우 높은 μ‚¬μš©μž 차단(User-[[Blocking]]) μž‘μ—…μž…λ‹ˆλ‹€ [1, 3, 5, 6]. * **Repaint (Paint) κ°œλ… 및 λ°œμƒ 원인** * RepaintλŠ” λ ˆμ΄μ•„μ›ƒμ— 영ν–₯을 μ£Όμ§€ μ•Šκ³ , μš”μ†Œμ˜ κ°€μ‹œμ„±, 배경색, ν…μŠ€νŠΈ 색상, 그림자 λ“±μ˜ μ‹œκ°μ  μŠ€νƒ€μΌλ§Œ 변경될 λ•Œ λ°œμƒν•©λ‹ˆλ‹€ [2, 4, 6]. * κΈ°ν•˜ν•™μ  μž¬κ³„μ‚°μ΄ ν•„μš”ν•˜μ§€ μ•Šμ•„ Reflowλ³΄λ‹€λŠ” μƒλŒ€μ μœΌλ‘œ λΉ„μš©μ΄ μ μ§€λ§Œ, μ• λ‹ˆλ©”μ΄μ…˜ 처리 쀑 λΆˆν•„μš”ν•˜κ²Œ 자주 λ°œμƒν•˜λ©΄ μ—¬μ „νžˆ ν”„λ ˆμž„ λ“œλžμ΄λ‚˜ μ„±λŠ₯ μ €ν•˜λ₯Ό μ΄ˆλž˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [7, 9, 11]. * **Reflow / Repaint μ΅œμ†Œν™” 및 λ Œλ”λ§ μ΅œμ ν™” 방법** * **DOM μ‘°μž‘ 일괄 처리([[Batching]]) 및 λ ˆμ΄μ•„μ›ƒ μŠ€λž˜μ‹±([[Layout Thrashing]]) λ°©μ§€**: DOM 읽기 및 μ“°κΈ° μž‘μ—…μ„ ν˜Όν•©ν•˜μ§€ μ•Šκ³  ν•œ λ²ˆμ— μ²˜λ¦¬ν•˜μ—¬ λΈŒλΌμš°μ €κ°€ λ ˆμ΄μ•„μ›ƒμ„ μ—¬λŸ¬ 번 μž¬κ³„μ‚°ν•˜λŠ” 것을 λ°©μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€ [2, 8, 9, 12, 13]. * **GPU 가속 ν™œμš© (Compositing)**: `top`, `left`와 같은 λ ˆμ΄μ•„μ›ƒ 속성 λŒ€μ‹  `transform`을, 색상 λ³€κ²½ λŒ€μ‹  `opacity`λ₯Ό μ‚¬μš©ν•˜μ—¬ μ• λ‹ˆλ©”μ΄μ…˜μ„ κ΅¬ν˜„ν•˜λ©΄ Reflowλ‚˜ Repaint 없이 λΈŒλΌμš°μ €κ°€ 별도 λ ˆμ΄μ–΄μ—μ„œ μš”μ†Œλ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [8, 9, 11]. * **ꡬ쑰 및 μŠ€νƒ€μΌ μ΅œμ ν™”**: DOM 트리의 깊이λ₯Ό 쀄이고, 연산이 많이 ν•„μš”ν•œ λ³΅μž‘ν•œ CSS μ„ νƒμž(특히 μžμ† μ„ νƒμž)의 μ‚¬μš©μ„ μ§€μ–‘ν•΄μ•Ό ν•©λ‹ˆλ‹€ [14]. λ ˆμ΄μ•„μ›ƒ λ³€ν™” 없이 μš”μ†Œλ₯Ό 숨기렀면 `display: none` (Reflow 유발) λŒ€μ‹  `visibility: hidden`을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€ [15]. * **λ¬Έμ„œ 흐름(Flow)μ—μ„œ 뢄리**: μ• λ‹ˆλ©”μ΄μ…˜ λ“± λ³΅μž‘ν•œ λ Œλ”λ§ 변경이 μΌμ–΄λ‚˜λŠ” μš”μ†ŒλŠ” `position: absolute` λ˜λŠ” `position: fixed`λ₯Ό μ‚¬μš©ν•˜μ—¬ μ£Όλ³€ μš”μ†Œμ˜ Reflow에 영ν–₯을 μ£Όμ§€ μ•Šλ„λ‘ 격리해야 ν•©λ‹ˆλ‹€ [14]. * **React의 λ Œλ”λ§ λ©”μ»€λ‹ˆμ¦˜κ³Ό μ„±λŠ₯ μ΅œμ ν™”** * 기쑴의 직접적인 DOM μ‘°μž‘μ€ λ§€ λ³€κ²½λ§ˆλ‹€ λΉ„μš©μ΄ 높은 Reflow와 Repaintλ₯Ό μœ λ°œν•˜κΈ° λ•Œλ¬Έμ— 느릴 μˆ˜λ°–μ— μ—†μŠ΅λ‹ˆλ‹€ [16]. * ReactλŠ” **[[Virtual DOM]]**을 μ‚¬μš©ν•˜μ—¬ λ©”λͺ¨λ¦¬ μƒμ—μ„œ 이전 μƒνƒœμ™€ μƒˆλ‘œμš΄ μƒνƒœλ₯Ό 비ꡐ(Diffing)ν•œ λ’€, λ³€κ²½λœ μ΅œμ†Œν•œμ˜ λΆ€λΆ„λ§Œ μ‹€μ œ DOM에 일괄 λ°˜μ˜ν•¨μœΌλ‘œμ¨ λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈμ˜ λ‚­λΉ„λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€ [16, 17]. * λ˜ν•œ [[React 18]]λΆ€ν„° λ„μž…λœ **μžλ™ 일괄 처리([[Automatic Batching]])** κΈ°λŠ₯은 비동기 μž‘μ—…(Promise, setTimeout λ“±) λ‚΄μ—μ„œ λ°œμƒν•˜λŠ” μ—¬λŸ¬ μƒνƒœ μ—…λ°μ΄νŠΈλ₯Ό 단 ν•œ 번의 λ¦¬λ Œλ”λ§μœΌλ‘œ λ¬Άμ–΄μ„œ μ²˜λ¦¬ν•˜μ—¬ DOM μ—°μ‚° 횟수λ₯Ό 획기적으둜 μ€„μ—¬μ€λ‹ˆλ‹€ [18-20]. ## πŸ”— Knowledge Connections - **Related Topics:** [[λΈŒλΌμš°μ € λ Œλ”λ§ κ³Όμ • (HTML β†’ [[CSSOM]] β†’ [[Render Tree]])]], [[DOM vs Virtual DOM]] - **Projects/Contexts:** [[React 기반 μ‹±κΈ€ νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜(SPA)의 λ Œλ”λ§ μ΅œμ ν™”]], [[Automatic Batching을 ν†΅ν•œ React 18 μ„±λŠ₯ μ΅œμ ν™”]] - **Contradictions/Notes:** μ†ŒμŠ€ λ¬Έμ„œλ“€μ— λ”°λ₯΄λ©΄ `display: none`은 μš”μ†Œλ₯Ό λ Œλ” νŠΈλ¦¬μ—μ„œ μ™„μ „νžˆ μ œκ±°ν•˜λ―€λ‘œ 전체적인 λ ˆμ΄μ•„μ›ƒ 계산(Reflow)을 μœ λ°œν•˜μ§€λ§Œ, μ‹œκ°μ μœΌλ‘œλ§Œ 보이지 μ•Šκ²Œ μ²˜λ¦¬ν•˜λŠ” `visibility: hidden`을 μ‚¬μš©ν•˜λ©΄ Reflowλ₯Ό ν”Όν•  수 μžˆλ‹€κ³  ꢌμž₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€ [15, 21]. --- *Last updated: 2026-04-25*