브라우저에서 말하는 렌더링이란 뭘까? 웹 페이지는 HTML, CSS, JS의 조합으로 구성이 된다. 이들은 결국 어떠한 시각적인 파일이 아닌 해석이 필요한 코드들이기 때문에, 이를 해석하여 사용자의 화면에 '시각화'해주는 엔진이 필요하다. 이 역할을 하는 것이 결국 브라우저의 렌더링 엔진이며, 예시로 크롬과 엣지의 Blink, 사파리의 WebKit, 파이어폭스의 Gecko 엔진이 있다. '해석'의 결과는 다음과 같다.

  • HTML → DOM: 문서 구조를 객체 트리로 변환
  • CSS → CSSOM: 스타일 규칙을 객체 트리로 변환
  • DOM + CSSOM → Render Tree: 화면에 표시될 요소 결정
  • Layout & Paint: 각 요소의 크기, 위치, 색상 등을 계산해 픽셀로 출력

화면 구성 과정: HTML → DOM → CSS → CSSOM → Render Tree → Layout → Paint → Compositing → 화면 출력

 

HTML -> DOM

<body>
  <h1>Hello</h1>
  <p>World</p>
</body>
Document
 └─ html
     └─ body
         ├─ h1 ("Hello")
         └─ p ("World")

 

CSS -> CSSOM

h1 { color: red; }
p { font-size: 14px; }
h1 → { color: red }
p  → { font-size: 14px }

 

Render Tree

DOM, CSSOM을 합친, 화면에 표시될 요소만 포함한 트리

  • display: none과 같은 속성의 요소는 표함되지 않음.
  • visibility: hidden / opacity: 0트리에 포함되고 레이아웃도 계산되지만, 최종 표시가 없거나(투명) 페인트 결과가 보이지 않을 수 있음
  • 노드별 스타일 정보 포함
Render Tree
 └─ body
     ├─ h1 (color: red)
     └─ p (font-size: 14px)

 

Layout

Render Tree를 기반으로 각 요소의 위치, 크기 계산

브라우저의 뷰포트 크기, 폰트 크기, margin/padding 등 모든 스타일 반영

 

Paint

Layout에서 계산된 위치와 크기에 Render Tree의 스타일 속성을 반영

각 노드의 스타일을 그리기 명령 형태로 만듦

아직 픽셀 데이터가 만들어지지 않음

 

Rasterization

기록된 그리기 명령을 실제 픽셀 단위 비트맵으로 변환

레이어를 작은 타일 단위로 나눠 픽셀 채움

 

Compositing

복잡한 페이지는 여러 레이어로 나누어 관리 (z-index, transform 등 활용)

여러 합성 레이어를 GPU에서 결합하여 최종 프레임 출력

 


 

+ Recent posts