๋ธ๋ผ์ฐ์ ๋ ๋๋ง
๐ ๋ธ๋ผ์ฐ์ ๋?
๋ธ๋ผ์ฐ์ ๋ ๋๊ธฐ(Synchronous)์ ์ผ๋ก (HTML + CSS), Javascript ์ธ์ด๋ฅผ ํด์ํ์ฌ ๋ด์ฉ์ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ์์ฉ ์ํํธ์จ์ด์ ๋๋ค.
๋ธ๋ผ์ฐ์ ์ ์ฃผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉ์๊ฐ ์ํ๋ ์ ๋ณด๋ฅผ ์๋ฒ์ ์์ฒญํ๊ณ ๋ธ๋ผ์ฐ์ ์ ํ์ํ๋๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ์ํ๋ ์ ๋ณด์ ์ข ๋ฅ๋ ํฌ๊ฒ Html , img, pdf ๋ฑ์ ๋๋ค. ์ฌ๊ธฐ์ ์ ๋ณด์ ์ข ๋ฅ ํนํ๋ Html์ ๊ตฌ๋ถํ๋ ๊ฒ์ ์ฃผ์๋ผ๊ณ ํ๋ฉฐ, ์ด๋ Url(Uniform Resource Locator) ์ด๋ผ๊ณ ํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์ ์ข
๋ฅ์๋ ํฌ๋กฌ, ์ฌํ๋ฆฌ, ํ์ด์ดํญ์ค (์คํ์์ค ๊ธฐ๋ฐ) , ๋ค์ด๋ฒ ์จ์ผ ๋ฑ๋ฑ ๋ค์ํ ์ข
๋ฅ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์กด์ฌํฉ๋๋ค.
์ต๊ทผ ์ ์ ๋ค์ ๋ธ๋ผ์ฐ์ ์ ์ ์จ ์
๋๋ค. ํฌ๋กฌ๊ณผ ์ฌํ๋ฆฌ๊ฐ ๋๋ถ๋ถ์ ์ฐจ์งํ๋๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
๋ธ๋ผ์ฐ์ ์ ๊ตฌ์ฑ์์
๋ธ๋ผ์ฐ์ ์ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๊ฐ ์์ง๋ง ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ ์ ์ค์ฌ์ด ๋๋ ์์๋ค์ ์ค์ฌ์ผ๋ก ์์ฑํ๊ฒ ์ต๋๋ค.

1. User Interface
์ฃผ์ ํ์์ค , ์ด์ ์์ผ๋ก ๊ฐ๊ธฐ ๋ฒํผ, ์ฆ๊ฒจ์ฐพ๊ธฐ, ์ค์ , ์ฐฝ ๋๊ธฐ, ํ , ๋ฑ๋ฑ ํ์ด์ง ์ ๋ณด๋ฅผ ํ์ํ๋ ์ฐฝ์ ์ ์ธํ ๋ชจ๋ ๋ถ๋ถ์ ๋๋ค. ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ๋ค์ ์๋ก ๊ฒฝ์๊ณผ ๋ฐ์ ์ ํตํด์ ์ด๋ ์ ๋ ์ ์ฌํ ๋์์ธ์ ๊ฐ์ง๊ฒ ๋์์ต๋๋ค.
2. Browser Engine
User Interface์ Rendering Engine ์ฌ์ด์ ๋์์ ์ ์ดํด์ฃผ๋ ์์ง์ ๋๋ค.
3. Rendering Engine
์น์์ ๋ ๋๋ง ์์ง์ ์ญํ ์ ์์ฒญ ๋ฐ์ ๋ด์ฉ์ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ Render ์ํค๋ ์ญํ ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ํฌ๋กฌ, ์ฌํ๋ฆฌ๋ฑ์ webkit ์์ง์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
3-1. Rendering Engine ์ ๊ฐ๋ต์ ์ธ ๋์์๋ฆฌ

