Files
2nd/10_Wiki/Topics/Critical_Rendering_Path.md
T

21 KiB

category, tags, title, last_updated
category tags title last_updated
Unified
auto-consolidated
technical-documentation
Critical Rendering Path|Critical Rendering Path
2026-05-02

Critical Rendering Path

📌 Brief Summary

Critical Rendering Path (CRP)는 브라우저가 HTML, CSS, JavaScript를 수신하여 화면의 픽셀로 변환하기 위해 거치는 일련의 단계적 과정을 의미합니다[1]. 이 과정은 DOM 트리 및 CSSOM 트리 구축, Render Tree 합성, Layout(Reflow), 그리고 Paint(Repaint) 및 Compositing 단계로 진행됩니다[1, 2]. CRP를 이해하고 최적화하는 것은 렌더링 차단 요소를 줄이고 불필요한 Reflow 및 Repaint를 최소화하여 빠른 초기 렌더링과 매끄러운 사용자 상호작용을 보장하는 프론트엔드 성능 엔지니어링의 핵심입니다[3, 4].


브라우저 렌더링 과정(Critical Rendering Path)은 브라우저가 수신한 HTML, CSS, JavaScript 코드를 화면의 실제 픽셀로 변환하기 위해 거치는 일련의 순차적인 단계를 의미합니다 [1, 2]. 이 과정은 DOM과 CSSOM의 생성, 렌더 트리(Render Tree) 구축, 기하학적 형태를 계산하는 레이아웃(Layout), 그리고 픽셀을 그리는 페인트(Paint) 및 합성(Composite) 단계로 이루어집니다 [3, 4]. 렌더링 경로를 최적화하여 렌더링 차단 요소를 최소화하는 것은 웹 페이지의 초기 렌더링 속도를 높이고 사용자 경험(UX)을 향상시키는 프론트엔드 성능 최적화의 핵심입니다 [1, 5, 6].


브라우저 렌더링 파이프라인(Critical Rendering Path, CRP)은 브라우저가 HTML, CSS, JavaScript 코드를 수신하여 화면의 픽셀로 변환하기 위해 거치는 일련의 핵심 단계입니다 [1, 2]. 이 파이프라인은 주로 DOM 및 CSSOM 생성, 렌더 트리 구축, 레이아웃, 페인트, 그리고 합성 단계로 이루어집니다 [3]. 이 경로를 최적화하는 것은 초기 렌더링 속도(Time to first render)를 높이고 60FPS의 부드러운 사용자 상호작용을 보장하기 위한 웹 성능 최적화의 핵심입니다 [4, 5].


중요 렌더링 경로(Critical Rendering Path, CRP)는 브라우저가 HTML, CSS, JavaScript 코드를 수신하여 화면의 픽셀로 변환하기까지 거치는 일련의 필수 단계를 의미합니다 [1, 2]. 이 경로는 문서 객체 모델(DOM), CSS 객체 모델(CSSOM) 생성부터 렌더 트리 구축, 레이아웃, 그리고 페인트 단계까지 포함합니다 [2]. 중요 렌더링 경로의 과정을 최적화하면 웹 페이지의 첫 렌더링 시간(Time to First Render)을 단축하고 사용자 상호작용의 지연을 막을 수 있습니다 [1, 3].


크리티컬 렌더링 패스(Critical Rendering Path, CRP)는 브라우저가 HTML, CSS, JavaScript 코드를 수신하여 화면의 픽셀로 변환하기 위해 거치는 일련의 단계를 의미합니다 [1, 2]. 브라우저는 DOM과 CSSOM을 생성하고, 이를 결합하여 렌더 트리를 구축한 뒤, 요소의 크기와 위치를 계산하는 레이아웃(Layout) 단계와 화면에 그리는 페인트(Paint) 단계를 수행합니다 [2, 3]. 이 경로를 최적화하는 것은 초기 렌더링 시간(Time to First Render)을 단축하고 사용자 상호작용의 유창함을 보장하기 위한 프론트엔드 성능 엔지니어링의 핵심 목표입니다 [1, 4].

