대부분의 브라우저는 렌더링을 수행하는 렌더링 엔진(Rendering Engine) 을 가지고 있다. 모든 브라우저가 같은 렌더링 엔진을 사용하지 않고, 파이어폭스는 게코(Cecko), 사파리는 웹킷 (Webkit)을 사용하고 있다.
각각의 렌더링 엔진들은 웹 표준에 따라서 개발자들이 작성한 문서를 브라우저에 보여주지만, 개발 진척도나 별도 규칙에 따라 지원하는 표준이 다르거나, 렌더링 알고리즘 방식에 차이가 있을 수 있습니다. 따라서, 각각 엔진만다 개발자가 의도하지 않게 웹페이지가 동작할 수 있습니다.
- HTML, CSS 파싱해서, DOM, CSSOM 트리 구축
- Render 트리 구축 (DOM 과 CSSOM 을 사용해서 렌더 트리 만듬)
- 자바스크립트 파싱과 실행
- 레이아웃 작업 (트리 배치, 리플로우) - 각 노드가 화면의 정확한 위치에 표시하기 위해 위치와 크기를 계산하는 과정
- 계산된 위치와 크기 등의 스타일을 실제 픽셀로 표현하는 작업 (Paint)
인터넷 주소를 치면, 그 사이트에 알맞는 index.html 파일을 가져오게 된다. 브라우저 렌더링 엔진은 HTML 문서를 파싱해, 브라우저가 이해할 수 있는 자료구조인 DOM 을 생성한다.
앞서말한, HTML 파싱을 하다가 CSS 파일을 로드하는 link 태그나 style 태그를 만나면 DOM 생성을 일시중단하고, CSS 파일을 서버로부터 요청하고 HTML 과 동일한 파싱과정을 거쳐 CSSOM 을 생성한다. 이후 CSS 파싱을 전부 완료한 뒤에 다시 HTML 을 파싱해 DOM 생성을 재개한다.
위에서 생성된 DOM 과 CSSOM 트리를 렌더 트리로 결합한다. 렌더 트리는 렌더링을 위한 트리 구조의 자료구조로 브라우저 화면에 렌더링되는 노드만으로 구성된다.
script 태그를 만나면, 마찬가지로 HTML 파싱을 중단하고 자바스크립트 파일을 불러와 자바스크립트 코드를 파싱한다. 자바스크립트 엔진을 이를 해석해, AST(추상적 구문 트리) 를 생성한다. 그리고 AST 를 기반으로 인터프리터가 실행할 수 있는 중간 코드인 바이트 코드를 생성해 실행한다.
브라우저의 뷰포트 내에서 각 노드들의 정확한 위치와 크기를 게산해 배치한다. 브라우저 화면의 어느위치에 어느크기로 출력될지 계산하는 단계이다.
요소들의 위치와 크기, 스타일 계산이 완료된 Render Tree 를 이용해, 픽셀 값을 채워넣게 된다. 이 때 텍스트, 색, 이미지 ,그림자 효과등이 모두 처리되어 그려진다.
💡 background-color, visibility 와 같이 레이아웃에는 영향을 주지 않는 속성이 변경되었을 때는 Reflow 를 수행할 필요가 없기 때문에 Repaint 만 수행하게 된다.
visibility invisible 은 레이아웃 공간을 차지하기 때문에 reflow 의 대상이 된다. 하지만 display none 은 Layout 공간을 차지하지 않아 Render Tree 에서 아예 제외된다.
Reflow가 일어나는 대표적인 속성
Repaint가 일어나는 대표적인 속성
또한 Reflow Repaint가 일어나지 않는 transform, opacitiy와 같은 속성도 있습니다. 따라서 left, right, width, height 보다 transform을, visibility/display 보다 opacitiy를 사용하는 것이 성능 개선에 도움이 됩니다.
position absolute 또는 fixed 를 사용해, 영향을 받는 주변 노드를 줄일 수 있다. 애니메이션이 들어간 코드는 가급적 position:fixed, position:absollute 로 지정해 전체 노드에서 분리시킨다.
프론트엔드 개발자로 알아야할 기본적인 내용인, 브라우저 렌더링 과정과 리플로우, 리페인트의 개념에 대해 정리해보았다. 당연히 알고있어야 되는 내용이지만, 사소하다 여기고 놓지고 있던 부분이 있어 이 기회에 머릿속에 완벽히 정리해두고 있으면 좋을 것 같다.
요즘 느끼는 점. 기술은 빠르게 변화하지만 웹브라우저는 그대로다..결국 브라우저, HTML,CSS,JS 가 기본이다 !! 그동안 실무에만 치우쳐져 최신 기술 스택을 익히는데만 급급했는데 회사생활이 익숙해진 지금. CS 에 대한 부족함을 인지하고 있고, 채워나가려 노력중이다. 화이팅.