[js] Browser
목차

Browsers 동작과정을 파보자 ~

01. 브라우저의 렌더링 동작과정

랜더링 과정

02. 왜 알아야 하는가 ?

Browsers 동작과정을 파보자 ~

2024년 1월 12일

01. 브라우저의 렌더링 동작과정

  • 랜더링이란 ?

HTML,CSS, 자바스크립트 등 개발자가 작성한 문서가 브라우저에서 출력되는 과정

mdImag

랜더링 과정

  1. 전반적인 흐름을 생각해보자
  • 사용자가 웹사이트 접속 => 서버로 부터 HTML, CSS 등 웹 사이트에 필요한 리소스를 다운 => (여기서부터 랜더링 과정시작)HTML 코드는 DOM, CSS는 CSSOM 트리를 생성(1,2,3)
  1. DOM tree 생성

mdImag

  • 변환 : 브라우저가 HTML의 원시 바이트를 읽어와서, HTML에 정의된 인코딩(예: UTF-8)에 따라 개별 문자로 변환합니다.
  • 토큰화 : 브라우저가 문자열을 W3C 표준에 지정된 고유 토큰으로 변환합니다.
  • 렉싱 : 방출된 토큰은 해당 속성 및 규칙을 정의하는 “객체”로 변환됩니다.
  • DOM 생성 : 마지막으로 HTML 마크업에 정의된 여러 태그 간의 관계를 해석해서 트리 구조로 연결이 됩니다.
  1. CSSOM tree 생성
  • DOM 트리를 생성하는 과정과 동일한 과정으로 CSSOM 트리를 생성

mdImag

mdImag

  1. 렌더링 트리(Rendering Tree) 생성
  • DOM 트리와 CSSOM 트리가 만들어지면, 이 둘을 결합해서 렌더링 트리를 생성 mdImag
  1. 레이아웃(Layout) 단계
  • 레이아웃 단계에서는 뷰포트 내에서 각 요소의 정확한 위치와 크기를 정확하게 캡처하는 Box 모델이 출력

mdImag

  1. 페인팅 단계
  • 마지막으로 렌더링 트리의 각 노드를 화면의 실제 픽셀로 변환 => 레이아웃 단계에서 모든 계산이 완료가 되면, 화면에 요소들을 그리게 된다. 이 단계를 페인팅 또는 래스터화라고 함.

  • 이미 레이아웃 단계에서 각 노드들이 위치, 크기, 색상 등 스타일이 모두 계산이 되었기 때문에 화면에 실제 픽셀로 변환

리플로우(Reflow), 리페인트(Repaint)

  • 리플로우 : 사용자가 웹 페이지에 처음 접속을 하면, 렌더링 과정을 거쳐서 화면에 모든 요소가 그려지게 됩니다. 이후에 사용자는 다양한 액션을 수행하게 되고, 여기서 발생되는 이벤트로 인해서 새로운 HTML 요소가 추가되거나, 기존 요소의 스타일이 바뀌거나 하는 변경이 일어나게 됩니다. 이런 변경을 통해 영향을 받게되는 모든 노드에 대해서 렌더링 트리 생성과 레이아웃 과정을 다시 수행하게 됩니다. (position, width, height, margin, padding, border, border-width, font-size, font-weight, line-height, text-align, overflow)

  • 리페인트 : 리플로우는 단지 변경사항을 반영하기 위해서 렌더링 트리를 생성하고 레이아웃 과정을 다시 수행하는 것이고, 실제 이 결과를 화면에 그려지기 위해서는 다시 페인팅 단계를 수행해야 합니다. (background, color, text-decoration, border-style, border-radius)

레이아웃에 영향이 미치지 않는 단순한 색상 변경 같은 변경사항은 리플로우(Reflow) 수행 없이 바로 리페인트(Repaint)만 수행

(리플로우가 일어나면 반드시 리페인트가 일어납니다)

02. 왜 알아야 하는가 ?

  • 브라우저 렌더링 프로세스를 아는 것은 웹 페이지가 로드되고, 렌더링되고, 사용자에게 표시되는 방식을 이해하는 데 도움이 되기 때문에 프론트앤드 개발자에게 매우 중요하다.
1. 성능 최적화
렌더링 파이프라인에 대한 인식을 통해 개발자는 코드를 최적화하여 레이아웃 재계산(리플로우) 및 다시 그리기를 최소화하여 페이지 렌더링 속도를 높이고 사용자 경험을 향상시킬 수 있다.
2. 사용자 경험(UX)
브라우저가 콘텐츠를 렌더링하는 방법을 알면 개발자가 더 부드럽고 반응이 빠른 사용자 인터페이스를 만드는 데 도움이 됩니다. 렌더링 병목 현상을 최소화함으로써 개발자는 전반적인 사용자 경험을 향상시킬 수 있다.
3. 디버깅 및 문제 해결
성능 문제를 식별하고 해결하려면 렌더링 프로세스를 이해하는 것이 필수적. 개발자는 브라우저 개발자 도구를 사용하여 렌더링 트리, 레이아웃 및 페인트 이벤트를 검사하여 문제를 진단하고 디버그할 수 있다.
4. 브라우저 간 호환성
다른 브라우저에서는 약간의 변형으로 렌더링 프로세스를 구현해야하는 상황이 있다. 웹 애플리케이션이 다양한 브라우저에서 일관되게 작동하도록 보장하기 위해 이러한 차이점을 인식해야함.
5. 효율적인 CSS 및 JavaScript 실습
렌더링 파이프라인에 대한 지식은 개발자가 보다 효율적인 CSS 및 JavaScript 코드를 작성하는 데 도움이 됨. 불필요한 레이아웃 재계산을 피하고, 스타일시트를 최적화하고, 비동기 로딩 기술을 활용하면 성능에 큰 영향을 미칠 수 있다.
6. 중요한 렌더링 경로 최적화
개발자는 중요한 렌더링 경로를 최적화하여 필수 리소스가 빠르게 로드 및 처리되도록 보장하여 스크롤 없이 볼 수 있는 콘텐츠를 더 빠르게 렌더링할 수 있다.
7. GPU 가속
브라우저가 GPU(그래픽 처리 장치)를 통해 하드웨어 가속을 활용하는 방법을 이해하면 개발자가 하드웨어 가속을 트리거하는 특정 CSS 속성(예: '변환' 또는 '불투명도')을 적용할 때 정보에 입각한 결정을 내리는 데 도움이 된다.
8. 웹 성능 지표
FCP(First Contentful Paint), LCP(Largest Contentful Paint) 및 TTI(Time to Interactive)와 같은 주요 성능 지표를 해석하고 개선하려면 렌더링 프로세스에 대한 지식이 필수적이다.
9. 반응형 디자인
반응형 웹 디자인은 브라우저가 다양한 장치와 화면 크기에 따라 콘텐츠를 어떻게 다르게 렌더링하는지 이해하는 데 달려 있다. 개발자는 레이아웃이 다양한 뷰포트에 적절하게 적용되는지 확인해야 함