📖 Core Content

  • DOM (Document Object Model) 구축: 브라우저는 서버로부터 HTML 데이터를 점진적으로 파싱하여 DOM 트리를 구축합니다[2, 5]. 수신된 바이트는 토큰 및 노드로 변환되어 계층 구조를 형성하며, 노드의 수가 많을수록 이후 렌더링 경로의 연산 시간이 길어집니다[2, 5, 6].
  • CSSOM (CSS Object Model) 구축: DOM과 달리 CSSOM 구축은 점진적으로 이루어지지 않으며, 파싱이 완료될 때까지 렌더링을 차단(Render-Blocking)합니다[6-8]. 이는 스타일이 뒤늦게 덮어씌워지면서 스타일이 적용되지 않은 콘텐츠가 화면에 번쩍이는 현상(FOUC)을 방지하기 위함입니다[6, 7].
  • Render Tree 합성: DOM과 CSSOM이 완성되면, 브라우저는 이 둘을 결합해 화면에 실제로 그려지는 가시적 노드(Visible nodes)만 포함하는 Render Tree를 만듭니다[9-11]. <script>, <meta> 요소나 display: none 스타일이 적용된 노드는 렌더 트리에서 완전히 제외되지만, 레이아웃 공간을 차지하는 visibility: hidden 요소는 포함됩니다[9-12].
  • Layout (Reflow): Render Tree를 기반으로 뷰포트 크기와 박스 모델에 맞춰 각 요소의 정확한 기하학적 위치와 크기를 계산하는 단계입니다[13-15]. 창 크기가 변하거나, DOM 요소의 추가/제거, 혹은 너비나 여백 등 레이아웃에 영향을 주는 속성이 변경될 경우 Reflow가 발생하며 이는 매우 큰 연산 비용을 수반합니다[16-19].
  • Paint (Repaint) 및 Compositing: Layout 계산이 끝나면 각 요소를 픽셀로 화면에 그리는 Paint(또는 Rasterizing) 과정이 진행됩니다[20-23]. 레이아웃 변화 없이 배경색 등 시각적 속성만 변할 때는 Repaint만 촉발됩니다[18, 20, 24]. 이후 서로 다른 레이어들을 하나의 화면으로 합치는 Compositing 단계를 거치며, 특정 효과(예: transform)는 GPU로 오프로드하여 성능을 최적화할 수 있습니다[20, 25].
  • React 도입과의 연관성: 전통적으로 브라우저의 DOM을 직접 조작하는 것은 필연적으로 비용이 큰 Reflow와 Repaint 과정을 연쇄적으로 유발하여 속도 저하를 일으킵니다[26]. React는 이 한계를 극복하기 위해 메모리에 경량화된 Virtual DOM을 구축하고, 상태 변경 시 휴리스틱 Diffing 알고리즘(Reconciliation)을 통해 변경된 최소한의 노드만 실제 DOM에 반영하여 렌더링 경로의 비효율을 크게 줄입니다[3, 26, 27].

  • DOM (Document Object Model) 구축: 브라우저가 HTML 데이터를 받으면 바이트를 문자, 토큰, 노드로 변환한 뒤 이를 기반으로 DOM 트리를 구축합니다 [1, 7]. 이 과정은 점진적(incremental)으로 이루어지기 때문에 브라우저는 네트워크 요청이 진행 중인 상태에서도 트리 구성을 시작할 수 있습니다 [1, 8]. 생성된 노드의 수가 많을수록 이후의 레이아웃과 페인트 단계에서 더 많은 시간이 소요됩니다 [1, 9].
  • CSSOM (CSS Object Model) 구축: DOM과 달리 CSSOM 구성은 점진적이지 않으며 렌더링을 차단(Render-Blocking)합니다 [8, 9]. 브라우저는 사용자가 스타일이 적용되지 않은 날것의 콘텐츠(FOUC)를 보는 것을 방지하기 위해, 연결된 모든 스타일시트를 다운로드하고 파싱할 때까지 렌더링을 중단합니다 [8, 9].
  • 렌더 트리(Render Tree) 합성: DOM과 CSSOM이 모두 준비되면 브라우저는 두 트리를 결합하여 화면에 렌더링되는 노드만 포함하는 렌더 트리를 생성합니다 [10, 11]. 이 과정에서 시각적 레이아웃에 영향을 주지 않는 <script>, <meta> 태그나 display: none 속성이 적용된 요소는 렌더 트리에서 완전히 제외됩니다 [10, 11]. 단, visibility: hidden이 적용된 요소는 눈에 보이지는 않지만 레이아웃 상에서 공간을 차지하므로 렌더 트리에 포함됩니다 [12, 13].
  • Layout(레이아웃) / Reflow(리플로우): 렌더 트리가 완성되면 브라우저는 뷰포트(Viewport)의 크기와 박스 모델을 기반으로 렌더 트리 내 각 요소의 정확한 크기와 화면상 위치를 계산합니다 [14-16]. 창 크기 조절, DOM 요소의 추가 및 제거, 크기 속성 변경 등의 작업은 전체 혹은 부분적인 레이아웃의 재계산(Reflow)을 유발하며 이는 컴퓨팅 비용이 매우 높은 작업입니다 [17, 18].
  • Paint(페인트) 및 Compositing(합성): 레이아웃 단계가 끝나면 브라우저는 계산된 기하학적 형태와 스타일을 바탕으로 화면에 실제 픽셀을 그리는 Paint 작업을 수행합니다 [19-21]. 요소의 색상이나 배경 등 시각적 스타일만 변경될 경우 레이아웃 계산을 생략하고 Repaint(리페인트)만 발생합니다 [18]. 페인트 이후 브라우저는 성능을 높이기 위해 요소들을 여러 레이어로 분리하여 그린 뒤, GPU 등을 활용해 이를 단일 이미지로 합치는 Compositing(합성) 과정을 거칩니다 [19, 22, 23].
  • 크리티컬 렌더링 패스 최적화: 브라우저는 <head> 태그 내부에 있는 렌더링 차단 CSS 및 파서 차단(Parser-blocking) 동기식 JavaScript가 모두 처리될 때까지 화면을 렌더링하지 않습니다 [24-26]. 반면 이미지, 폰트, 그리고 지연 로드(async/defer) 설정이 된 스크립트 등은 초기 렌더링을 차단하지 않습니다 [27]. 따라서 불필요한 리소스의 다운로드를 지연시키거나 파일 크기를 최적화하는 것이 렌더링 경로 최적화의 기본 원칙입니다 [28, 29].

