우리가 사이트로 이동하기 위해 브라우저에 URL 주소를 입력하게 되면 실제 페이지가 화면에 나타게 되는데
이 과정에 대해 정리하려고 한다. 📝
URL 주소를 입력하게 되면 크게 아래와 같은 과정이 발생한다.
1. 웹 서버와 연결하기
> 2. 화면 정보 요청하기
> 3. 응답 파일 해석하기
> 4. 화면 그리기
이제 이 과정들을 상세하게 파헤쳐보자. 😀
원하는 페이지를 보기 위해서는 가장 먼저, 페이지 정보를 가지고 있는 웹 서버
와 연결되어야 한다.
우리가 URL에 https://www.naver.com
과 같이 문자로 된 도메인 주소를 입력하게 되면 DNS 서버를 통해 192.168.x.x
와 같은 IP 로 변경되어 찾아간다🚶🏻
DNS 서버 💻
사용자가 입력한 도메인 네임을 인터넷 통신 규격인 IP로 바꾸어 주는 역할을 한다.
처음 방문하는 사이트의 경우 외부 DNS 서버를 통해 IP를 받아오게 되고, 로컬 DNS 서버에 저장해둔다.
서버의 주소를 알아냈다면 이제 통신을 위해 연결해야 한다. 이때 3-way Handshake
기법을 사용하게 된다. 🤝
SYN
를 보낸다.ACK
와 SYN
패킷을 보낸다.ACK
응답 신호를 보내면서 연결이 맺어진다.서버와 데이터 통신을 하기위한 연결을 맺은 후 HTML
, CSS
등과 같은 화면 정보를 요청해야 하는데 이때, HTTP & HTTPS
프로토콜을 사용하게 된다.
HTTP ( Hyper Text Transfer Protocol )
Hyper Text(HTML)을 전송하기 위한 프로토콜로 클라이언트에서request
를 보내면 서버에서response
로 응답하는 통신 구조를 갖는다.
응답받은 파일을 렌더링하기 전, Render Tree
로 만드는 과정에 대해 알아보자❗️
브라우저는 소스코드로 된 HTML 응답을 받으면 구문분석(Parsing)
을 통해 브라우저가 이해할 수 있는 Dom Tree
와 CSSOM
으로 바꿔주어야 한다.🤓
브라우저는 응답 HTML을 DOM(Document Object Model)
트리를 만든다.
DOM과 만찬가지로 CSS도 브라우저가 이해할 수 있는 형식으로 만들어야 한다.
CSSOM은 웹 페이지를 꾸미는 스타일의 총 집합니다. 색상, 크기, 위치, 배치 방법 등의 정보가 있으며 DOM과 다른 스레드에서 작업하기 때문에 서로 영향을 받지 않는다. 😃
Javascript 는 브라우저가 HTML 파싱 중 <script>
태그를 만나면 실행된다.
JS가 실행되면 DOM 구조를 변경할 수 있기 때문에 코드를 해석하고 실행이 완료될 때까지 DOM 생성을 멈추게 한다. 🫷🏻
만들어진 DOM 과 CSSOM 을 합쳐서 Render Tree
를 만들면 파싱이 끝나게 된다.
브라우저가 최종적으로 그릴 요소와 스타일 정보는 들어있지만 DOM의 script
, meta
와 CSS의 display: none
속성의 요소는 들어있지 않는다. ❌
위에서 만든 Render Tree 를 그리는 과정 Layout
> Paint
> Composite
순으로 진행된다.
실제로 화면이 그려지는 과정이기 때문에 네트워크 과정보다 시간이 더 오래 소요된다. 🕗
Layout은 웹 페이지를 기준으로 각 요소들의 크기와 위치, 간격을 결정하는 작업이다.
이 과정이 처음 일어날 때에는 Layout
이라고 하지만 특정 액션으로 인해 재계산이 되는 경우에는 Reflow
라고 부른다.
Reflow
Reflow 가 발생하면paint
와Composite
이 다시 이루어지기 때문에 계산이 가장 많이 든다.
Paint는 텍스트, 색상, 테두리, 그림자 등 요소의 시각적 부분을 화면에 그리는 과정이다.
Reflow 가 발생해서 다시 paint 하는 것을 RePaint
라고 한다.
Layout 과정 중 HTML, CSS 속성에 따라 요소들이 서로 다른 레이어에 그려질 때가 있다.
보통 <video>
, <canvas>
태그나 CSS의 position
, z-index
속성에 의해 발생한다.
이렇게 레이어가 2개 이상 생성될 때, 각 레이어를 하나로 합치는 과정을 Composite
라고 한다.
이벤트가 발생해서 화면이 다시 그려져야 할 경우에는 Javascript
가 DOM
을 직접적으로 변경하게 되고 새로운 Render Tree
가 만들어져 그려지게 된다. ( with. Reflow & RePainting )
이는 시간이 오래걸리는 작업임으로 성능에 큰 영향을 끼치게 되므로
개발을 할 때 특히 더 신경써야 한다.
<script>
// 클릭 하게되면 ul 태그 안에 li 태그를 넣어주기때문에
// 총 3천번의 RePainting 이 발생하게 된다.
// 실행시간: 4,500 ms
const onClick = () =>{
const $ul = document.getElementById('ul')
for(let i = 0; i < 3000; i++){
$ul.innerHTML += `<li>${i}</li>`; // ❌
}
}
</script>
<body>
<button onClick="onClick()">리스트 추가하기</button>
<ul id="ul></ul>
</body>
<script>
// 업데이트 할 내용을 모아 한번만 반영한다.
// 실행시간: 250 ms
const onClick = () =>{
const $ul = document.getElementById('ul')
let list = ""
for(let i = 0; i < 3000; i++){
list += `<li>${i}</li>`;
}
$ul.innerHTML = list // ⭕️
}
</script>
<body>
<button onClick="onClick()">리스트 추가하기</button>
<ul id="ul></ul>
</body>
React JS 는 별도의 렌더링 프로세스를 가지고 있어 이러한 작업을 자동적으로 처리해준다.