브라우저의 큰 역할 중 하나는 HTML, CSS, Javascript파일들을 읽어내는 것이다. 이를 읽어내어 사용자에게 웹 페이지의 형태로 그려내는 것을 '랜더링'이라고 하며, 이 글에서는 랜더링의 과정에 대해 조금 더 구체적으로 서술해보고자한다.
랜더링의 과정은 다음과 같다.
1. 파싱
- 웹 브라우저는 HTML 파일을 받아서 이해하기 시작한다. 이 과정에서 브라우저는 코드의 문자열을 의미있는 요소로 분해하고 구조를 읽어낸다.
2. 토크나이즈
- 파싱 단계에서 HTML 문서의 문자열은 '토큰'이라고 하는 작은 부분으로 나누어진다. 각 토큰은 태그(예: <div>, <span>, <a> 등) 또는 내용(텍스트)을 나타낸다.
3. 렉싱
- 토크나이즈 과정을 통해 생성된 토큰들은 객체로 변환되어 문법적 의미를 가지게 됩니다. 이 객체들은 문서의 구조를 형성하는 요소가 된다.
4. DOM 생성
- HTML 문서의 모든 요소와 내용이 객체로 변환되면, 이 객체들을 사용하여 DOM(Document Object Model) 트리를 생성한다. DOM 트리는 웹 페이지의 구조적 표현으로, 각 HTML 요소가 노드로 표현된다.
5. CSSOM 생성
- HTML에 DOM 트리가 있다면 CSS를 위한 CSSOM(CSS Object Model)또한 존재한다. 브라우저는 CSS 파일을 파싱하여 CSSOM을 생성한다. CSSOM은 DOM과 유사하지만 스타일 정보를 담고 있다.
6. 렌더링 트리 생성
- DOM과 CSSOM이 준비되면, 브라우저는 이 두 트리를 결합하여 '렌더링 트리'를 형성한다. 이 트리는 화면에 실제로 그려질 요소들만을 포함한다. 그렇기에 display: none으로 설정된 요소는 포함되지 않는다.
7. 레이아웃
- 렌더링 트리가 완성되면, 브라우저는 각 요소가 화면의 어디에 위치해야 하는지 계산한다. 이 과정에서 요소의 크기와 위치가 결정된다.
8. 페인트
- 레이아웃 단계가 끝나면 실제로 요소를 화면에 그리는 '페인트' 단계가 시작된다. 이 단계에서는 텍스트 색상, 배경 이미지 등 세부적인 스타일이 적용된다.
리플로우와 리페인트
- 웹 페이지에서 요소의 크기나 위치가 변경될 경우, 브라우저는 레이아웃(리플로우)을 다시 계산해야 합니다. 단순히 스타일(색상, 투명도 등)만 변경되는 경우에는 해당 요소만 다시 그리는 리페인트가 발생합니다.
이처럼 웹 페이지 랜더링 과정에서 레이아웃과 페인트 단계가 분리되어 있는 이유는 효율성, 성능 최적화와 관련이 깊다. 예를 들어, 만약 레이아웃과 페인트가 동시에 처리된다면, 요소의 스타일 변경이 있을 때마다 위치와 크기 또한 재계산되어야 할 수 있다. 그러나 분리된 방식을 사용함으로서 웹 페이지 요소의 스타일 변경이 위치와 크기에 영향을 주지 않는 경우, 리페인트 과정만 따로 진행할 수 있게 됨으로서 브라우저는 불필요한 계산을 줄이고, 더 빠른 응답성과 랜더링 성능을 제공할 수 있게 되는 것이다.
'프론트엔드' 카테고리의 다른 글
[프론트엔드] 왜 Vite는 Webpack보다 훨씬 빠를까? (0) | 2024.09.04 |
---|---|
[프론트엔드] 리액트에서 상태관리는 어떻게 이루어질까? (Feat: useState) (2) | 2024.09.02 |
[프론트엔드] UseRef (Feat. DOM조작) (0) | 2024.08.12 |
[프론트엔드] Position (0) | 2024.07.28 |
[프론트엔드] Flex (0) | 2024.07.26 |