브라우저 렌더링 파이프라인은 다음과 같은 세부적인 과정을 거쳐 실행됩니다.

  • DOM (Document Object Model) 구축 브라우저가 서버로부터 HTML 데이터를 받으면, 이를 바이트 단위에서 문자, 토큰, 노드로 변환하여 점진적(incremental)으로 DOM 트리를 구성합니다 [1, 6]. 파싱 중 비차단(non-Blocking) 리소스를 만나면 요청을 보내고 파싱을 계속하며, 프리로드 스캐너(Preload Scanner)가 백그라운드에서 CSS, 웹 폰트 등 우선순위가 높은 리소스를 미리 요청하여 병목을 줄입니다 [7].
  • CSSOM(CSS Object Model) 구축 HTML과 별개로 브라우저는 CSS를 파싱하여 스타일 규칙과 계층 구조를 나타내는 CSSOM 트리를 생성합니다 [8, 9]. DOM 생성과 달리 CSSOM은 **렌더링을 차단(Render-blocking)**하는 속성을 지닙니다. 즉, 브라우저는 모든 CSS를 다운로드하고 파싱을 완료할 때까지 페이지 렌더링을 중단하여, 스타일이 입혀지지 않은 콘텐츠가 화면에 번쩍이는 현상(FOUC)을 방지합니다 [8, 10].
  • 렌더 트리(Render Tree) 생성 DOM과 CSSOM이 준비되면, 두 트리를 결합하여 화면에 실제로 표시되는 노드들만 포함된 렌더 트리를 구축합니다 [11, 12]. <script>, <meta> 같은 태그나 CSS의 display: none이 적용된 요소는 렌더 트리에서 완전히 제외되지만, 화면에 공간을 차지하는 visibility: hidden이 적용된 요소는 포함됩니다 [11-13].
  • 레이아웃(Layout) 또는 리플로우(Reflow) 렌더 트리가 완성되면, 브라우저는 뷰포트의 크기를 기준으로 각 요소가 화면의 어느 위치에, 어느 정도의 크기(기하학적 형태)로 배치될지 정확히 계산합니다 [14-16]. 창 크기가 조절되거나 JavaScript로 DOM 요소의 크기 및 위치를 조작할 때마다 이 계산이 다시 발생하며(리플로우), 이는 브라우저에 큰 계산 부담을 줍니다 [17-19].
  • 페인트(Paint)와 합성(Compositing) 레이아웃 계산이 끝나면 요소에 색상, 텍스트, 그림자, 테두리 등 시각적 속성을 적용하여 화면의 실제 픽셀로 변환하는 페인트(또는 리페인트) 단계가 진행됩니다 [17, 20]. 마지막으로, 성능 최적화를 위해 일부 요소(예: <video>, <canvas>, 특정 CSS 속성 적용 요소)가 별도의 레이어로 나뉘어 그려졌다면, 브라우저가 이들을 올바른 순서로 겹쳐서 최종 화면을 완성하는 합성(Compositing) 단계를 거칩니다 [21, 22]. GPU를 활용해 이 과정을 가속화할 수도 있습니다 [23, 24].

