브라우저는 어떻게 웹페이지를 그릴까?

도메인 탐색부터 페인트까지

Table Of Contents

브라우저가 렌더링되는 과정

우리가 웹사이트를 방문할 때, 브라우저는 생각보다 복잡한 과정을 거쳐 화면을 렌더링한다!

브라우저의 렌더링 과정을 잘 아는 것은 사용자 경험과 성능 최적화 측면에서 중요하다.

오늘은 유저가 도메인을 입력할 때부터 시작해서 브라우저가 웹페이지를 어떻게 렌더링하는지 과정을 살펴보자.

1. Navigation (탐색)

사용자가 주소창에 URL을 입력하거나, 링크 클릭, 폼 제출 등의 동작을 통해 요청을 보낼 때마다 탐색이 발생한다.

1.1. DNS Lookup (DNS 조회)

탐색의 첫 단계는 해당 페이지의 자원(assets)들이 어디에 있는지 찾는 것이다.

https://example.com이라는 URL 주소를 탐색한다고 하면, 브라우저는 DNS 서버에 https://example.com의 IP 주소를 요청하고, 그 결과로 192.0.2.172같은 IP 주소를 받아온다.

DNS Lookup 과정을 알아보기에 좋은 그림이 있어 첨부해둔다!

1. DNS Lookup

(출처: https://www.datadoghq.com/knowledge-center/dns-resolution/)

1.2. TCP handshake

IP 주소를 알게 되면, 브라우저는 서버와 TCP 3-way-handshake를 통해 연결을 수립한다.

  1. 브라우저는 TCP SYNchronize 패킷을 서버로 보낸다.
  2. 서버는 SYN을 수신하고, SYN-ACK (SYNchronize-Acknowledge)를 보낸다.
  3. 브라우저는 서버로 ACKnowledge을 보내고, 서버가 이를 수신하면 TCP 소켓 연결이 설정된다.

2. Response (응답)

서버와 연결이 성립되면 브라우저는 초기 HTTP GET 요청을 보내고 응답 헤더와 함께 대개는 HTML의 내용을 받아온다.

3. Parsing (구문 분석)

브라우저가 첫 번째 데이터 청크를 받으면, 파싱을 시작한다.

여기서부터 Critical Rendering Path(중요 렌더링 경로)의 5단계, 즉 브라우저가 HTML, CSS, JavaScript를 화면의 픽셀로 변환하는 단계를 거친다.

3.1. DOM 트리 구축

CRP의 첫 단계는 HTML을 DOM 트리로 만드는 것이다.

 

deferasync script

HTML 파싱 중 <script> 태그를 만나면 스크립트를 실행하기 위해서 DOM 생성이 멈춘다.

 

defer 속성이 있는 스크립트는 백그라운드에서 다운로드된다.

defer 속성은 외부 스크립트(scr가 있어야 함)에만 유효하다.

async

async 속성이 붙은 스크립트는 페이지와 완전히 독립적으로 동작한다.

 

3.2. CSSOM 트리 구축

CRP의 두 번째 단계는 CSS를 처리해 CSSOM 트리로 만드는 것이다.

DOM이 페이지의 모든 내용을 포함한다면, CSSOM은 DOM을 스타일링하기 위한 페이지의 모든 스타일 정보를 포함한다.

4. Render

렌더링 과정에는 스타일, 레이아웃, 페인트가 포함되고, 때로는 합성까지 포함할 때가 있다.

4.1. Style

CRP의 세 번째 단계는 DOM과 CSSOM을 합쳐 Render Tree를 만드는 것이다.

4.2. Layout

CRP의 네 번째 단계는 렌더 트리를 기반으로 각 노드의 크기와 위치를 계산하는 과정이다.

4.3. Paint

CRP의 다섯 번째 단계는 각 노드를 화면에 그리는 것이다.

4.4. Compositing (합성)

문서의 각 부분이 다른 레이어에서 그려질 때, 각 부분들이 올바른 순서로 화면에 그려지기 위해서는 합성 단계가 필요하다.

자체 레이어에서 렌더링되는 속성은 합성 과정에서만 업데이트되어 리페인트가 트리거되지 않는다.

 

위 과정을 간략화시키면 아래 그림과 같다.

2. Browser Rendering

(출처: https://dev.to/gopal1996/understanding-reflow-and-repaint-in-the-browser-1jbg)

CSS 속성의 비용

참고

여담

reflow repaint는 브라우저의 렌더링 성능과 연관되어 있기 때문에 FE 개발자에게는 중요한 개념이라고 생각한다.

나는 면접에서 2번이나 마주쳤음에도 불구하고 숙지하지 않았었고 결국...

포항항ꉂꉂ(ᵔᗜᵔ*)

하지만 3번째는 실수하지 않아