1. HTML 파싱 → DOM 트리 생성
2. CSS 파싱 → CSSOM 트리 생성
3. DOM + CSSOM → Render Tree 생성
4. Layout(=Reflow) → 위치/크기 계산
5. Painting → 픽셀 정보 준비
6. Compositing → 화면에 실제 그리기
<body>
<h1>Hello</h1>
<p>World</p>
</body>
→
Document
└── html
└── body
├── h1
└── p
<script>를 만나면 JS 실행을 위해 파싱을 중단함 (렌더링 블로킹 리소스)<style> 및 <link rel="stylesheet">를 분석하여 CSSOM(CSS Object Model)을 만듭니다.p {
font-size: 16px;
}
→
Stylesheet
└── Rule: p { font-size: 16px }
display: none인 요소는 제외됩니다 (화면에 표시 안 되므로)Render Tree
└── body
├── h1 (style: ...)
└── p (style: font-size: 16px)
레이아웃 계산이 바뀌면 브라우저는 전체 구조를 다시 계산해야 하며, 이를 Reflow라고 부릅니다.
이 단계의 변경은 Repaint를 발생시킵니다.
transform, opacity, will-change는 하드웨어 가속 레이어를 생성해서 성능을 높입니다.| 구분 | 설명 | 예시 | 비용 |
|---|---|---|---|
| Reflow | Layout 다시 계산 | width, height, display, position 변경 | 💥 아주 무거움 |
| Repaint | 픽셀만 다시 그림 | color, background-color, visibility 변경 | ⚠️ 중간 수준 |
| Compositing Only | 레이어만 다시 조합 | transform, opacity | ✅ 가벼움 (GPU 처리) |
Diffing 과정 자체에서는 Reflow가 발생하지 않습니다. 하지만 Diffing 결과를 실제 DOM에 적용하는 과정에서 Reflow가 발생할 수 있습니다. (batching으로 효율적으로 reflow)
| 비교 항목 | 전통적인 DOM 조작 | 가상 DOM 기반 (React, Vue 등) |
|---|---|---|
| 렌더링 최적화 | ❌ 없음 | ✅ 있음 (diffing + batching) |
| Reflow 최소화 | ❌ | ✅ |
| 렌더링 효율 | 낮음 | 높음 |
| 메모리 사용량 | 적음 | 다소 증가 (가상 트리 유지) |
Reference