브라우저는 웹 페이지를 화면에 렌더링하기 위해 다음의 순차적인 단계들을 실행합니다:

  • DOM (Document Object Model) 트리 구축: 브라우저가 서버로부터 HTML 응답을 받으면 데이터를 바이트에서 문자, 토큰, 노드로 변환하며 점진적으로 DOM 트리를 구축합니다 [1, 4, 5]. DOM은 문서의 구조와 콘텐츠 전체를 담고 있습니다 [6, 7].
  • CSSOM(CSS Object Model) 트리 구축: DOM과 유사하게 CSS 규칙들을 파싱하여 CSSOM을 만듭니다 [6, 7]. 다만 CSSOM은 후속 규칙이 이전 스타일을 덮어쓸 수 있기 때문에 점진적으로 구축될 수 없으며, 처리가 완료될 때까지 화면 렌더링을 차단(Render-Blocking)합니다 [7, 8].
  • 렌더 트리(Render Tree) 결합: 브라우저는 DOM과 CSSOM을 결합하여 실제로 화면에 렌더링될 요소들만을 포함하는 렌더 트리를 만듭니다 [9, 10]. 이 단계에서 <head> 태그나 display: none 속성이 적용된 비가시적 요소는 렌더 트리에서 제외됩니다 [10, 11].
  • 레이아웃(Layout) 또는 리플로우(Reflow): 렌더 트리가 준비되면 뷰포트(Viewport) 크기를 기준으로 각 요소의 정확한 위치와 기하학적 크기(너비, 높이 등)를 계산합니다 [12-14]. 화면 크기가 변하거나 DOM 노드가 추가/수정될 때마다 레이아웃이 다시 발생할 수 있습니다 [15, 16].
  • 페인트(Paint) 및 합성(Compositing): 레이아웃 계산을 마치면 브라우저는 요소의 텍스트, 색상, 그림자 등을 화면의 실제 픽셀로 그리는 페인트 단계를 거칩니다 [17-19]. 페이지 구성 요소가 여러 레이어로 나뉘어 있는 경우, 이를 GPU 등을 활용해 올바른 순서로 화면에 병합하는 합성(Compositing) 작업이 수행됩니다 [17, 20].

웹 성능을 최적화하기 위해서는 이 경로상에 있는 차단 리소스(예: 렌더링 차단 CSS나 파서 차단 동기식 JavaScript)의 수와 크기를 최소화하고, 로드 순서를 제어해야 합니다 [21-24].


주요 진행 단계 (Sequential Progression of Steps)

  • DOM 트리 생성 (DOM Construction): 브라우저가 HTML 바이트를 파싱하여 점진적(incremental)으로 DOM 트리를 구축합니다 [5, 6]. 노드의 수가 많을수록 이후 단계에서 소요되는 시간이 길어집니다 [1, 7].
  • CSSOM 트리 생성 (CSSOM Construction): CSS 규칙을 파싱하여 스타일 정보를 담은 CSSOM 트리를 생성합니다 [7, 8]. DOM과 달리 CSSOM 생성은 점진적이지 않으며, 브라우저는 모든 CSS를 처리할 때까지 페이지 렌더링을 차단(Render-Blocking)합니다 [7, 9].
  • 렌더 트리 합성 (Render Tree Synthesis): DOM과 CSSOM이 준비되면, 시각적으로 화면에 표시되어야 하는 노드와 그에 해당하는 계산된 스타일만 포함하는 렌더 트리를 구축합니다. <script> 요소나 display: none 스타일이 적용된 노드 등 화면에 보이지 않는 요소는 제외됩니다 [10-12].
  • 레이아웃 (Layout / Reflow): 렌더 트리를 기반으로 기기의 뷰포트 크기를 고려하여 각 요소의 정확한 기하학적 형태(크기와 화면상 위치)를 계산합니다 [13-16].
  • 페인트 및 합성 (Paint and Composite): 계산된 기하학적 형태와 스타일을 실제 픽셀로 변환(Paint)하여 화면에 그리고, 여러 레이어로 분리된 요소를 올바른 순서로 화면에 결합(Composite)합니다 [17-20].

