본문 바로가기
카테고리 없음

HTML부터 Composite까지: 브라우저 렌더링 파이프라인 완전정리

by ctrl-f 2025. 5. 2.

브라우저는 우리가 작성한 HTML, CSS, JavaScript를 받아 사용자 화면에 시각적으로 보여주는 복잡한 과정을 수행합니다. 이 과정은 단순히 코드를 해석하는 것을 넘어 수많은 내부 단계를 거치며, 이를 '렌더링 파이프라인(Rendering Pipeline)'이라고 부릅니다. 특히 프론트엔드 개발자라면 이 과정을 이해해야만 성능 최적화, 레이아웃 조정, 스타일 변경 시 발생할 수 있는 문제를 정확히 파악하고 해결할 수 있습니다. 본 글에서는 HTML 문서가 어떻게 화면에 픽셀 단위로 그려지는지, 그 내부 과정을 DOM, CSSOM, Render Tree, Layout, Paint, Composite 순으로 완전 정리합니다.

DOM과 CSSOM: 렌더링 파이프라인의 시작

렌더링 파이프라인은 HTML 문서가 브라우저에 의해 로드되면서 시작됩니다. 가장 먼저, 브라우저는 HTML 문서를 파싱하여 'DOM(Document Object Model)'을 생성합니다. DOM은 문서의 구조를 계층적으로 표현한 트리 구조로, 자바스크립트를 통해 접근하고 조작할 수 있는 객체 모델입니다.

동시에, HTML 문서에 연결된 CSS 파일 또는 <style> 태그에 작성된 스타일도 브라우저가 파싱합니다. 이 과정을 통해 생성되는 것이 'CSSOM(CSS Object Model)'입니다. CSSOM은 각 요소에 어떤 스타일이 적용되어야 하는지를 트리 형태로 나타낸 구조입니다.

브라우저는 DOM과 CSSOM이 모두 준비된 이후에 이 둘을 결합하여 'Render Tree'를 생성합니다. Render Tree는 실제로 화면에 렌더링되어야 하는 요소와 그 스타일 정보를 포함하는 구조입니다. 중요한 점은, DOM에 존재하더라도 display: none이 적용된 요소는 Render Tree에 포함되지 않습니다.

요약하자면, 렌더링 파이프라인의 첫 단계는 다음과 같이 정리할 수 있습니다:

  • HTML 파싱 → DOM 생성
  • CSS 파싱 → CSSOM 생성
  • DOM + CSSOM → Render Tree 생성

이 과정을 이해하면, 렌더링 차단 리소스(render-blocking resources)의 개념과 그 중요성도 자연스럽게 파악할 수 있습니다. 예를 들어, 외부 CSS 파일은 CSSOM이 생성되기 전까지 렌더링을 멈추기 때문에 반드시 최적화해야 하는 요소 중 하나입니다.

 

브라우저 렌더링 파이프라인

Render Tree, Layout, Paint의 흐름

Render Tree가 구성되면 다음 단계는 Layout(또는 Reflow)입니다. Layout 단계에서는 각 요소의 정확한 위치와 크기를 계산합니다. 이 과정은 브라우저 뷰포트의 크기, 폰트, 패딩, 마진, 디스플레이 속성 등에 따라 결정됩니다.

Layout이 완료되면 Paint 단계로 넘어갑니다. Paint는 각 요소의 색상, 배경, 텍스트, 그림자 등 시각적인 정보를 픽셀 단위로 분해하여 그리는 과정입니다. 이 단계는 Paint Record라는 객체들을 생성하고, 브라우저가 이를 기반으로 GPU 또는 CPU를 이용해 실제 렌더링할 준비를 합니다.

Layout과 Paint는 모두 비용이 높은 작업입니다. 특히 Layout은 DOM 구조에 변화가 생기면 전체 또는 부분적으로 다시 계산되어야 하기 때문에 'Reflow'라고도 불립니다. 예를 들어 다음과 같은 코드가 반복 실행될 경우 성능 저하가 발생할 수 있습니다:

element.style.width = "500px";
console.log(element.offsetWidth); // 강제 Reflow 유발

