1. 소개
- 지난 포스팅에서는 페이지 로딩 과정에 대해 알아보았다. 거기서 렌더링을 간단하게 짚어보았는데, 이번 포스팅에서는 그 부분에 대한 과정을 좀 더 자세히 알아보고자 한다.
- 브라우저가 렌더링 하는 과정을 간단하게 미리 언급하자면, 먼저 html과 css를 처리하여 DOM트리와 CSSOM 트리를 빌드한다. 그리고 그 둘을 결합하여 렌더트리(렌더링트리)를 만들고, 각 레이아웃을 실행하여 형태를 계산한다. 마지막으로 그들을 그린다. 이제 이 과정을 세세하게 알아보자.
2. 과정
* DOM
- 다운받은 html을 파싱하며 DOM트리를 만든다.
- html을 파싱하는 것은 다음 일련의 과정을 거친다.
∙ Conversion : 바이트를 읽고 인코딩하여 문자열로 바꾸는 과정을 의미한다.
∙ Tokenizing : tokenizer가 문자열을 고유한 토큰으로 변환한다. 각 토큰은 <html>, <body>, </body> 등을 의미한다.
∙ Lexing : lexer가 토큰에 의미를 부여하는 단계이다.
∙ DOM construction : parcer가 위에서 생성된 객체를 트리구조로 만들어낸다.
* CSSOM
- 위에서 파싱 도중 link태그를 만나면 서버에 CSS파일 요청을 보내고, 받은 css파일을 파싱하여 CSSOM 트리를 만든다.
- CSS파싱이 완료되면 HTML파싱이 중단된 부분부터 다시 파싱하여 DOM을 마저 생성한다.
* Render Tree
- DOM과 CSSOM 트리가 생성되고나서 Render Tree(렌더트리 또는 렌더링트리)단계로 넘어온다.
- DOM과 CSSOM은 각각 독립된 트리 모델이다. 하나는 contents를 설명하고, 다른 하나는 스타일 규칙을 설명한다. 렌더트리는 이 둘을 병합하여 페이지에 렌더링할 노드를 기록한다.
- 이 때, 일부 노드들(script 태그, meta, 태그 등은 렌더링된 출력에 반영되지 않으므로 생략된다. 그리고 css에서도 display: none과 같이 화면에 공간도 차지하지 않고 보이지도 않는 노드도 생략된다. visibility : invisible은 공간은 차지하므로 포함된다.
* Layout
- 렌더 트리가 생성되면 레이아웃 단계로 넘어온다. 렌더 트리의 루트부터 시작하여 각 객체의 크기와 위치를 파악하는 단계이다.
- 레이아웃 단계를 통해 %, vw와 같은 상대적인 사이즈들이 픽셀단위로 변환된다.
* Paint
- 레이아웃이 위치와 크기와 관련된 단계였다면 페인트 단계는 실제로 그리는 단계이다. 레이아웃이 완료되면 브라우저는 Paint Setup 및 Paint 이벤트를 발생시킨다.
- 이미 이전 단계에서 사이즈들이 계산되어 있으므로 페인트는 텍스트, 색, 그림자, 이미지 등을 넣는다. 참고로 그림자나 그라데이션과 같이 스타일이 복잡한 것들은 페인트 시간을 길게 만든다.
3. 리플로우와 리페인트
- 위에서 렌더링 과정을 살펴 보았는데, 더 짚고 넘어가야하는 것이 있다. 알다시피 어떤 이벤트에 따라 화면이 다시그려지는 것을 우리는 수없이 봐왔다. 이러한 것들에서 레이아웃과 페인트 과정이 반복되어 일어난다.
- 레이아웃과 페인트 과정이 발생하는 것은 웹 성능 최적화와도 관련이 있으므로 반드시 알아둬야 한다.
* Reflow(Layout)
- 리플로우는 레이아웃의 과정을 의미한다. 만일 우리가 JS로 DOM의 변경을 만들어내면 렌더트리도 다시만들어지는데, 이 때 어쩔 수 없이 리플로우 과정이 일어난다.
- 위 상황외에 요소의 크기나 위치가 변경되면 리플로우가 발생하고 다시 페인트가 발생한다.
- 폰트나 텍스트 내용이 변경되더라도 리플로우부터 다시 발생한다.
* Repaint
- 리플로우가 발생했다고 끝이 아니다. 리플로우가 발생했으면 당연히 페인트 과정도 연달아 일어난다.
- 리페인트만 일어나는 과정도 있다. 만일 레이아웃과는 무관한 색상과 같은 부분이 변경된다면 렌더트리를 재활용할 수 있으며 리페인트만 일어난다. 이 때에는 리플로우보다 가볍게 동작한다.
참고
'Computer Science > Network' 카테고리의 다른 글
<네트워크> http 버전 별 특징 (3.0) (0) | 2022.01.08 |
---|---|
<네트워크> http 버전 별 특징 (0.9 / 1.0 / 1.1 / 2.0) (2) | 2021.12.30 |
<네트워크> 페이지 로딩 과정 (0) | 2021.08.28 |
<네트워크> 무선 랜 (0) | 2021.04.29 |
<네트워크> OSI모델의 흐름 (0) | 2021.04.27 |