브라우저는 HTML을 어떻게 화면에 그릴까?
단순한 HTML 파일이 어떻게 웹페이지가 되는지, 우리가 매일 보는 화면이 만들어지는 모든 과정을 이야기로 풀어보자.
브라우저가 열리자마자 사용자가 주소창에 URL을 입력한다.
예를 들어 https://www.example.com
이라고 치면, 브라우저는 다음과 같은 일을 한다.
A record
)GET / HTTP/1.1
요청과 함께 브라우저의 User-Agent 등을 포함한 헤더도 같이 전송한다.서버는 브라우저의 요청을 받고 HTML 파일을 응답한다.
HTTP/1.1 200 OK
Content-Type: text/html
<!DOCTYPE html>
<html>
<head>
<title>Example</title>
</head>
<body>
<h1>Hello World</h1>
<img src="banner.png" />
</body>
</html>
이제부터 브라우저는 이 텍스트 데이터를 가지고 본격적인 그리기 작업(rendering) 에 들어간다.
브라우저는 HTML 텍스트를 한 줄씩 읽으며 토큰(token) 을 만든다.
그리고 이를 DOM(Document Object Model) 이라는 트리 구조로 바꾼다.
<html>
→ DOM 노드 생성<head>
, <body>
등 자식 노드 생성<h1>Hello</h1>
→ 텍스트 노드까지 포함한 구조로이때 DOM은 메모리에 존재하는 자바스크립트 객체 트리다.
HTML에는 <style>
이나 <link rel="stylesheet">
같은 스타일 정의도 포함된다.
h1 {
color: blue;
font-size: 24px;
}
CSSOM도 DOM처럼 트리 구조이며, 어떤 노드에 어떤 스타일이 적용되는지 정의한다.
이제 DOM과 CSSOM을 조합하여 Render Tree를 만든다.
예시:
<head>
는 화면에 표시되지 않으므로 Render Tree에서 제외<h1>Hello</h1>
는 Render Tree에 포함되고, 색상, 폰트 등의 스타일도 함께 적용된다.Render Tree를 만들었다면 이제 각 요소가 어디에 위치할지를 계산한다.
이 단계는 “레이아웃(Layout)” 또는 “Reflow”라고도 부른다.
width
, height
, padding
, margin
, position
등 CSS 정보를 바탕으로 위치를 결정이 단계는 비용이 크기 때문에 최소화하는 것이 성능에 중요하다.
이제 계산된 각 요소를 실제 픽셀 단위로 그리는 작업이 시작된다.
브라우저는 이 정보를 레이어 단위로 나누어 GPU에 전달한다.
마지막 단계는 여러 레이어를 GPU에서 합성(compositing) 하는 것이다.
자바스크립트는 DOM을 동적으로 바꾸거나 스타일을 바꿀 수 있다.
element.style.color = "red"
document.body.appendChild(newDiv)
따라서 DOM을 자주 바꾸는 코드는 성능 이슈를 유발할 수 있다.
[HTML 응답]
↓
[Parsing → DOM 생성]
↓
[CSSOM 생성]
↓
[Render Tree 생성]
↓
[Layout]
↓
[Paint]
↓
[Composite → 화면 출력]
이 과정을 렌더링 파이프라인(Rendering Pipeline) 이라고 부르며, 브라우저마다 최적화 방식은 조금씩 다르지만 기본 원리는 같다.
HTML은 그저 텍스트일 뿐이지만, 브라우저는 이를 구조화하고, 스타일링하고, 위치와 모양을 계산한 뒤, 결국 우리가 보는 아름다운 웹페이지로 완성한다.
이 과정을 이해하는 건 단순한 이론 공부가 아니다.
성능 최적화, 애니메이션 처리, DOM 조작 등 실제 프론트엔드 개발에 큰 도움이 된다.
🛠️ 다음 편 예고:
“브라우저 렌더링 성능 최적화 — Layout Thrashing과 그 해결법”