우리가 브라우저를 켜서 사이트에 접속하면 브라우저 내부에서는 어떤 일이 발생하는지를 알아본다.
먼저 우리가 주소창에 www.abc.com이라고 치게 되면, 웹 브라우저는 DNS에게 호스트의 IP주소를 물어보게 된다.
브라우저: www.abc.com의 IP주소를 알려줘!
DNS: 이 호스트의 IP주소는 1.1.1.1이야.
이 과정은 이 포스트에서 자세하게 다루었다.
그러면 브라우저는 이 IP주소에 있는 서버를 찾아간다. 이 때 랜덤한 숫자를 적은 번호표를 들고 가는데, 이걸 Random Sequence
라고 한다. 이 번호표를 서버에게 건네면서 악수를 요청하고, 서버는 번호표에 1을 더해서 다시 브라우저에게 돌려준다. 브라우저는 받은 번호표에 다시 1을 더해서 서버에게 다시 건네는데, 이 과정을 3-Way Handshake
라고 한다. 데이터를 주고받기 위해 Handshake
가 끝나면, 브라우저는 이제 서버에게 자료를 요청할 수 있다.
이제 자료를 요청할 수 있게 된 브라우저는, 서버에게 해당 주소(www.abc.com)에 있는 데이터를 요청하는데, 이것이 HTTP Request
이다. 서버가 요청을 받으면 브라우저에게 데이터를 보내주는데, 이를 Http Response
라고 한다.
브라우저는 받은 데이터를 사용자가 보기 좋게 예쁘게 출력해줘야 한다. 그런데 데이터를 출력하려면, 브라우저는 서버로부터 받은 데이터를 해석해야 한다. 대부분의 브라우저는 웹 표준화 기구 W3C에 따라서 HTML과 CSS를 해석한다. 그리고 이렇게 해석하는 것을 Parsing
이라고 한다.
먼저 브라우저의 렌더링 엔진은 HTML을 Parsing
하여 Dom Tree
를 생성한다. 우리가 HTML을 작성할 때 상위 요소 안에 하위 요소를 넣은 구조를, 트리 구조로 생성하는 것이다.
이 때 브라우저 렌더링 엔진이 <style>
태그를 만난다면 HTML Parsing
작업을 중단하고, CSS Parsing
을 시작하여 CSSSOM Tree
를 생성한다. CSS Parsing
을 마치면 아까 중단했던 HTML Parsing
을 계속 진행한다. 이것이 CSS를 <head>
안에 둬야 하는 이유데, 파싱 과정에서 Dom Tree
가 생성되어도 CSSOM Tree
가 없으면 렌더링이 되지 않는다. CSSOM Tree
를 빠르게 생성하기 위해서 <head>
안에 CSS 파일을 넣는 것이 좋다.
그러다가 <script>
태그를 만나면, 다시 HTML Parsing
을 중단하고 이번에는 자바스크립트 엔진에게 권한을 넘긴다. 자바스크립트 엔진은 코드를 해석하여 Abstract Syntax Tree(추상 구문 트리), AST
를 만들고 실행 한다. 그 다음으로 아까 중단한 HTML Parsing
작업을 완료한다. 이는 마찬가지로 JS를 body 맨 아래에 둬야 하는 이유인데, 스크립트 파일을 읽는 동안 렌더링에 방해가 되어 무거운 스크립트가 실행될 때는 사용자 입장에서 웹페이지가 느리게 보인다.
그리고 브라우저는 Dom Tree
와 CSSOM Tree
를 합쳐서 Render Tree
를 생성한다. 이 Render Tree
를 생성하는 과정까지를 Construction
이라고 부른다.
이제 렌더링 엔진이 Layout(또는 Reflow) 작업을 시작하는데, 이 작업은 만들어진 Render Tree
의 노드들을 화면의 올바른 위치에 표시하는 것이다. 그 다음 UI Backend
가 Render Tree
의 노드들을 돌면서 화면에 UI를 그린다(Paint). 그 다음 노드들의 레이어를 순서대로 구성하는 Composition 작업이다. z-index
가 낮은 요소를 먼저 놓고, 높은 요소를 그 위에 쌓는 작업이다. Layout, Paint, Compsition까지의 과정을 Operation
이라고 한다.
그런데 이 UI를 그리는 모든 과정은 서버로부터 모든 데이터를 받은 후에 시작하는 것이 아니라, 받아오는 과정에 먼저 받은 데이터 먼저 그려준다. 이 때문에 웹페이지 화면이 한번에 뜨지 않고 부분적으로 뜨는 현상이 일어나는 것이다.
렌더링을 마치고 최종적으로 브라우저에 페이지가 그려진다. 하지만 자바스크립트를 이용해 DOM
을 조작한다던가, 마우스 hover 등 특정 이벤트에 의해 HTML요소에 변화가 생기게 되면 해당 요소에 영향을 받는 자식,부모 노드를 포함하여 Layout(Reflow)를 다시 수행하게 된다.
각 요소의 배치와 위치를 다시 계산(Reflow)하고, 이 Reflow된 렌더 트리를 다시 페이지에 그려주는 과정을 Repaint라고 한다. Reflow와 Repaint가 반드시 같이 수행되지는 않는다. 예를 들어 위치의 변경 없이 버튼의 색상만 변경하는 경우 Reflow 없이 Repaint만 일어날 것이다.
3-way Handshake
를 나눈다.HTTP Request
를 보내면, 서버는 브라우저에게 HTTP Response
를 보낸다.Parsing
하여 Dom Tree
를 생성한다. <style>
태그를 만나면 HTML Parsing
을 중단하고 CSS Parsing
하여 CSSOM Tree
를 생성한다.<script>
태그를 만나면 HTML Parsing
을 중단하고 자바스크립트 엔진에게 권한을 넘겨 Script Parsing
하고, Abstract Syntax Tree(AST)
를 생성한다.Dom Tree
와 CSSOM Tree
를 합쳐 Render Tree
를 생성한다.Construction
이라고 한다. Render Tree
에 있는 노드를 화면에 배치한다. Render Tree
에 있는 노드의 UI를 그린다.z-index
에 맞게 순서대로 구성한다.Operation
이라고 한다.