reflow와 repaint의 차이점에 대해서 설명해주세요.
reflow
와 repaint
는 웹 페이지가 렌더링 되는 과정에서 발생하는 중요한 작업들입니다.
먼저, reflow에 관해 설명하겠습니다.
reflow
는 브라우저가 페이지의 레이아웃을 다시 계산하는 과정을 말합니다.
DOM의 구조가 변경되거나 CSS 스타일이 변경되면, 브라우저는 각 요소가 화면에 어떻게 배치될지 다시 계산해야 합니다.
이 과정은 모든 자식 요소와 관련된 부모 요소까지 영향을 주기 때문에 비용이 많이 드는 작업입니다.
예를 들어, CSS에서 요소의 width
나 height
속성을 변경하면, 브라우저는 해당 요소뿐만 아니라 연관된 모든 요소의 배치를 다시 계산해야 합니다.
반면에, repaint는 요소의 모양이나 스타일이 변경될 때 발생합니다.
요소의 레이아웃은 그대로이고, 색상이나 배경 등의 스타일만 변경되는 경우를 말합니다. background-color
같은 속성을 예로 들 수 있습니다.
이 경우 브라우저는 요소의 모양만 다시 그리면 되기 때문에 reflow보다는 비용이 덜 들지만, 여전히 성능에 영향을 줄 수 있습니다.
reflow는 레이아웃을 다시 계산하는 과정
이고, repaint는 그 계산 결과를 화면에 다시 그리는 과정
이라고 할 수 있습니다.
이 둘을 잘 이해하고 관리한다면 성능 최적화에 큰 도움이 됩니다.
둘을 잘 관리하는 것이 성능 최적화에 도움이 된다고 하셨는데, 최적화 방법에는 무엇이 있을까요?
크게 3가지 최적화 방법에 대해 설명드리겠습니다.
첫 번째로 reflow를 유발하는 CSS 속성 사용을 최소화하는 것입니다.
width
, height
, margin
, padding
, border
등의 속성은 요소의 레이아웃을 다시 계산하게 하므로 reflow를 일으킵니다. 가능한 한 미리 CSS에서 스타일을 설정해 초기 로드 시에만 계산이 이루어지도록 하고, 이후에는 변경하지 않는 것이 좋습니다.
두 번째로 CSS 애니메이션 최적화입니다.
애니메이션에 transform
과 opacity
속성만을 사용하는 것이 성능에 유리합니다. 이 두 속성은 GPU 가속을 사용할 수 있어 reflow를 일으키지 않고 repaint만 발생시키므로 CPU 자원을 적게 사용합니다.
마지막으로 will-change
속성 사용입니다.
CSS의 will-change
속성을 사용하여 브라우저에 특정 요소가 변경될 것이라고 미리 언질을 줄 수 있습니다. 예를 들어, will-change: transform
으로 미리 GPU에서 요소를 준비하게 하여 reflow 및 repaint에 미치는 영향을 줄일 수 있습니다. 하지만 will-change
속성은 너무 자주 사용하면 메모리 낭비가 발생하므로 필요한 요소에만 적용해야 합니다.