
웹 페이지가 렌더링될 때, 브라우저는 수많은 계산을 거쳐 화면에 요소들을 그려낸다.
이 과정에서 자주 등장하는 용어가 바로 Reflow와 Repaint이다.
이 두 작업은 웹 성능 최적화에서 매우 중요한 개념이기 때문에 꼭 이해하고 넘어가야 한다!
Reflow(리플로우): 브라우저가 DOM 요소들의 위치, 크기 등 레이아웃을 다시 계산하는 과정
width, height, margin, padding, border 등) 이런 일이 발생하면 브라우저는 해당 요소뿐 아니라 그 자식 요소들과 부모 요소들까지 다시 계산해야 하기 때문에 비용이 크다.
.my-box {
width: 300px /* <- 변경 시 reflow 발생 */
const box = document.querySelector(".my-box");
box.style.width = "500px"; // reflow 발생
Repaint(리페인트): 요소의 레이아웃은 그대로 두고, 색상, 배경 등 스타일만 다시 그리는 작업
background-color, color, box-shadow 등 시각적 요소 변경 시 발생.my-box {
background-color: blue;
}
const box = document.querySelector('.my_box');
box.style.backgroundColor = "red"; // repaint 발생
| 구분 | 설명 | 예시 | 비용 |
|---|---|---|---|
| Reflow | 요소의 레이아웃 다시 계산 | width, height, margin 변경 | 높음 |
| Repaint | 요소의 스타일만 다시 그림 | background-color, color 변경 | 중간 |
width,height,margin,padding,border등은 Reflow 를 발생시킨다.
/* 안좋은 예시 */
.box:hover {
width: 200px;
}
/* 추천 예시 */
.box {
transform: scale(1.05);
}
transform,opacity는 GPU 가속이 가능하고, reflow 없이 repaint 만 발생
.box{
transition: transform 0.3s ease-in-out;
}
box.style.transform = "translateX(100px)" // GPU 가속 -> 부드럽고 빠르다.
가능하면 애니메이션은 transform 과 opacity 로 구성하자!!
will-change 속성 활용하기브라우저에게 "이 요소는 바뀔 예정이야!" 라고 미리 힌트를 주는 속성
.box {
will-change: transform;
}
⚠️ 주의: 너무 많은 요소에
will-change를 사용하면 메모리 낭비 발생
꼭 필요한 요소에만 사용하자!
🧠 이 개념만 잘 익혀도 웹 퍼포먼스 최적화에 한 걸음 다가갈 수 있다!