질문
웹 브라우저의 렌더링 과정을 설명하고, 렌더링 성능을 저하시킬 수 있는 요소들은 어떤 것이 있나요? 그리고 레이아웃 시프트(Layout Shift)와 페인트(Paint) 과정에서 발생하는 문제를 해결하기 위해 사용할 수 있는 최적화 기법들을 설명해주세요.
1. 브라우저 렌더링
: 브라우저는 DOM 생성, CSSOM 생성, 렌더트리 생성, 레이아웃, 페인트, 컴포지트 단계로 렌더링됩니다.
- DOM 생성은 HTML을 파싱하여 DOM 트리(DOM Tree)를 구성합니다
- CSSOM 생성은 CSS 파일을 파싱하여 CSSOM 트리(CSS Object Model Tree)를 생성합니다
- 렌더트리는 DOM과 CSSOM을 합쳐서 생성하며 display: none이 적용된 노드는 포함이 되지 않습니다. 반면, visibility: hidden이 적용된 노드는 포함됩니다.
- 레이아웃은 각 노드들에 대한 뷰포트 내의 위치와 크기를 계산합니다.
- 페인트는 각 픽셀을 채우는 과정으로, 텍스트, 색, 이미지, 보더, 그림자 등 모든 시각적 요소를 그립니다
- 컴포지트는 레이어를 순서대로 합성하여 최종적으로 화면에 표시합니다
2. 렌더링 성능 저하 요소
: 리플로우와 리페인트를 일으키는 것들
- 리플로우를 일으키는 요소 : DOM 삭제/추가, 요소의 위치/크기가 변경, 스크롤
- 리페인트를 일으키는 요소 : 스타일(배경색,폰트색상,테두리색상,박스쉐도우) 변경
3. 레이아웃 시프트
- 의미 : 웹페이지가 로딩되는 동안 또는 로딩되는 후에 페이지의 시각적인 요소들이 갑자기 움직이는 현상 (예: 이미지나 광고가 늦게 로드되면서 다른 콘텐츠들을 밀어내는 경우, 웹폰트가 로드되면서 텍스트 크기가 변하는 경우)
- 케이스
- 사이즈가 정해져 있지 않은 이미지, 동영상, 광고
- 동적인 컨텐츠
- 웹폰트