브라우저는 Layout과 Paint를 최적화하기 위해 내부적으로 여러 연산을 batching(묶음 처리)합니다. 하지만 DOM 속성에 즉시 접근하는 코드가 있으면 강제 Reflow가 발생하고, 이는 곧 성능 저하로 이어집니다.

Paint 단계에서는 요소가 어떻게 보여질지 결정됩니다. 투명도, 그림자, 배경 이미지 등이 포함됩니다. 이 작업은 GPU 가속을 사용할 수 있지만, Paint가 과도하게 발생하면 CPU 부담으로 성능 저하가 발생할 수 있습니다.

정리하자면:

  • Render Tree 생성 이후 → Layout 단계: 위치와 크기 계산
  • Layout 이후 → Paint 단계: 색상 등 시각 정보 처리

이 과정을 이해하면, 어떤 스타일 변경이 성능에 영향을 주는지를 예측할 수 있으며, Reflow와 Repaint 차이도 더 명확히 파악할 수 있습니다.

Composite 단계와 GPU 렌더링 최적화 전략

Paint 단계 이후에는 브라우저가 실제로 사용자 화면에 요소를 표시하는 Composite 단계가 수행됩니다. Composite는 여러 레이어로 나뉘어진 요소들을 GPU를 이용해 하나의 최종 화면으로 조합하는 과정입니다.

이 단계에서 브라우저는 Paint 단계에서 생성된 비트맵 정보를 조합하여 화면에 최종적으로 그립니다. 여러 레이어를 겹치게 보여주거나, CSS Transform, Opacity 등을 사용한 요소는 별도의 레이어로 분리되어 Composite 단계에서 조합됩니다.

이 과정을 최적화하기 위한 방법 중 하나는 GPU 친화적인 CSS 속성을 사용하는 것입니다. 대표적으로 transform과 opacity는 GPU 가속이 가능한 속성이며, 이들은 Layout이나 Paint를 발생시키지 않고도 화면에서 요소의 시각적 표현을 변경할 수 있습니다.

예:

.box {
  transform: translateX(100px);
  opacity: 0.8;
}

이러한 속성은 Composite 단계에서만 처리되므로, Reflow나 Repaint보다 훨씬 성능에 유리합니다.

또한 will-change 속성은 브라우저에게 미리 해당 요소의 속성이 변경될 것임을 알리는 힌트를 주어 레이어 분리를 유도합니다. 하지만 과도한 사용은 오히려 메모리 증가로 이어질 수 있으므로 신중하게 사용해야 합니다.

Composite 단계에서의 렌더링 최적화는 특히 애니메이션, 스크롤, 드래그 이벤트 등에서 매우 중요합니다. 이러한 인터랙션에서의 프레임 드롭을 줄이기 위해서는 Composite만으로 처리가 가능한 스타일 변경을 우선 고려해야 하며, 레이아웃 변경은 최소화해야 합니다.

이러한 최적화 전략은 단순히 이론에 그치지 않고, Lighthouse, Chrome DevTools Performance 탭을 통해 직접 추적하고 개선할 수 있습니다. 면접에서도 “GPU 친화적 스타일 속성이란?”, “Composite만 유발하는 CSS 속성은?” 같은 질문이 자주 등장하므로 반드시 숙지해두는 것이 좋습니다.

브라우저 렌더링 파이프라인은 DOM, CSSOM에서 시작해 Render Tree, Layout, Paint를 거쳐 Composite까지 이어지는 일련의 복합적인 흐름입니다. 이 구조를 명확히 이해하면 단순히 화면을 ‘보이게’ 하는 수준을 넘어, 언제 Reflow와 Repaint가 발생하는지, 어떤 스타일 변경이 GPU 렌더링으로 처리되는지를 예측할 수 있습니다. 실무에서 성능 최적화는 물론, 프론트엔드 면접에서 가장 자주 등장하는 고급 질문이기도 합니다. 이 글을 바탕으로 자신의 코드가 브라우저 렌더링 파이프라인 상에서 어떤 위치에서 어떤 부담을 주는지를 파악하고, 최적화 전략을 세울 수 있는 개발자로 성장하시기 바랍니다.