๋ค์์ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ์์ง์ด Render ์ํค๋ ๋์ ์์๋ฅผ ๊ฐ๋ตํ ํํํ ๊ฒ์ด๋ค. ๋ ๋๋ง ์์ง์ ์๋ฒ๋ก ๋ถํฐ ์ ๋ฌ๋ฐญ์ Html๋ฌธ์๋ฅผ ํ์ฑํ๊ณ DOM(Document Object Model) tree๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ css ์์๋ฅผ ์ ์ฉ์ํค๊ธฐ ์ํด ๋ง์ฐฌ๊ฐ์ง๋ก CSSOM(Cascading Style Sheets Object Model)tree ๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๋ ๋ ํธ๋ฆฌ๋ฅผ ๋งค์นญ ์์ผ Render tree๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ ํ ํ๋ฉด์ Render tree๋ฅผ ํตํด ๊ตฌ์ฑํ ์์๋ค์ด ํ๋ฉด์ ์ ํํ ๋ฐฐ์น ๋ ์์น๋ฅผ ์ ํ๊ณ , ์ ํด์ง ์์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด์ render ํฉ๋๋ค. ์ฌ๊ธฐ์ Render tree์๋ ํ๋ฉด์ ์ง์ ์ ์ผ๋ก ํ์๊ฐ ๋ ์์๋ค๋ง์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ css ์์ฑ์ผ๋ก visibility : hidden;์ธ ์์๋ ๊ด์ฐฎ์ง๋ง display: none ์ Render tree์์ ์ ์ธ๋ฉ๋๋ค.
3-2. Html๋ฌธ์๋ฅผ ํ์ฑํ๋ ์ค scriptํ๊ทธ๋ฅผ ๋ง๋๋ค๋ฉด?
Html ๋ฌธ์๋ฅผ ํ์ฑํ๋์ค
<script></script>
ํ๊ทธ๋ฅผ ๋ง๋๊ฒ ๋๋ค๋ฉด Html ๋ฌธ์์ ํ์ฑ์ ์ค๋จํ๊ณ js ํ์ผ์ ๋ก๋ํ๊ฒ ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ html๋ฌธ์๋ฅผ ํ์ฑํ๋ ๊ณผ์ ์ ์์ด์ 2๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
- html๋ฌธ์๋ฅผ ํ์ฑํ๋ค๊ฐ script ํ๊ทธ๋ฅผ ๋ง๋๊ฒ ๋๋ฉด htmlํ๊ทธ๋ฅผ ํ์ฑํ๋ค๊ฐ ์ค๋จํ๊ฒ ๋๊ณ js ํ์ผ์ ๋ก๋๊ฐ ๋๋ ๋ ๊น์ง ํ๋ฉด์ ํ์๋๋ ๊ฒ์ด ์ง์ฐ๋๋ค.
- Html๋ฌธ์์ ํ์ฑ์ด ๋๋๊ธฐ ์ ์ script ํ๊ทธ๋ฅผ ๋ง๋๊ฒ ๋๋ฉด ์์ฑ๋์ง ์์ Dom์ Js๊ฐ ์ ๊ทผํ ์ ์๋ค.
๋ฐ๋ผ์ ์์ ๊ฐ์ ์ํฉ์ ํผํ๊ธฐ ์ํด script ํ๊ทธ๋ bodyํ๊ทธ์ ์ตํ๋จ์ ์์นํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํน์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก js ํ์ผ์ ๋ก๋ํ๋๊ฒ์ ์ง์ฐ์ํฌ ์ ์์ต๋๋ค.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>script load</title>
</head>
<body>
<script>
// window.onload๊ฐ ๊ฐ์ฅ ์์ ์์น!
window.onload = function () {
console.log("afterwindowload");
var target = document.querySelector("#test");
console.log(target);
};
// DOMContentLoaded๊ฐ ๋๋ฒ์งธ์ ์์น!
document.addEventListener("DOMContentLoaded", function () {
console.log("afterdomload");
var target = document.querySelector("#test");
console.log(target);
});
// ์ผ๋ฐ script ์ฝ๋๊ฐ ๊ฐ์ฅ ๋์ ์์น
console.log("๋ฐ๋ก์์");
var target = document.querySelector("#test");
console.log(target);
</script>
<div id="test">test</div>
</body>
</html>
์์ ์ฝ๋์์ ๋ณผ ์ ์๋ฏ script ํ๊ทธ๊ฐ body ํ๊ทธ์ ์์๋ถ๋ถ์ ์กด์ฌํฉ๋๋ค. ํ์ง๋ง onloadํจ์ , โDOMContentLoadedโ๋ฅผ ํตํด์ script ํ๊ทธ๋ฅผ ๋ง๋๋๋ผ๋ js ํ์ผ์ load๋ฅผ ์ง์ฐ์ํฌ ์ ์์ต๋๋ค.

