5.0 KiB
5.0 KiB
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