전 이 단어를 면접에서 처음 들어보았어요.. "브라우저 렌더링 순서에 대해서 설명해 보세요"
...? sry...
지금 생각해도 아찔하군요
여러분은 그럴 일 없도록..
자 그럼, 웹 브라우저 렌더링 순서에 대해서 살짝 알아볼까요?
브라우저 렌더링이라 함은 Html, CSS 그리고 JS 등의 파일들을 받아와서 읽고 사용자가 보는 화면을 그리는, 일련의 과정을 의미합니다.
각각의 순서와 정의를 알아보죠.
순서는 아래와 같아요
Parsing ➙ Style ➙ Layout ➙ Paint ➙ Composite
하나씩 훑어보죠!
Parsing
처음 단계는 파싱단계입니다. 단어 뜻 그대로 파싱 한다는 것으로, 받아온 HTML 파일을 파싱 즉 해석하는 단계예요.
이렇게 파싱을 통해서 DOM(Document Object Tree)를 구성해요. 우리가 돔돔 거리는 바로 그 돔 DOM이에요!
추가로 CSS가 포함되어 있다면 CSSOM (CSS Object Tree)도 함께 구성하죠!
Style
DOM 트리와 CSSOM 트리를 매칭시켜서 Render Tree를 그리는 과정이에요. 참고로 meta 태그나 display: none과 같은 속성은 사용자에게 보이는 요소가 아니죠? 그렇기에 Render Tree에 포함시키지 않아요!
여기서 visibility : hidden 같은 요소는 Render tree에 포함된다는 사실! 왜? 해당 특성은 보이지는 않지만 특정 장소를 차지하고 있는 요소이기 때문에 Render Tree 포함됩니다!
Layout
Render Tree를 화면에 어떻게 배치해야 할지 노드의 정확한 위치와 크기를 계산하는 단계예요.
사용자가 쓰는 모든 화면이 같지 않기 때문이죠. 웹에서 볼 수도 앱에서 볼 수도 있고, 또 각각의 기기 마다도 화면이 다르니까요!
css에 % 나 vh 같이 상대적인 값으로 설정했다면 이 단계에서 픽셀 단위로 변환해요.
후에 화면 크기의 변화, DOM 추가/삭제 등의 행동에 따라서 Layout 이 다시 발생하기도 하는데 이를 Reflow라고 해요! 후에 알아보죠
Paint
layout 단계를 통해서 계산된 값들을 단어 그대로 실제 픽셀에 그리는 단계예요. 렌더 트리의 요소와 텍스트가
픽셀로 그려집니다. 첫 발생하는 Paint를 FMP(First Meaningful Paint)라고 해요.
2048 x 1536 해상도 기준으로 iPad는 3,145,000개의 픽셀을 가지고 있어요.
이렇게 무수히 많은 픽셀들을 짧은 시간 안에 채우기 위해서 여러 개의 Layer를 만들어고
각각 픽셀을 합치고 계산하는(composite) 하는 단계를 거치죠.
❗TMI❗ 성능을 높이는데 주요한 역할을 하지만 메모리를 많이 차지하는 편이기에 남용하면 안 된다고 하는군요!
Composite
앞 단계에서 만든 여러 개의 Layer를 하나로 모으는 단계예요.
이 단계에서 Layer 들을 계획된 순서로 합치면서 최종적으로 사용자가 볼 화면을 보여줘요
여기까지가 1차적인 화면 그리기 순서였어요. 하지만 한 번만 그리고 끝나지 않죠? 사용자의 액션이나 화면크기 변화로 인해서
다시 그려야 할 때면 또다시 순서가 시작돼요.
Reflow
페이지의 크기, 폰트 크기등의 Style 변화에 의해서 일어나요. 크기가 달라짐으로 인해 방금 했던 전체 순서를 다시금 그려야 하죠.
이를 Reflow라고 해요. 전체 순서를 다시 하는 건 성능 면으로 좋지 않겠죠? 인라인 스타일을 사용하지 않는 것이 Reflow를 줄이는 방법 중 하나라고 하니 참고하세요! (하지만 CSS 파일 따로 만들기 귀찮은걸..).
Repaint
반면 레이아웃에 영향을 미치치 않고, 색의 변경이나 visibility 같은 성격이 변경된 경우 이를 Repaint라고 해요.
아마 이런 것들을 React를 처음 사용하고 배울 때 들어봤을 거예요.
layout, repaint, reflow 발생을 최소화하기 위해서 Virtual DOM을 만들어서 연속적 변경을 한 번에 처리하는 것이죠!
❗TMI❗ [크롬 개발자 도구] -> [성능] -> [렌더링]을 보면 페인트와 레이아웃을 시각적으로 확인할 수 있어요.
해당 부분을 체크하고 화면에서 마우스를 움직이고 해 보면 변화되는 곳에 표시가 된답니다
개발자 도구에 생각보다 다양한 도구들이 들이 많아요.
다음엔 이 부분을 파보아도 좋을 것 같군요.
참고 : https://developer.mozilla.org/en-US/docs/Web/Performance/How_browsers_work