최근 서비스 개발을 하면서 performance의 점수가
개판나는 것을 보고 렌더링 최적화에 대한 공부를 해야겠다고 느꼈다...
우선 브라우저 렌더링에 대해 깊게 이해가 필요할 것 같아 "브라우저 렌더링"에 대해 공부하며 정리하고자 한다.
나중에 공부해야지 미루지 말고 이참에 깊게 알아보자!
우리는 HTML, CSS, JS를 이용해 웹페이지를 만든다.
우리가 만든 코드를 가지고 웹 브라우저는 웹페이지를 그려주게 된다.
* 이 글에서 설명하는 브라우저는 파이어폭스, 크롬, 사파리와 같은 오픈소스 브라우저이다.
먼저, 브라우저의 공통적인 구조에 대해 알아보자.
뭐가 되게 많다... 당연하다.
하나의 웹페이지를 구성하고 보여주기 위해서는 브라우저가 꽤 많은 일들을 처리해야하기 때문이다.
하나씩 쉽게 풀어보자
사용자 인터페이스란 주소 표시줄, 이전/다음 버튼, 북마크 메뉴 등... 요청한 페이지를 보여주는 창을 제외한 나머지 모든 부분이다.
브라우저 엔진은 사용자 인터페이스(UI)와 렌더링 엔진 사이의 상호작용 처리를 시각 표현으로 변환시키는 것.
브라우저 엔진, 렌더링 엔진 등 브라우저를 구성하는 엔진들이 많아 헷갈렸었다.
하지만 ChatGPT의 명확한 설명 덕분에 머릿속에서 정리가 됐다.
렌더링 엔진... 밑에서 자세히 다루기 때문에 간단하게 정의한다.
렌더링 엔진이란 요청한 콘텐츠를 화면에 그리는 역할을 수행한다.
HTTP 요청과 같은 네트워크 요청을 수행한다.
UI 백엔드란 브라우저의 다양한 UI 요소를 처리하고, 렌더링 엔진과 상호작용하여 사용자가 원활하게 웹 페이지를 이용할 수 있도록 지원합니다.
UI 화면에 그려주는거 렌더링 엔진이 하는거 아니야?
라는 생각이 들어 ChatGPT한테 물어봤다 🤖
단번에 이해됐다!
정리하면
자료 저장소란 사용자의 데이터를 로컬 스토리지(Local Storage)나 쿠키(Cookie)와 같은 데이터 저장소에 저장하여, 다음에 해당 웹 사이트를 방문할 때 이전에 입력한 정보나 상태를 유지하거나 추적할 수 있도록 한다.
Data Persistence는 사용자 경험을 개선하고, 웹 애플리케이션의 효율성을 높이는 데 매우 중요하다.
이 부분도 재밌어서 더 적고 싶은데.. 렌더링 엔진때문에 갈 길이 멀다.
자바스크립트 해석기는 자바스크립트 코드를 읽고, 해석하며, 실행하는 역할을 한다.
V8 엔진을 어디서 많이 들어봤을 것이다.
V8 엔진은 구글에서 개발한 자바스크립트 엔진으로, Chrome 브라우저에서 사용되는데 그 엔진이 인터프리터다.
V8 엔진도.. 빠른 속도, 메모리 최적화 등등 깊게 얘기할 것들이 많지만 음에 따로 정리할 예정이다.
드디어 브라우저 기본 구조에 대해 간단히 살펴봤다.
이 중 렌더링 엔진을 중심으로 자세히 알아보자!
그 전에 웹 브라우저마다 다른 렌더링 엔진을 사용한다.
모든 렌더링엔진이 기본적으로 웹표준을 준수하면서도 엔진마다 조금씩 다르게 동작한다.
* 이 글에서 설명하는 렌더링 엔진은 크롬을 기준으로 설명한다.
여기 말하는 업데이트란 사ㅇ자 동작으로 인해서 입력이 발생 하던가, 스크롤이 생겼다던가, 애니메이션이 동작하던가, 비동기 요청으로 인한 데이터로딩 등을 말한다.
이와 같은 목표를 위해 렌더링 엔진은 Critical Rendering Path라는 과정을 거쳐 동작하게 된다.
Critical Rendering Path에 대해 알아보자.
브라우저는 HTML 문서를 파싱하는 과정에서 자바스크립트나 css 같이 추가로 필요한 파일들을 불러오도록 요청하기도 한다.
font-size: 12px;
이라는 속성을 정해뒀다면 body의 자식요소들에게도 동일한 속성이 전파되어 적용된다.렌더트리가 만들어지는 과정
- document 객체가 각 노드를 순회하면서 각각의 맞는 CSSOM을 찾아서 규칙을 적용한다.
- 렌더와 관련된 요소를 렌더트리에 포함시킨다.
- 이때, meta 태그나 display:none 속성은 렌더와 관계가 없기 때문에 렌더 트리에 포함되지 않는다.
실제 렌더트리는 위 그림보다 더 복잡하며, 브라우저마다 조금씩 다르게 생성되는 것을 알아두자.
렌더트리가 생성되었다면 레이아웃, 같은 말로 Reflow 과정을 거친다.
- 뷰포트 내에서 요소들의 정확한 위치와 크기를 계산한다.
- 박스 모델에 따라서 텍스트나 요소의 박스가 화면에서 차지하는 영역이나 여백 그리고 이외의 스타일 속성이 계산된다.
- 이때 css에서 %나 em같은 상대적인 단위를 사용했을때는 뷰포트에 맞춰 픽셀단위로 변환된다.
마지막으로 화면에 실제 픽셀로 그려지도록 변환하는 과정을 거치는데 바로 Paint 과정이다.
추가로 자바스크립트가 DOM, CSSOM을 변경하는 경우 리렌더링을 하게 된다. 리렌더링은 다음포스팅에서 다룰 예정이지만 간단히 알아두자.
리플로우: 레이아웃 계산을 다시 하는 것
리페인트: 재결합된 렌더 트리를 기반으로 다시 페인트를 하는 것
웹 브라우저와 렌더링 엔진에 대한 이해를 했다. 다음 포스팅에서는 렌더링 엔진의 파싱과 렌더링 최적화에 대해 정리할 예정이다.
be continue...