브라우저가 웹 페이지를 화면에 표시하기 위해 거치는 과정을 `브라우저 렌더링 파이프라인`이라고 합니다. 브라우저 렌더링 파이프라인은 5단계로 구성됩니다.
- DOM 생성
- CSSOM 생성
- 렌더 트리 생성
- 레이아웃
- 페인팅
- 컴포지팅
1. DOM 생성
브라우저가 HTML 파일을 받으면, 이 파일을 바이트(byte) 단위로 읽기 시작합니다. 브라우저의 HTML 파서(Parser)는 이 바이트들을 문자로 변환하고, 이 문자들을 HTML 토큰으로 변환합니다. 이 HTML 토큰들은 각각의 태그와 그 안에 포함된 텍스트, 속성 등을 의미하게 됩니다.
HTML을 생성하게 되면, 브라우저는 이를 기반으로 `DOM 트리`를 생성합니다. DOM 트리는 HTML 문서의 구조를 트리 형태로 표현한 것으로, 각 태그가 노드(node)가 되어 `부모 - 자식 관계`를 형성합니다.
2. CSSOM 생성
브라우저는 CSS 파일을 파싱(parse)합니다. CSS 파일 또한 바이트로 전송되므로, 브라우저는 이를 문자로 변환한 뒤, CSS 규칙으로 나눕니다. 각 CSS 규칙은 `선택자(selector)`와 `선언(declaration)`으로 구성되는데, 선택자는 스타일을 적용할 HTML 요소를 정의하고, 선언은 적용할 스타일을 정의합니다.
브라우저는 이 CSS 규칙들을 기반으로 `CSSOM 트리`를 생성합니다. CSSOM 트리는 DOM과 유사하게 트리 구조를 가지며, 각 노드는 해당 노드에 적용될 스타일 정보를 포함합니다.
3. 렌더 트리 생성
브라우저는 DOM과 CSSOM을 결합하여 `렌더 트리`를 생성합니다. 렌더 트리는 화면에 실제로 표시될 요소들로만 구성됩니다. 예를 들어, `display : none` 속성이 있는 요소는 렌더 트리에 포함되지 않습니다. 이는 렌더 트리가 실제로 화면에 그려진 요소들만을 포함하기 때문입니다.
렌더 트리의 각 노드는 DOM 트리의 요소와 연결되며, CSSOM 트리에서 해당 요소에 적용된 스타일 정보를 포함합니다. 즉, `렌더 트리`는 HTML 문서의 구조와 각 요소의 스타일 정보를 모두 포함한 트리입니다.
4. 레이아웃
렌더 트리가 생성된 후, 브라우저는 이 트리를 사용해 각 요소의 정확한 위치와 크기를 계산합니다. 이 과정이 바로 `레이아웃`입니다. 레이아웃 과정에서는 렌더 트리의 각 노드가 화면에 어디에 위치할지, 그리고 얼마나 큰지를 계산하게 됩니다.
이 계산은 화면의 뷰포트(viewport) 크기와 같은 정보에 의존합니다. 화면 크기가 변경되면 브라우저는 레이아웃 과정을 다시 수행해야 합니다. 이 과정을 `리플로우(reflow)`라고 부릅니다. 리플로우는 성능에 영향을 줄 수 있으므로 이를 최소화하는 것이 중요합니다.
(reflow와 repaint)
5. 페인팅
레이아웃이 완료되면, 브라우저는 각 요소를 실제로 화면에 그리는 작업을 시작합니다. 이 과정을 `페인팅`이라고 합니다. 페인팅 단계에서는 텍스트, 색상, 그림자, 이미지 등 모든 시각적 요소가 화면에 그려집니다.
페인팅은 화면에 표시될 그래픽 요소를 생성하는 과정이기 때문에, 이 과정도 성능에 큰 영향을 줄 수 있습니다.
6. 컴포지팅
브라우저는 화면에 그려질 요소들을 각각의 레이어(layer)로 분리하고, 이 레이어들을 결합하여 최종 화면을 구성합니다. 이 과정에서는 GPU를 활용하여 각 레이어를 빠르게 합성합니다.
`transform`이나 `opacity`와 같은 속성은 레이아웃이나 페인팅과정을 거치지 않고, 컴포지팅 단계에서만 처리됩니다. 이러한 속성을 사용하는 애니메이션은 더 부드럽고 빠르게 실행될 수 있습니다. 컴포지팅 단계는 GPU 가속을 활용하여 성능을 최적화하고, 화면에 최종적으로 표시되는 결과를 빠르게 생서하는데 중요한 역할을 합니다.
'매일 면접 질문' 카테고리의 다른 글
[매일매일] 리액트의 Strict Mode에 대해서 설명해주세요 (0) | 2024.11.26 |
---|---|
[매일매일] 인터넷 창에 www.google.com를 입력하면 무슨 일이 일어나는지 설명해주세요 (1) | 2024.11.25 |
[매일매일] 리액트에서 성능 최적화를 위한 방법들을 설명해주세요 (0) | 2024.11.21 |
[매일매일] Controlled Component와 Uncontrolled Componenet의 차이점에 대해서 설명해주세요 (1) | 2024.11.20 |
[매일매일] 리액트 props와 state에 대해 설명해주세요. (0) | 2024.11.19 |