Browser Rendering

심현인·2021년 8월 10일
0

HTML/CSS/JavaScript로 웹페이지를 만드는 작업을 할 때 웹 브라우져는 저 코드를 해석을 해서 웹페이지를 만든다. 이 때 브라우저는 무슨 일을 할까?
그 전에 브라우저의 구조에 대해 먼저 알아보자.

브라우저의 구조

1. User Interface

  • 주소 표시줄, 이전/다음/새로고침 버튼 등 웹페이지를 제외하고 사용자와 상호작용하는 사용자 인터페이스

2. Rendering Engine

  • 요청한 HTML과 CSS를 파싱하여 요청한 웹페이지를 표시하는 렌더링 엔진

3. Browser Engine

  • 유저 인터페이스와 렌더링 엔진을 연결하는 브라우저 엔진

4. Network

  • 각종 네트워크 요청을 수행하는 네트워크 파트. HTTP 요청과 같은 네트워크 호출에 사용됨. 이것은 플랫폼 독립적인 인터페이스이고 각 플랫폼 하부에서 실행됨.

5. JavaScript Interpreter

  • JS코드를 실행하는 인터프리터(크롬-V8, Mozilla-Rhino, Firefox-SpiderMonkey)

6. UI Backbone

  • 체크박스 혹은 버같은 기본적인 위젯을 그려주는 파트

7. Data Persistence

  • local Storage 혹은 Cookie같이 보조 기억장치에 데이터를 저장하는 파트

여기서 Rendering Engine에 대해 좀 더 자세히 알아보자

각 브라우저의 렌더링 엔진

웹 브라우저마다 렌더링 엔진이 다른데
Safari는 Webkit, Chrome은 Blink, Firefox는 Gecko를 사용한다.

렌더링 엔진의 목표

  1. HTML/CSS/JS/이미지 등 웹 페이지에 포함된 모든 요소들을 화면에 보여주기
  2. 업데이트(사용자가 입력을 한다던지, 스크롤 이미지 데이터로딩 등..)가 필요할 때, 효율적으로 렌더링을 할 수 있도록 자료구조를 생성하기

렌더링 엔진의 동작 과정(Critical Rendering Path)

  1. Dom Tree와 CSSOM의 생성
  • HTML5표준에 맞춰서 각 태그를 토큰화를 한다. 그리고 브라우저의 렉싱(Lexing)과정을 통해 토큰의 해당 속성과 규칙을 정의하는 node 객체로 변환하고, 그 node들이 연관성을 갖게 끔 Tree구조로 변환시키는 것이다. HTML을 파싱하는 가운데 필요한 CSS나 JS를 불러오도록 요청하기도 한다.
    (렉싱은 토크나이징이라고 불리기도 하며 문자열을 나누어 토큰이라 불리는 (해당 언어에) 의미 있는 조각으로 만드는 과정 이라고 한다.)
  • CSSOM은 DOM이 화면에 어떻게 표시될지 알려주는 역할을 한다. 이것도 DOM처럼 Tree를 구조를 갖기 때문에 자식 노드들도 부모의 스타일을 받게된다.
  1. Render Tree 생성
  • DOM Tree와 CSSOM Tree를 합친 트리. 즉 화면에 표시되어야하는 모든 노도의 컨텐츠, 스타일 정보를 포함하는 트리를 생성한다. CSS의 meta, display:none같은 것들은 DOM과 상관 없기 때문에 포함되지 않는다.브라우져마다 조금씩 차이가 있다.
  1. Reder Tree 배치(Layout(Reflow))
  • 뷰포트 내에서 각 요소의 정확한 위치와 크기를 계산하는 과정. 박스 모델에 따라서 텍스트나 요소의 박스가 화면에서 차지하는 영역이나 여백이 계산된다. 이때 CSS의 %나 em같은 상대적인 단위들이 뷰포트를 계산해서 픽셀로 전환된다.
  1. Render Tree 그리기 (Paint(Repaint))
  • 위의 과정에서 렌더링 엔진이 각 요소들이 어떻게 생겼고, 이를 어떻게 보여줄지 알게된 후 화면에 실제 픽셀로 그려지는 과정. 이 과정에서 텍스트 이미지 등이 실제 픽셀로 그려진다.

이러한 과정을 줄이면 그만큼 렌더링 하는 시간도 줄어든다. 그러나 중간에 사용자가 조작을해서 업데이트가 일어나게 된다면 어떻게 될까?

UI가 업데이트 되는 상황

  1. 다시 Layout이 발생하는 경우
  • 주로 요소의 크기나 위치가 바뀔 때, 혹은 브라우저 창의 크기가 바뀔때 다시 발생한다.

    -> 이 순서대로 크기나 그런것들이 다시 계산된 후 화면에 배치되고 그려지는 과정을 거치게된다.
  1. Paint부터 다시 발생되는 경우
  • 주로 배경 이미지나 텍스트 색상, 그림자 등 레이아웃의 수치를 변화시키지 않는 스타일의 변경이 일어날 때 발생한다.

    -> 레이아웃 과정이 발생하지 않기 때문에 성능이 좋다.
  1. 레이어의 합성만 다시 발생하는 경우
  • 레이어는 페인팅할 영역을 나누어 놓은 것이다. 크롬의 경우 정해진 경우 필요에의해 브라우저가 레이어를 생성한다. 그리고 렌더트리에있는 노드객체들은 생성된 레이어에 포함하게 된다. 이 레이어들은 트리 형식이고, 렌더링 엔진이 페인팅과정에서 각각 그린다음 하나의 비트맵으로 합성하여 화면에 그린다.

    -> Layout과 Paint를 수행하지 않고 레이어의 합성만 발생하기 때문에 성능상으로 가장 큰 이점을 갖는다.

출처
체프의 브라우저 렌더링
브라우저는 어떻게 동작하는가?

profile
가로

0개의 댓글