์์ ๊ฐ์ด script์ ํ๋จ์ console.log์ ์ถ๋ ฅ์ ๋ณด๋ฉด null๋ก ๋์ค๊ฒ ๋ฉ๋๋ค. ํ์ง๋ง ๋ ๋ฐฉ๋ฒ์ ํตํด์ html ํ์ฑ์ด ๋๋ ํ ์์์ ์ ๊ทผ ํ๊ธฐ ๋๋ฌธ์ querySelector๋ฅผ ํตํด์ ์ ๊ทผํ div ํ๊ทธ๋ฅผ ์ถ๋ ฅํ ์ ์์ต๋๋ค.
3-3. DOM tree์ CSSOM tree ์ ์์ฑ
HTML ๋ฌธ์์ ํ์ฑ์ด ์ ์์ ์ผ๋ก ๋ง๋ฌด๋ฆฌ ๋์๋ค๋ฉด, ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋ ๋๋ง ์์ง์ DOM tree๋ฅผ ์์ฑํฉ๋๋ค.
- DOM tree
- CSSOM tree
3-4. Render tree ๊ตฌ์ถ
- Render tree (DOM + CSSOM)
Render tree ์์๋ display:none์ด ๋ ์์๋ ํฌํจ๋์ง ์์ต๋๋ค.
3-5. Render tree ๋ฐฐ์น
๊ตฌ์ถ๋ Render tree๋ฅผ ํ๋ฉด์ ๋ฐฐ์น๋ ์์น๋ฅผ ์ ํฉ๋๋ค.(Layout)
3-6. Render tree ๊ทธ๋ฆฌ๊ธฐ
์ ํด์ง ์์น์ ๋ฐ๋ผ์ Render tree๋ฅผ ๊ทธ๋ฆฝ๋๋ค.(painting)
4. Javascript Engine
์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด๋ฅผ ํด์ํ๊ณ ์คํ์ํต๋๋ค. ๊ฐ์ฅ ๋์ค์ ์ผ๋ก ํฌ๋กฌ์์ ์ฌ์ฉํ๋ v8 ์์ง์ด ์์ต๋๋ค.
๊ฐ๋จ์์ฝ
- ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ด์ ์์ง์ ํตํด์ ํน์ url์ ์ ๋ ฅํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ URL ์ฃผ์ ์ค์์ ๋๋ฉ์ธ ๋ค์(domain name) ๋ถ๋ถ์ DNS ์๋ฒ์์ ๊ฒ์ํฉ๋๋ค.
- DNS ์๋ฒ๋ ํด๋น ๋๋ฉ์ธ ๋ค์์ ํตํด์ IP์ฃผ์๋ฅผ ์ฐพ์์ ํ์ํ ์ ๋ณด(HTML ๋ฌธ์)๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ฐํํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ์์ง์ HTML ๋ฌธ์๋ฅผ ํ์ฑํฉ๋๋ค.
- ํ์ฑํ๋ ์ค scriptํ๊ทธ๋ฅผ ๋ง๋๊ฒ ๋๋ฉด ํ์ฑ์ ์ค๋จํ๊ณ jsํ์ผ์ ๋ก๋ํฉ๋๋ค.
- ํ์ฑ์ด ์ข ๋ฃ๋๋ฉด ์ด๋ฅผ ๋ฐํ์ผ๋ก DOM tree๋ฅผ ์์ฑํฉ๋๋ค.
- Link ํ๊ทธ๋ฅผ ํตํด์ stylesheet๋ฅผ ์ฐ๊ฒฐ๋ฐ๋ ๊ฒฝ์ฐ CSSOM์ ์์ฑํฉ๋๋ค.
- DOM tree + CSSOM tree => Render tree ๊ตฌ์ถ (์ฌ๊ธฐ์ ํ๋ฉด์ ๋ณด์ด์ง ์๋ ์์๋ค์ ๋ฐฐ์ ํฉ๋๋ค.)
- ๊ตฌ์ถ๋ Render tree๋ฅผ ํ๋ฉด์ ๋ฐฐ์นํฉ๋๋ค.
- ๋ฐฐ์น๋ Render tree๋ฅผ ํ๋ฉด์ ๊ทธ๋ฆฝ๋๋ค.
Reference
์์ง ๋ฐฐ์์ ๋จ๊ณ๋ผ ์ ํํ ์ ๋ณด๊ฐ ์๋ ์ ์์ต๋๋ค.๐
ํผ๋๋ฐฑ์ seoungin1228@gmail.com ์ผ๋ก ๋ถํ๋๋ฆฌ๊ฒ ์ต๋๋คโบ๏ธ
- [naver d2 ๋ธ๋ผ์ฐ์ ๋์์๋ฆฌ](https://d2.naver.com/helloworld/59361) - [์น ๋์ ๊ณผ์ ๊ณผ React์ ํ์](https://velog.io/@juno7803/React%EA%B0%80-%ED%83%9C%EC%96%B4%EB%82%9C-%EB%B0%B0%EA%B2%BD) - [How Browsers Work: Behind the scenes of modern web browsers](https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/) - [์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ](https://engineering.huiseoul.com/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9E%91%EB%8F%99%ED%95%98%EB%8A%94%EA%B0%80-v8-%EC%97%94%EC%A7%84%EC%9D%98-%EB%82%B4%EB%B6%80-%EC%B5%9C%EC%A0%81%ED%99%94%EB%90%9C-%EC%BD%94%EB%93%9C%EB%A5%BC-%EC%9E%91%EC%84%B1%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%8B%A4%EC%84%AF-%EA%B0%80%EC%A7%80-%ED%8C%81-6c6f9832c1d9) - [์น ๋์์๋ฆฌ](http://www.tcpschool.com/webbasic/works)