성능 최적화 및 렌더링 차단 요소 (Performance Optimization and Blocking Resources)

  • 초기 렌더링을 위해서는 HTML 일부와 <head> 태그 내에 있는 렌더링 차단 CSS 및 JavaScript 처리가 선행되어야 합니다 [21-23].
  • 브라우저의 파서(Parser)는 동기식 JavaScript를 만나면 DOM을 변경할 수 있기 때문에 HTML 파싱을 중단하며, 이는 렌더링 차단으로 이어져 큰 성능 비용을 발생시킵니다 [23, 24].
  • CRP 최적화를 위해서는 이러한 렌더링 차단 리소스의 영향을 최소화하여 중요한 리소스의 로드 순서를 제어하고 다운로드해야 할 크기를 줄이는 것이 필수적입니다 [25, 26].
  • 이미지나 폰트는 일반적으로 초기 렌더링을 지연시키는 차단 리소스로 취급되지 않지만 [27], 요소의 치수를 미리 제공하지 않으면 이미지가 로드된 후 레이아웃이 다시 계산되는 리플로우(Reflow) 현상이 발생하여 성능이 저하될 수 있습니다 [19, 20, 27].

⚖️ Trade-offs & Caveats

No trade-offs available.

🔗 Knowledge Connections


Last updated: 2026-04-25


  • Related Topics: DOM, CSSOM, Render Tree, Reflow 및 Repaint
  • Projects/Contexts: 프론트엔드 렌더링 성능 최적화, Core Web Vitals 최적화 (FCP, LCP 등)
  • Contradictions/Notes: 제공된 소스들은 브라우저 렌더링 과정에 대해 모순 없이 일관된 설명을 제공합니다. 특히 display: none(렌더 트리에서 제외됨)과 visibility: hidden(레이아웃 공간을 차지하므로 렌더 트리에 포함됨)의 처리 방식 차이를 명확히 대조하여 설명하고 있습니다 [13].

Last updated: 2026-04-25


  • Related Topics: DOM (Document Object Model), CSSOM(CSS Object Model), 리플로우와 리페인트(Reflow and Repaint), 가상 DOM(Virtual DOM), 웹 성능 최적화(Web Performance Optimization
  • Projects/Contexts: 최초 렌더링 시간(Time to First Render) 단축, 단일 페이지 애플리케이션(SPA)의 CSR 및 SSR 전략
  • Contradictions/Notes: 동기식 JavaScript는 기본적으로 파서를 차단(Parser-blocking)하여 결과적으로 렌더링 파이프라인 전체를 지연시키므로, asyncdefer 속성을 활용해 렌더링 경로를 방해하지 않도록 처리하는 것이 공통적인 모범 사례로 권장됩니다 [7, 25, 26].

Last updated: 2026-04-25



Last updated: 2026-04-25


  • Related Topics: DOM (Document Object Model), CSSOM (CSS Object Model), 렌더 트리 (Render Tree), 리플로우 (Reflow), 리페인트 (Repaint)
  • Projects/Contexts: 프론트엔드 성능 최적화(Frontend Performance Optimization) 작업이나 Lighthouse, Chrome DevTools, WebPageTest와 같은 성능 감사 도구를 통해 렌더링 병목 현상을 파악하고 해결하는 맥락에서 빈번하게 다뤄집니다 [28-30].
  • Contradictions/Notes: 전통적으로 크리티컬 렌더링 패스는 '최초 렌더링(First Paint)'을 위해 필요한 최소한의 과정을 의미하지만, 최근의 웹 성능 측정은 첫 페인트를 넘어 실제 유의미한 콘텐츠가 사용자에게 보여지는 시점인 LCP(Largest Contentful Paint) 등을 포괄하는 '크리티컬 콘텐츠 렌더링 패스(Critical Contentful Rendering Path)'에 집중해야 한다는 관점도 대두되고 있습니다 [26, 31].

Last updated: 2026-04-25