티스토리 뷰
소개
브라우저는 아마도 가장 많이 사용하는 소프트웨어입니다. 이 글을 통해 브라우저가 어떻게 동작하는지 설명하려고 한다. 브라우저 주소 창에 naver.com을 입력했을 때 어떤 과정을 거쳐 네이버 페이지가 화면에 보이게 되는지 알게 될것입니다.
웹 브라우저란?
웹 브라우저란 웹에서 정보를 탐색하고 HTML문서, 이미지 등 여러 콘텐츠를 우리에게 표현해주는 소프트웨어로 구글 크롬, 애플의 사파리, 마이크로소프트 엣지, 모질라 파이어폭스 등이 있다.
브라우저의 기본 구조
- 사용자 인터페이스 : 주소 표시줄, 이전/다음 버튼 등 요청한 페이지를 보여주는 창을 제외한 나머지 부분
- 브라우저 엔진 : 사용자 인터페이스와 렌더링 엔진 사이의 동작을 제어
- 렌더링 엔진 : 요청한 콘텐츠(HTML/CSS 등)를 파싱(parsing)하여 표시
- 통신 : HTTP 요청과 같은 네트워크 호출에 사용됨.
- UI 백엔드 : 기본적인 위젯을 그리는 인터페이스, 플랫폼에서 명시하지 않은 일반적인 인터페이스
- 자료 저장소 : 로컬 스토리지, 쿠키 등 브라우저 메모리를 활용하여 저장하는 영역
브라우저는 어떻게 화면을 그릴까?
- 우리는 주소를 이용해 사이트에 접속한다.
- 사이트 주소는 대게 'http://www.xxxx.com 형식이며, 이를 도메인 주소라고 부른다.
- 사용자가 www.google.com(도메인 주소)에 접속한다.
- 이때 브라우저는 도메인 주소로 네트워크 요청을 보낸다.
- 네트워크에서는 DNS서버를 사용해, 도메인 주소에 해당하는 IP주소를 찾는다.
- 찾은 IP주소로 요청을 전송하여 도메인 주소에 해당하는 리소스(html)를 응답으로 받는다.
응답으로 온 리소스(ex. html)는 어떻게 화면에 그려주는 걸까?
브라우저 렌더링이란?
브라우저 렌더링은 브라우저(크롬, 사파리 등)가 HTML, CSS, JavaScript로 작성된 텍스트 문서에 대해 파싱(해석)하고 이를 화면에 그리는 일련의 과정이다.
브라우저 렌더링 동작 과정
1. HTML 파일과 CSS 파일을 파싱해서 각각 Tree를 만든다. (Parsing)
2. 두 Tree를 결합해 Rende Tree를 만든다. (Style)
3. RenderTree에서 각 노드의 위치와 크기를 계산한다. (Layout)
4. 게산된 값을 이용해 각 노드를 화면상의 실제 픽셀로 변환하고, 레이어를 만든다. (Paint)
5. 레이어를 합성하여 실제 화면에 나타낸다. (Composite)
각 단계를 좀 더 자세하게 알아보자.
1 단계. Parsing
브라우저가 페이지를 렌더링하면 가장 먼저 받아온 HTML 파일을 해석해야한다.
Parsing 단계는 HTML 파일을 해석하여 DOM(Document Object Model) Tree를 구성하는 단계이다.
파싱 중 HTML에 CSS가 포함되어 있다면 CSSOM(CSS Object Model) Tree 구성 작업도 함께 진행한다.
2 단계. Style(렌더 트리 생성)
Style 단계에서는 Parsing 단계에서 생성된 DOM Tree와 CSSOM Tree를 매칭시켜서 Render Tree를 구성한다. Render Tree는 실제로 화면에 그려질 Tree이다.
예를 들면 Render Tree를 구성할때 visibility: hidden 은 요소가 공간을 차지하고, 보이지만 않기 때문에 Render Tree에 포함이 되지만, display: none 의 경우 Render Tree에서 제외된다.
3 단계. Layout
Layout 단계에서는 Render Tree를 화면에 어떻게 배치해야 할 것인지 노드의 정확한 위치와 크기를 계산한다.
Render Tree의 루트부터 노드를 순회하면서 노드의 정확한 크기와 위치를 계산하고 Render Tree에 반영한다. 만약 크기 값을 %로 지정하였다면, Layout 단계에서 % 값을 계산해서 픽셀 단위로 변환한다.
4 단계. Paint
paint 단계에서는 Layout 단계에서 계산된 값을 이용해 Render Tree의 각 노드를 화면성의 실제 픽셀로 변환한다. 이때 픽셀로 변환된 결과는 하나의 레이어가 아니라 여러개의 레이어로 관리된다.
당연한 말이지만 스타일이 복잡할수록 Paint 시간도 늘어단다. 예를 들어 단색 배경의 경우 시간과 작업이 적게 필요하지만, 그림자 효과는 시간과 작업이 더 많이 필요하다.
5 단계. Composite
Composite 단계에서는 Paint 단계에서 생성된 레이어를 합성하여 실제 화면에 나타낸다. 우리는 화면에서 웹 페이지를 볼 수 있다.
Reflow, Repaint
리플로우와 리페인트는 DOM 요소가 시각적으로 변경됐을때, 이 변화를 다시 계산하고 화면에 그려주는 작업이다.
리플로우 (reflow)
DOM 요소의 기하학적 속성이 변경될때, 브라우저 사이즈가 변할때, 스타일시트가 로딩되었을때 발생하는 변화들을 다시 계산해주는 작업을 뜻하고 레이아웃(Layout) 이라고도 한다.
이런 요인에 의해 변화된 요소 주변의 모든 요소들도 영향을 받게되는데 결국 DOM 요소의 하나의 시각적 변화가 DOM 트리 전체에 대해 다시 계산을 수행하게 된다.
css 속성중 display: none 이 적용된 요소는 렌더 트리에서 제외된다. block 될 경우 공간을 차지하게되며 주변 요소들의 위치가 변하기때문에 리플로우가 발생하게 된다.
리페인트 (repaint)
변경된 요소를 실제로 화면에 그려주는 작업을 리페인트라고 한다. 그래서 리플로우가 발생하면 필연적으로 리페인트가 실행된다. 리플로우 처럼 모든 요소들에 대한 기하학적 정보들을 계산해주는 작업은 아니기에 리플로우 보다는 상대적으로 훨씬 가벼운 작업이다.
그리고 배경색이나 visibility 속성이 변했을때는 리플로우는 발생하지 않고 리페인트만 발생하는데 그 이유는 위치, 크기, 테두리 두께, 폰트 사이즈 같이 기하하적인 변화가 아닌 단순히 색상만 바뀌기 때문이다.
visibility: hidden 이 적용된 요소는 단순히 보이지 않게 될 뿐, 크기나 위치가 변하는게 아니기에 리플로우는 발생하지 않고 리페인트만 발생한다.
브라우저의 비동기 처리
아래와 같이 <script> 태그를 HTML 파일의 <head> 태그 안에 넣으면, 자바스크립트 파일이 다운로드되고 실행될 때까지 HTML 파싱이 중단되게 된다.
이는 사용자가 웹 페이지의 내용을 보는데 오래 기다려야 하게 된다.
<!DOCTYPE html>
<html>
<head>
<script src="script3.js"></script>
</head>
<body>
<h1>웹</h1>
</body>
</html>
HTML 파싱을 중단하지않고 비동기를 이용할 수 있는 기술이 있다. 바로 <script> 태그에 붙이는 async, defer이다. async와 defar 속성은 자바스크립트 파일을 비동기적으로 다운로드하고 실행할 수 있게 해준다. 이렇게 하면 HTML 파싱과 자바스크립트 다운로드가 동시에 진행되어 페이지 로딩 속도를 향상시킬 수 있다.
<html>
<head>
<script async src="script1.js"></script>
<script defer src="script2.js" ></script>
</head>
<body>
<h1>웹</h1>
</body>
</html>
- Total
- Today
- Yesterday
- StringBuilder
- 프로그래머스
- 콜백 큐
- 신입개발자 면접 준비
- 브라우저의 기본 구조
- 문자열 반복하기
- 배열만들기1
- 프로그래머스 qr code
- replaceAll
- rep;ㅁce
- 스코프
- startsWith()
- useeffet
- Java
- Object.clone()
- nodelist
- n 번째 원소부터
- 중첩스코프
- 마진과 패딩의 차이점
- 배열 만들기3
- 프로그래머스 세로 읽기
- SQLD
- replace와 replaceAll의 차이점
- 엑셀 파일 추출
- SQL 개발자
- Replace
- 호이스팅
- 렌더링 과정
- 블록스코프
- 대소문자 변환
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |