ํฐ์คํ ๋ฆฌ ๋ทฐ
[JavaScript] ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ๊ณผ์
๊ฐ๋ฐ๊ฐ๊ตด๐ธ 2022. 8. 9. 17:30์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ถ์ผ๋ ์น ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ๋์ํ๋ ์นํ์ด์ง/์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์ ๋๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ OS๋ VM์์์ ์คํ๋๋ ๋ฐ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ธ๋ผ์ฐ์ ์์ HTML, CSS์ ํจ๊ป ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ ๊ณ ๋ คํ ๋ ํจ์จ์ ์ธ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ HTML, CSS, JS๋ก ์์ฑ๋ ํ ์คํธ ๋ฌธ์๋ฅผ ํ์ฑ(ํด์)ํ์ฌ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋งํฉ๋๋ค.
- ํ์ฑ : ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฌธ๋ฒ์ ๋ง๊ฒ ์์ฑ๋ ํ ์คํธ ๋ฌธ์๋ฅผ ์ฝ์ด ๋ค์ฌ ์คํํ๊ธฐ ์ํด ํ ์คํธ ๋ฌธ์์ ๋ฌธ์์ด ํ ํฐ์ผ๋ก ๋ถํดํ๊ณ , ํ ํฐ์ ๋ฌธ๋ฒ์ ์๋ฏธ์ ๊ตฌ์กฐ๋ฅผ ๋ฐ์ํ์ฌ ํธ๋ฆฌ ๊ตฌ์กฐ์ ์๋ฃ๊ตฌ์กฐ์ธ ํ์ค ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ ์ผ๋ จ์ ๊ณผ์
- ๋ ๋๋ง : HTML, CSS, JS๋ก ์์ฑ๋ ๋ฌธ์๋ฅผ ํ์ฑํ์ฌ ๋ธ๋ผ์ฐ์ ์ ์๊ฐ์ ์ผ๋ก ์ถ๋ ฅํ๋ ๊ฒ
๋ธ๋ผ์ฐ์ ๊ฐ ๋ ๋๋ง๋๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ๋ธ๋ผ์ฐ์ ๋ HTML, CSS, JS, ์ด๋ฏธ์ง, ํฐํธ ํ์ผ ๋ฑ ๋ ๋๋ง์ ํ์ํ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ณ ์๋ฒ๋ก๋ถํฐ ์๋ต์ ๋ฐ์
2. ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ์์ง์ ์๋ฒ๋ก๋ถํฐ ์๋ต๋ HTML๊ณผ CSS๋ฅผ ํ์ฑํ์ฌ DOM๊ณผ CSSOM์ ์์ฑํ๊ณ ์ด๋ค์ ๊ฒฐํฉํ์ฌ ๋ ๋ ํธ๋ฆฌ๋ฅผ ์์ฑ
3. ๋ธ๋ผ์ฐ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์๋ฒ๋ก๋ถํฐ ์๋ต๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฑํ์ฌ AST(Abstract Syntax Tree)๋ฅผ ์์ฑํ๊ณ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ์ฌ ์คํ
- ์๋ฐ์คํฌ๋ฆฝํธ๋ DOM API๋ฅผ ํตํด DOM์ด๋ CSSOM์ ๋ณ๊ฒฝํ ์ ์์
- ๋ณ๊ฒฝ๋ DOM๊ณผ CSSOM์ ๋ค์ ๋ ๋ ํธ๋ฆฌ๋ก ๊ฒฐํฉ
4. ๋ ๋ ํธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก HTML ์์์ ๋ ์ด์์์ ๊ณ์ฐํ๊ณ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ HTML ์์๋ฅผ ํ์ธํ
์์ฒญ๊ณผ ์๋ต
๋ธ๋ผ์ฐ์ ์ ํต์ฌ ๊ธฐ๋ฅ์ ํ์ํ ๋ฆฌ์์ค๋ฅผ ์๋ฒ์ ์์ฒญ(request)ํ๊ณ ์๋ฒ๋ก๋ถํฐ ์๋ต(response)๋ฐ์ ๋ธ๋ผ์ฐ์ ์ ์๊ฐ์ ์ผ๋ก ๋ ๋๋งํ๋ ๊ฒ์ ๋๋ค. ์ฆ, ๋ ๋๋ง์ ํ์ํ ๋ฆฌ์์ค๋ ๋ชจ๋ ์๋ฒ์ ์กด์ฌํ๋ฏ๋ก ํ์ํ ๋ฆฌ์์ค๋ฅผ ์๋ฒ์ ์์ฒญํ๊ณ ์๋ฒ๊ฐ ์๋ตํ ๋ฆฌ์์ค๋ฅผ ํ์ฑํ์ฌ ๋ ๋๋ง ํ๋๊ฒ์ ๋๋ค.
์๋ฒ์ ์์ฒญ์ ์ ์กํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ ์ฃผ์์ฐฝ์ URL์ ์ ๋ ฅํ๊ณ ์ํฐ ํค๋ฅผ ๋๋ฅด๋ฉด URL์ ํธ์คํธ ์ด๋ฆ์ด *DNS๋ฅผ ํตํด IP ์ฃผ์๋ก ๋ณํ๋๊ณ ์ด IP ์ฃผ์๋ฅผ ๊ฐ๋ ์๋ฒ์๊ฒ ์์ฒญ์ ์ ์กํฉ๋๋ค.
*DNS : ๋๋ฉ์ธ ์ด๋ฆ ์์คํ . ์ฌ๋์ด ์ฝ์ ์ ์๋ ๋๋ฉ์ธ ์ด๋ฆ์ ๋จธ์ ์ด ์ฝ์ ์ ์๋ IP ์ฃผ์๋ก ๋ณํ
์๋ฅผ ๋ค์ด poiemaweb.com์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ์๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์ https://poiemaweb.com ์ ์ ๋ ฅํ๊ณ ์ํฐ ํค๋ฅผ ๋๋ฅด๋ฉด *๋ฃจํธ ์์ฒญ์ด poiemaweb.com ์๋ฒ๋ก ์ ์ก
- ์๋ฒ๋ ๋ฃจํธ ์์ฒญ์ ๋ํด ์๋ฒ์ ๋ฃจํธ ํด๋์ ์กด์ฌํ๋ ์ ์ ํ์ผ index.html์ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )๋ก ์๋ต
- index.html์ด ์๋ ๋ค๋ฅธ ์ ์ ํ์ผ์ ์๋ฒ์ ์์ฒญํ๋ ค๋ฉด ๋ธ๋ผ์ฐ์ ์ ์ฃผ์์ฐฝ์ ์์ฒญํ ์ ์ ํ์ผ์ ๊ฒฝ๋ก์ ํ์ผ ์ด๋ฆ์ URL ํธ์คํธ ๋ค์ ํจ์ค์ ๊ธฐ์ ํ์ฌ ์๋ฒ์ ์์ฒญํจ (ex. https://poiemaweb.com/assets/data/data.json)
- ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ๋์ ์ผ๋ก ์๋ฒ์ ์ ์ /๋์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ์๋ ์์(ajax, REST API)
*๋ฃจํธ ์์ฒญ : /, ์คํด๊ณผ ํธ์คํธ๋ง์ผ๋ก ๊ตฌ์ฑ๋ URL์ ์ํ ์์ฒญ. ๋ฃจํธ ์์ฒญ์๋ ๋ช ํํ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ ๋ด์ฉ์ด ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์๋ฒ๋ ๋ฃจํธ ์์ฒญ์ ๋ํด ์๋ฌต์ ์ผ๋ก index.html์ ์๋ตํ๋๋ก ๊ธฐ๋ณธ ์ค์ ์ด ๋์ด ์์
๋ค์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ธ๋ผ์ฐ์ ๊ฐ poiemaweb.com ์๋ฒ์ ์์ฒญํ ๋ด์ฉ๊ณผ ์๋ฒ๊ฐ ์๋ตํ ๋ด์ฉ์ ๊ฐ๋ฐ์ ๋๊ตฌ์ Network ํจ๋์์ ํ์ธํ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ์์ง์ HTML(index.html)์ ํ์ฑํ๋ ๋์ค ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ๋ ํ๊ทธ๋ฅผ ๋ง๋๋ฉด HTML์ ํ์ฑ์ ์ผ์ ์ค๋จํ๊ณ ํด๋น ๋ฆฌ์ค์ ํ์ผ์ ์๋ฒ๋ก ์์ฒญํ๊ธฐ ๋๋ฌธ์ index.html๋ฟ๋ง ์๋๋ผ CSS,JS,์ด๋ฏธ์ง, ํฐํธ ํ์ผ ๋ฑ ์์ฒญํ์ง ์์ ๋ฆฌ์์ค๋ค๋ ํจ๊ป ์๋ต๋ฉ๋๋ค.
HTTP 1.1๊ณผ HTTP 2.0
HTTP๋ ์น์์ ๋ธ๋ผ์ฐ์ ์ ์๋ฒ๊ฐ ํต์ ํ๊ธฐ ์ํ ํ๋กํ ์ฝ(๊ท์ฝ)์ ๋๋ค. 1989๋ HTTP, URL๊ณผ ํจ๊ป ํ ๋ฒ๋์ค ๋ฆฌ ๊ฒฝ์ด ๊ณ ์ํ HTTP๋ 1991๋ ์ต์ด๋ก ๋ฌธ์ํ๋์์ต๋๋ค. ์ด ๊ฐ์ด๋ฐ HTTP/1.1๊ณผ HTTP/2๋ ๋ค์๊ณผ ๊ฐ์ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
HTTP/1.1
- 1999๋ ์ ๋ฐํ
- ์ปค๋ฅ์ ๋น ํ๋์ ์์ฒญ๊ณผ ์๋ต๋ง ์ฒ๋ฆฌํ๋ฏ๋ก ์ฌ๋ฌ ๊ฐ์ ์์ฒญ๊ณผ ์๋ต์ ํ ๋ฒ์ ์ ์กํ ์ ์์
- HTML ๋ฌธ์ ๋ด์ ํฌํจ๋ ์ฌ๋ฌ ๊ฐ์ ๋ฆฌ์์ค ์์ฒญ๊ณผ ์๋ต์ด ๊ฐ๋ณ์ ์ผ๋ก ์ ์ก๋จ
- ์์ฒญํ ๋ฆฌ์์ค์ ๊ฐ์์ ๋น๋กํ์ฌ ์๋ต ์๊ฐ๋ ์ฆ๊ฐํ๋ ๋จ์ ์ด ์์
HTTP/2
- 2015๋ ์ ๋ฐํ
- ์ปค๋ฅ์ ๋น ์ฌ๋ฌ ๊ฐ์ ์์ฒญ๊ณผ ์๋ต์ด ๊ฐ๋ฅํจ
- HTTP/1.1์ ๋นํด ํ์ด์ง ๋ก๋ ์๋๊ฐ ์ฝ 50% ์ ๋ ๋น ๋ฅด๋ค๊ณ ์๋ ค์ ธ ์์
HTML ํ์ฑ๊ณผ DOM ์์ฑ
๋ธ๋ผ์ฐ์ ์ ์์ฒญ์ ์ํด ์๋ฒ๊ฐ ์๋ตํ HTML ๋ฌธ์๋ ๋ฌธ์์ด๋ก ์ด๋ฃจ์ด์ง ์์ํ ํ ์คํธ์ ๋๋ค. ๋ฐ๋ผ์ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ์์ง์ ์์ํ ํ ์คํธ์ธ HTML ๋ฌธ์๋ฅผ ๋ธ๋ผ์ฐ์ ์ ์๊ฐ์ ์ธ ํฝ์ ๋ก ๋ ๋๋งํ๊ธฐ ์ํด HTML ๋ฌธ์๋ฅผ ํ์ฑํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋ ์๋ฃ๊ตฌ์กฐ(๊ฐ์ฒด)๋ก ๋ณํํ์ฌ DOM์ ์์ฑํด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ index.html์ด ์๋ฒ๋ก๋ถํฐ ์๋ต๋์์ ๋ ํ์ฑ๋๊ณ DOM์ด ์์ฑ๋๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
<ul>
<li id="apple">Apple</li>
<li id="banana">Banana</li>
<li id="orange">Orange</li>
</ul>
<script src="app.js"></script>
</body>
</html>
- ์๋ฒ์ ์กด์ฌํ๋ HTML ํ์ผ์ด ๋ธ๋ผ์ฐ์ ์ ์์ฒญ์ ์ํด ์๋ต๋จ. ์๋ฒ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒญํ HTML ํ์ผ์ ์ฝ์ด ๋ค์ฌ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ฐ์ดํธ(2์ง์)๋ฅผ ์ธํฐ๋ท์ ๊ฒฝ์ ํ์ฌ ์๋ต
- ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ๊ฐ ์๋ตํ HTML ๋ฌธ์๋ฅผ ๋ฐ์ดํธ ํํ๋ก ์๋ต๋ฐ์ metaํ๊ทธ์ charset ์ดํธ๋ฆฌ๋ทฐํธ์ ์ํด ์ง์ ๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด๋ก ๋ณํ๋จ. (์๋ต ํค๋์ content-type: text/html; charset=utf-8๊ณผ ๊ฐ์ด ๋ด๊ฒจ ์์)
- ๋ฌธ์์ด๋ก ๋ณํ๋ HTML ๋ฌธ์๋ฅผ ์ฝ์ด ๋ค์ฌ ๋ฌธ๋ฒ์ ์๋ฏธ๋ฅผ ๊ฐ๋ ์ฝ๋์ ์ต์ ๋จ์์ธ ํ ํฐ๋ค๋ก ๋ถํด
- ๊ฐ ํ ํฐ๋ค์ ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ๋ ธ๋๋ฅผ ์์ฑํจ. (ํ ํฐ ๋ด์ฉ์ ๋ฐ๋ผ ๋ฌธ์/์์/์ดํธ๋ฆฌ๋ทฐํธ/ํ ์คํธ ๋ ธ๋๊ฐ ์์ฑ)
- HTML ๋ฌธ์๋ HTML ์์๋ค์ ์งํฉ์ผ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ HTML ์์์ ์ค์ฒฉ ๊ด๊ณ๋ฅผ ๋ฐ์ํ์ฌ ๋ชจ๋ ๋ ธ๋๋ค์ ํธ๋ฆฌ ์๋ฃ๊ตฌ์กฐ์ธ DOM(Document Object Mode)์ผ๋ก ๊ตฌ์ฑํจ
์ด์ฒ๋ผ DOM์ HTML ๋ฌธ์๋ฅผ ํ์ฑํ ๊ฒฐ๊ณผ๋ฌผ์ ๋๋ค.
CSS ํ์ฑ๊ณผ CSSOM ์์ฑ
๋ ๋๋ง ์์ง์ DOM์ ์์ฑํ๋ ๊ณผ์ ์์ CSS๋ฅผ ํ์ฑํ๊ณ CSSOM์ ์์ฑํฉ๋๋ค.
- ๋ ๋๋ง ์์ง์ HTML์ ์ฒ์๋ถํฐ ํ ์ค์ฉ ์์ฐจ์ ์ผ๋ก ํ์ฑํ์ฌ DOM์ ์์ฑํด ๋๊ฐ๋ค๊ฐ CSS๋ฅผ ๋ก๋ํ๋ link ํ๊ทธ๋ style ํ๊ทธ๋ฅผ ๋ง๋๋ฉด DOM ์์ฑ์ ์ผ์ ์ค๋จ
- link ํ๊ทธ์ href ์ดํธ๋ฆฌ๋ทฐํธ์ ์ ์ฅ๋ CSS ํ์ผ์ ์๋ฒ์ ์์ฒญํ์ฌ ๋ก๋ํ CSS ํ์ผ์ด๋ style ํ๊ทธ ๋ด์ CSS๋ฅผ HTML๊ณผ ๋์ผํ ํ์ฑ ๊ณผ์ (๋ฐ์ดํธ -> ๋ฌธ์ -> ํ ํฐ -> ๋ ธ๋ -> CSSOM)์ ๊ฑฐ์น๋ฉฐ ํด์ํ์ฌ CSSOM(CSS Object Model)์ ์์ฑ
- CSS ํ์ฑ์ ์๋ฃํ๋ฉด HTML ํ์ฑ์ด ์ค๋จ๋ ์ง์ ๋ถํฐ ๋ค์ HTML์ ํ์ฑํ๊ธฐ ์์ํ์ฌ DOM ์์ฑ์ ์ฌ๊ฐ
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ index.html์ด ์๋ฒ๋ก๋ถํฐ ์๋ต๋์์ ๋ CSS๊ฐ ํ์ฑ๋๊ณ CSSOM์ด ์์ฑ๋ฉ๋๋ค.
// HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
...
// CSS
body {
font-size: 18px;
}
ul {
list-style-type: none;
}
- ๋ ๋๋ง ์์ง์ meta ํ๊ทธ๊น์ง HTML์ ์์ฐจ์ ์ผ๋ก ํด์ํ ๋ค์, link ํ๊ทธ๋ฅผ ๋ง๋๋ฉด DOM ์์ฑ์ ์ผ์ ์ค๋จํ๊ณ link ํ๊ทธ์ href ์ดํธ๋ฆฌ๋ทฐํธ์ ์ง์ ๋ CSS ํ์ผ์ ์๋ฒ์ ์์ฒญ
- ์๋ฒ๋ก๋ถํฐ CSS ํ์ผ์ด ์๋ต๋๋ฉด ๋ ๋๋ง ์์ง์ HTML๊ณผ ๋์ผํ ํด์ ๊ณผ์ ์ ๊ฑฐ์ณ CSS๋ฅผ ํ์ฑ
- CSSOM์ CSS์ ์์์ ๋ฐ์ํ์ฌ ์์ฑ๋จ. (body ์์์ ์ ์ฉํ font-size ํ๋กํผํฐ์ ul ์์์ ์ ์ฉํ list-style-type ํ๋กํผํฐ๋ ๋ชจ๋ li ์์์ ์์)
๋ ๋ ํธ๋ฆฌ ์์ฑ
๋ ๋๋ง ์์ง์ด ์๋ฒ๋ก๋ถํฐ ์๋ต๋ฐ์ HTML๊ณผ CSS๋ฅผ ํ์ฑํ์ฌ ์์ฑ๋ DOM๊ณผ CSSOM์ ๋ ๋๋ง์ ์ํด "๋ ๋๋ง์ ์ํ ํธ๋ฆฌ ๊ตฌ์กฐ์ ์๋ฃ๊ตฌ์กฐ"์ธ ๋ ๋ ํธ๋ฆฌ๋ก ๊ฒฐํฉ๋ฉ๋๋ค.
๋ฐ๋ผ์ ๋ ๋ ํธ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ๋ ๋๋ง ๋๋ ๋ ธ๋๋ง์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ํ๋ฉด์ ๋ ๋๋ง๋์ง ์๋ ๋ ธ๋์ CSS์ ์ํด ๋นํ์๋๋ ๋ ธ๋๋ค์ ํฌํจ๋์ง ์์ต๋๋ค.
์ดํ ์์ฑ๋ ๋ ๋ ํธ๋ฆฌ๋ ๊ฐ HTML ์์์ ๋ ์ด์์์ ๊ณ์ฐํ๋๋ฐ ์ฌ์ฉ๋๋ฉฐ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ํฝ์ ์ ๋ ๋๋งํ๋ ํ์ธํ ์ฒ๋ฆฌ์ ์ ๋ ฅ๋ฉ๋๋ค.
์ด๋ฌํ ๋ ๋๋ง ๊ณผ์ ์ ๋ฐ๋ณตํด์ ์คํ๋ ์ ์์ต๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์ ์ํ ๋ ธ๋ ์ถ๊ฐ ๋๋ ์ญ์
- ๋ธ๋ผ์ฐ์ ์ฐฝ์ ๋ฆฌ์ฌ์ด์ง์ ์ํ ๋ทฐํฌํธ ํฌ๊ธฐ ๋ณ๊ฒฝ
- HTML ์์์ ๋ ์ด์์์ ๋ณ๊ฒฝ์ ๋ฐ์์ํค๋ ์คํ์ผ ๋ณ๊ฒฝ (width/height, margin, padding ๋ฑ)
๋ฆฌ๋ ๋๋ง์ ๋ ์ด์์ ๊ณ์ฐ๊ณผ ํ์ธํ ์ ๋ค์๊ฒ ๋์ด ๋น์ฉ์ด ๋ง์ด ๋ค๊ณ ์ฑ๋ฅ์ ์ ์ํฅ์ ์ฃผ๋ ์์ ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๊ธ์
๋ฆฌ๋ ๋๋ง์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ํ์ฑ๊ณผ ์คํ
์๋ฐ์คํฌ๋ฆฝํธ ํ์ฑ๊ณผ ์คํ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฒ๋ฆฌํฉ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํ์ฑํ์ฌ CPU๊ฐ ์ดํดํ ์ ์๋ ์ ์์ค ์ธ์ด๋ก ๋ณํํ๊ณ ์คํํ๋ ์ญํ
- ๊ตฌ๊ธ ํฌ๋กฌ, Node.js, V8, ํ์ด์ดํญ์ค์ SpiderMonkey, ์ฌํ๋ฆฌ์ JavaScriptCore ๋ฑ
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ECMAScript ์ฌ์์ ์ค์
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ ๋๋ง ์์ง์ผ๋ก๋ถํฐ ์ ์ด๊ถ์ ๋๊ฒจ๋ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํด์ํ์ฌ AST(์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ)๋ฅผ ์์ฑํด AST๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธํฐํ๋ฆฌํฐ๊ฐ ์คํํ ์ ์๋ ์ค๊ฐ ์ฝ๋์ธ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์คํํฉ๋๋ค.
ํ ํฌ๋์ด์ง(tokenizing)
๋จ์ํ ๋ฌธ์์ด์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์์ค์ฝ๋๋ฅผ ์ดํ ๋ถ์ํ์ฌ ๋ฌธ๋ฒ์ ์๋ฏธ๋ฅผ ๊ฐ๋ ์ฝ๋์ ์ต์ ๋จ์์ธ ํ ํฐ๋ค๋ก ๋ถํดํ๋
๊ณผ์ ์ ๋๋ค. (๋ ์ฑ์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ์ง๋ง ํ ํฌ๋์ด์ง๊ณผ๋ ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์์)
ํ์ฑ(parsing)
ํ ํฐ๋ค์ ์งํฉ์ ๊ตฌ๋ฌธ ๋ถ์ํ์ฌ AST(์ถ์์ ๊ตฌ๋ฌธ ํธ๋ฆฌ)๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ๋๋ค.
AST๋ ํ ํฐ์ ๋ฌธ๋ฒ์ ์๋ฏธ์ ๊ตฌ์กฐ๋ฅผ ๋ฐ์ํ ํธ๋ฆฌ ๊ตฌ์กฐ์ ์๋ฃ๊ตฌ์กฐ๋ก, AST๋ฅผ ์ฌ์ฉํ๋ฉด TypeScript, Babel, Prettier ๊ฐ์ ํธ๋์คํ์ผ๋ฌ๋ฅผ ๊ตฌํํ ์๋ ์์ต๋๋ค.
*AST Explorer ์น์ฌ์ดํธ(https://astexplorer.net)์ ๋ฐฉ๋ฌธํ๋ฉด ๋ค์ํ ์คํ์์ค ์๋ฐ์คํฌ๋ฆฝํธ ํ์๋ฅผ ์ฌ์ฉํด AST๋ฅผ ์์ฑํด ๋ณผ ์ ์์
๋ฐ์ดํธ์ฝ๋ ์์ฑ๊ณผ ์คํ
ํ์ฑ์ ๊ฒฐ๊ณผ๋ฌผ๋ก์ ์์ฑ๋ AST๋ ์ธํฐํ๋ฆฌํฐ๊ฐ ์คํํ ์ ์๋ ์ค๊ฐ ์ฝ๋์ธ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํ๋๊ณ ์ธํฐํ๋ฆฌํฐ์ ์ํด ์คํ๋ฉ๋๋ค.
- V8 ์์ง์ ๊ฒฝ์ฐ ์์ฃผ ์ฌ์ฉ๋๋ ์ฝ๋๋ ํฐ๋ณดํฌ์ด๋ผ ๋ถ๋ฆฌ๋ ์ปดํ์ผ๋ฌ์ ์ํด ์ต์ ํ๋ ๋จธ์ ์ฝ๋๋ก ์ปดํ์ผ๋์ด ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค. ๋ง์ฝ ์ฝ๋์ ์ฌ์ฉ ๋น๋๊ฐ ์ ์ด์ง๋ฉด ๋ค์ ๋์ตํฐ๋ง์ด์งํ๊ธฐ๋ ํฉ๋๋ค.
๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์์ DOM API์ ์ฌ์ฉํ์ฌ DOM๊ณผ CSSOM์ด ๋ณ๊ฒฝ๋๋ฉด DOM๊ณผ CSSOM์ ๋ค์ ๋ ๋ ํธ๋ฆฌ๋ก ๊ฒฐํฉ๋๊ณ ๋ณ๊ฒฝ๋ ๋ ๋ ํธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ์ด์์๊ณผ ํ์ธํธ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ธ๋ผ์ฐ์ ์ ํ๋ฉด์ ๋ค์ ๋ ๋๋งํฉ๋๋ค.
์ด๋ฌํ ๊ณผ์ ์ ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๋ผ๊ณ ํฉ๋๋ค.
- ๋ฆฌํ๋ก์ฐ(reflow) : ๋ ์ด์์ ๊ณ์ฐ์ ๋ค์ ํ๋ ๊ฒ. (๋ ธ๋ ์ถ๊ฐ/์ญ์ , ์์์ ํฌ๊ธฐ/์์น ๋ณ๊ฒฝ, ์๋์ฐ ๋ฆฌ์ฌ์ด์ง ๋ฑ)
- ๋ฆฌํ์ธํธ(repaint) : ์ฌ๊ฒฐํฉ๋ ๋ ๋ ํธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ ํ์ธํธ๋ฅผ ํ๋ ๊ฒ
๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๊ฐ ๋ฐ๋์ ์์ฐจ์ ์ผ๋ก ๋์์ ์คํ๋๋ ๊ฒ์ ์๋๋ฉฐ, ๋ ์ด์์์ ์ํฅ์ด ์๋ ๋ณ๊ฒฝ์ ๋ฆฌํ๋ก์ฐ ์์ด ๋ฆฌํ์ธํธ๋ง ์คํ๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ํ์ฑ์ ์ํ HTML ํ์ฑ ์ค๋จ
๋ ๋๋ง ์์ง๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ง๋ ฌ์ ์ผ๋ก ํ์ฑ์ ์ํํฉ๋๋ค.
์ด์ฒ๋ผ ๋ธ๋ผ์ฐ์ ๋ ๋๊ธฐ์ ์ผ๋ก(์์์ ์๋ ๋ฐฉํฅ์ผ๋ก ์์ฐจ์ ์ผ๋ก) HTML, CSS, JS๋ฅผ ํ์ฑํ๊ณ ์คํํฉ๋๋ค. ์ด๊ฒ์ script ํ๊ทธ์ ์์น์ ๋ฐ๋ผ HTML ํ์ฑ์ด ๋ธ๋กํน๋์ด DOM ์์ฑ์ด ์ง์ฐ๋ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ script ํ๊ทธ์ ์์น๋ ์ค์ํ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์๋์ ์์ ์ ๊ฒฝ์ฐ app.js์ ํ์ฑ๊ณผ ์คํ ์ด์ ๊น์ง๋ DOM์ ์์ฑ์ด ์ผ์ ์ค๋จ๋ฉ๋๋ค. ์ด๋, app.js์ ์ฝ๋์์ DOM์ด๋ CSSOM์ ๋ณ๊ฒฝํ๋ DOM API๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, DOM๊ณผ CSSOM์ ์์ฑ์ด ์๋ฃ๋์ง ์์ ์ํ๋ผ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
<script>
/*
DOM API์ธ document.getElementById๋ DOM์์ id๊ฐ 'apple'์ธ HTML ์์๋ฅผ
์ทจ๋ํ๋ค. ์๋ DOM API๊ฐ ์คํ๋๋ ์์ ์๋ ์์ง id๊ฐ 'apple'์ธ HTML ์์๋ฅผ ํ์ฑํ์ง
์์๊ธฐ ๋๋ฌธ์ DOM์๋ id๊ฐ 'apple'์ธ HTML ์์๊ฐ ํฌํจ๋์ด ์์ง ์๋ค.
๋ฐ๋ผ์ ์๋ ์ฝ๋๋ ์ ์์ ์ผ๋ก id๊ฐ 'apple'์ธ HTML ์์๋ฅผ ์ทจ๋ํ์ง ๋ชปํ๋ค.
*/
const $apple = document.getElementById('apple');
// id๊ฐ 'apple'์ธ HTML ์์์ css color ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝํ๋ค.
// ์ด๋ DOM์๋ id๊ฐ 'apple'์ธ HTML ์์๊ฐ ํฌํจ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
$apple.style.color = 'red'; // TypeError: Cannot read property 'style' of null
</script>
</head>
<body>
<ul>
<li id="apple">Apple</li>
<li id="banana">Banana</li>
<li id="orange">Orange</li>
</ul>
</body>
</html>
๋ฐ๋ผ์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํํผํ๊ธฐ ์ํด body ์์์ ๊ฐ์ฅ ์๋์ ์๋ฐ์คํฌ๋ฆฝํธ(<script>)๋ฅผ ์์น์ํค๋ ๊ฒ์ด ์ข์ต๋๋ค.
- DOM์ด ์์ฑ๋์ง ์์ ์ํ์์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ DOM์ ์กฐ์ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์
- ์๋ฐ์คํฌ๋ฆฝํธ ๋ก๋ฉ/ํ์ฑ/์คํ์ผ๋ก ์ธํด HTML ์์๋ค์ ๋ ๋๋ง์ ์ง์ฅ๋ฐ๋ ์ผ์ด ๋ฐ์ํ์ง ์์ ํ์ด์ง ๋ก๋ฉ ์๊ฐ์ด ๋จ์ถ๋จ
script ํ๊ทธ์ async/defer ์ดํธ๋ฆฌ๋ทฐํธ
์๋ฐ์คํฌ๋ฆฝํธ ํ์ฑ์ ์ํ DOM ์์ฑ์ด ์ค๋จ(๋ธ๋กํน)๋๋ ๋ฌธ์ ๋ฅผ ๊ทผ๋ณธ์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํด HTML5๋ถํฐ script ํ๊ทธ์ async์ defer ์ดํธ๋ฆฌ๋ทฐํธ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
async์ defer ์ดํธ๋ฆฌ๋ทฐํธ๋ ๋ค์๊ณผ ๊ฐ์ด scr ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ํตํด ์ธ๋ถ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ก๋ํ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ ์ ์์ด ์ธ๋ผ์ธ ์๋ฐ์คํฌ๋ฆฝํธ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
<script async src="extern.js"></script>
<script defer src="extern.js"></script>
async์ defer ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ฉํ๋ฉด HTML ํ์ฑ๊ณผ ์ธ๋ถ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ก๋๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ๋์์ ์งํ๋๋ค๋ ๊ณตํต์ ์ด ์์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ์ ์คํ ์์ ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
async ์ดํธ๋ฆฌ๋ทฐํธ
- HTML ํ์ฑ๊ณผ ์ธ๋ถ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ก๋๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ๋์์ ์งํ
- ์๋ฐ์คํฌ๋ฆฝํธ ํ์ฑ๊ณผ ์คํ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ก๋๊ฐ ์๋ฃ๋ ์งํ์ ์งํ๋๋ฉฐ, ์ด๋ HTML ํ์ฑ์ด ์ค๋จ๋จ
- ์์๊ฐ ๋ณด์ฅ๋์ง ์์ (script ํ๊ทธ์ ์์์๋ ์๊ด์์ด ๋ก๋๊ฐ ์๋ฃ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ถํฐ ๋จผ์ ์คํ)
- IE10 ์ด์์์ ์ง์
defer ์ดํธ๋ฆฌ๋ทฐํธ
- HTML ํ์ฑ๊ณผ ์ธ๋ถ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ก๋๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ๋์์ ์งํ
- ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ฑ๊ณผ ์คํ์ HTML ํ์ฑ์ด ์๋ฃ๋ ์งํ, ์ฆ DOM ์์ฑ์ด ์๋ฃ๋ ์งํ์ ์งํ๋จ
- DOM ์์ฑ์ด ์๋ฃ๋ ์ดํ ์คํ๋์ด์ผ ํ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์ฉํจ
- IE10 ์ด์์์ ์ง์
[์ถ์ฒ] ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive
'JavaScript > ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] ์ด๋ฒคํธ (0) | 2022.08.13 |
---|---|
[JavaScript] DOM (0) | 2022.08.12 |
[JavaScript] Set๊ณผ Map (0) | 2022.08.07 |
[JavaScript] ๋์คํธ๋ญ์ฒ๋ง ํ ๋น (0) | 2022.08.06 |
[JavaScript] ์คํ๋ ๋ ๋ฌธ๋ฒ (0) | 2022.08.05 |
- Total
- Today
- Yesterday
- 2019 ์นด์นด์ค ๊ฐ๋ฐ์ ๊ฒจ์ธ ์ธํด
- ์๋ฐ์คํฌ๋ฆฝํธ
- ๋คํธ์ํฌ
- ํ๋กํ ์ฝ
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ฐฑ์ค node.js
- fp
- JavaScript
- ๋ฐฑ์ค
- ํฌํฌ์ธํฐ
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- ์ด๋ถํ์
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- map
- ์ ์ญ ๋ณ์
- ํ๋กํผํฐ
- ์๊ณ ๋ฆฌ์ฆ
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ deep dive
- ๋ฐฑ์ค javascript
- TDD
- ์ฝ๋ฉํ ์คํธ
- http
- ์นด์นด์ค ์ธํด
- ๋์์ธ ํจํด
- ์ด์์ฒด์
- git
- ์๋ฐ
- Baekjoon
- ๋ ์์ปฌ ํ๊ฒฝ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |