๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ, ๋ ๋๋ง ๊ณผ์ ์ดํดํ๊ธฐ
๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ, ๋ ๋๋ง ๊ณผ์ ์ดํดํ๊ธฐ ๊ด๋ จ
์น ๋ธ๋ผ์ฐ์ (Web Browser)๋ ์น์์ ํ์ด์ง๋ฅผ ๊ฒ์ํ๊ณ ํ์ํ๋ฉฐ, ์ฌ์ฉ์๊ฐ ์ธํฐ๋ท์์ ๋ค์ํ ์ ๋ณด๋ฅผ ํ์ํ๊ณ ์ํธ์์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋๋ค. ์์ฃผ ์ฌ์ฉ๋๋ ๋ธ๋ผ์ฐ์ ์๋ Google Chrome, Microsoft Edge, Safari ๋ฑ์ด ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ๋จ์ํ ์น ํ์ด์ง๋ฅผ ๋ณด๋ ๋๊ตฌ๊ฐ ์๋๋๋ค. ์น ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ฌ์ฉ์์๊ฒ ์ ๋ณด๋ฅผ ํ์ํ๊ณ , ๋ค์ํ ์ํธ์์ฉ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ค์ํ ํ๋ซํผ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ํฌ๊ฒ ์ฌ์ฉ์ ์ธํฐํ์ด์ค(์ฃผ์์ฐฝ, ๋ค๋ก ๊ฐ๊ธฐ ๋ฑ), ๋ ๋๋ง ์์ง, Javascript ์์ง, ๋คํธ์ํน, ๋ฐ์ดํฐ ์ ์ฅ์ ๋ฑ์ผ๋ก ๊ตฌ๋ถํ ์ ์๋๋ฐ์. ์ด ์ค์์ ์ด๋ฒ์ ๋ค๋ฃฐ ๋ด์ฉ์ ๋ฐ๋ก โ๋ ๋๋ง ์์งโ์ ๋๋ค.
๋ ๋๋ง(Rendering)์ด๋, ๋ธ๋ผ์ฐ์ ๊ฐ HTML, CSS, Javascript๋ฅผ ํด์ํด, ์ฐ๋ฆฌ๊ฐ ๋ณด๋ ํ๋ฉด์ ์ค์ ๋ก ๋ํ๋ด๋ ๊ณผ์ ์ ๋งํฉ๋๋ค. ๋จ์ํ ํ์ผ์ ์ฝ๋ ๊ฒ๋ง ์๋๋ผ, ์น ํ์ด์ง์ ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ๊ณ ์คํ์ผ๊ณผ ์คํฌ๋ฆฝํธ๋ฅผ ๊ณ์ฐํ๋ฉฐ, ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ ํฝ์ ๋จ์์ ํ๋ฉด์ ๋ง๋ค์ด๋ด๋ ์์ฃผ ๋ณต์กํ ๊ณผ์ ์ ์๋ฏธํฉ๋๋ค. ๋ ๋๋ง ๊ณผ์ ์ ๋ธ๋ผ์ฐ์ ์ ์ฑ๋ฅ์ ์ข์ฐํ๋ฉฐ, ์ด๋ฅผ ์ดํดํ๋ฉด ์น ํ์ด์ง์ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ๋๋ง์ ์ํํ๋ ๋จ๊ณ๋ฅผ ํ๋์ฉ ์ดํด๋ณด๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ ๋๋ง์ ๋ฏธ์น๋ ์ํฅ๊ณผ ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ๊น์ง ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ๋๋ง์ ์ ์ฒด ๊ณผ์
๋ธ๋ผ์ฐ์ ๊ฐ HTML, CSS, Javascript๋ฅผ ํ๋ฉด์ ๋ํ๋ด๊ธฐ๊น์ง์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
1) HTML ํ์ฑ ๋ฐ DOM ํธ๋ฆฌ ์์ฑ
๊ฐ์ฅ ๋จผ์ ๋ธ๋ผ์ฐ์ ๋ HTML ํ์ผ์ ์ฝ๊ณ DOM(Document Object Model) ํธ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค. DOM์ HTML ๋ฌธ์์ ๊ณ์ธต์ ๊ตฌ์กฐ๋ฅผ ํํํ๋ ๊ฐ์ฒด ๋ชจ๋ธ๋ก, ๋ธ๋ผ์ฐ์ ๊ฐ HTML๋ก ์์ฑ๋ ์ฌ๋ฌ ์์๋ค์ Javascript๊ฐ ์ดํดํ๊ณ ์กฐ์ํ ์ ์๋๋ก ๋ณํ์ํจ ๊ฐ์ฒด์ ๋๋ค.
DOM์ ๋ฌธ์์ ์์๋ฅผ ํธ๋ฆฌ๊ตฌ์กฐ๋ก ํํํ๋ฉฐ, ๊ฐ ๋ ธ๋(Node)๋ HTML ํ๊ทธ๋ฅผ ๋ํ๋ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ํธ๋ฆฌ๊ตฌ์กฐ๋ฅผ โDOM ํธ๋ฆฌโ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
<!DOCTYPE html>
<html>
<body>
<div class="recipe">
<div class="dish">์ถ์ ๊ณ๋</div>
<div class="ingredients">๊ณ๋ 2๊ฐ</div>
<div class="how">15๋ถ ๋์ ๋ฌผ์โฆ</div>
</div>
</body>
</html>
์์ ์ฝ๋๋ฅผ DOM ํธ๋ฆฌ ํํ๋ก ๋ํ๋ด๋ณด๋ฉด ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ํ๋ผ ์ ์์ต๋๋ค.
DOM ํธ๋ฆฌ๋ HTML ๋ฌธ์๋ฅผ ๊ณ์ธต์ ์ผ๋ก ํํํ ํธ๋ฆฌ๊ตฌ์กฐ๋ก, HTML ๋ฌธ์์ ๊ฐ ์์(ํ๊ทธ), ์์ฑ, ํ ์คํธ๋ DOM ํธ๋ฆฌ์์ ํ๋์ ๋ ธ๋๋ก ํํ๋ฉ๋๋ค. ์ด ํธ๋ฆฌ๊ตฌ์กฐ ๋๋ถ์, ๋ถ๋ชจ-์์, ํ์ ๋ ธ๋ ๊ฐ์ ๊ด๊ณ๋ฅผ ํ์ ํ ์ ์์ผ๋ฉฐ, ์ฝ๊ฒ ์์๋ฅผ ํ์ํ๊ฑฐ๋ ์์ ํ ์ ์์ต๋๋ค.
2) CSS ํ์ฑ ๋ฐ CSSOM ํธ๋ฆฌ ์์ฑ
HTML์ ํ์ฑํด DOM ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ค๋ฉด, ์ด์ ๋ธ๋ผ์ฐ์ ๋ CSS ํ์ผ์ ์ฝ์ด CSSOM(CSS Object Model) ํธ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค. CSSOM์ ๋ธ๋ผ์ฐ์ ๊ฐ CSS๋ฅผ ํ์ฑํ์ฌ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ํํํ ๊ฐ์ฒด ๋ชจ๋ธ๋ก, HTML ๋ฌธ์์ ๊ฐ ์์์ ์ ์ฉ๋ CSS ์คํ์ผ ๊ท์น์ ๋ํ๋ด๋ฉฐ, DOM๊ณผ ๊ฒฐํฉํด ํ๋ฉด์ ํํ๋ ์ค๋น๋ฅผ ํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ CSS ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค.
.body {
padding: 30px;
}
.dish {
font-size: 20px;
}
.ingredients {
color: blue;
}
๊ทธ๋ผ CSSOM์ ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ผ ์ ์์ต๋๋ค.
3) ๋ ๋ ํธ๋ฆฌ ํ์ฑ
CSS๋ฅผ ํ์ฑํด CSSOM๊น์ง ์์ฑํ๋ค๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์ด์ DOM๊ณผ CSSOM์ ๊ฒฐํฉํด ๋ ๋ ํธ๋ฆฌ(Render Tree)๋ฅผ ์์ฑํฉ๋๋ค. ๋ ๋ ํธ๋ฆฌ๋ ํ๋ฉด์ ํ์๋ ์์๋ค๋ง ํฌํจํ๊ณ ์์ผ๋ฉฐ, ๊ฐ ์์์ ์ ์ฉ๋ ์คํ์ผ๊ณผ ์์น์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค. DOM ํธ๋ฆฌ์ CSSOM์ ๊ฒฐํฉํ ๋ ๋ ํธ๋ฆฌ๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
4) ๋ ์ด์์
๋ ๋ ํธ๋ฆฌ๊ฐ ์์ฑ๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๊ฐ ์์์ ์์น์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๋ ๋ ์ด์์(Layout) ๋จ๊ณ์ ๋ค์ด๊ฐ๋๋ค. ์ด ๊ณผ์ ์์๋ ์์๊ฐ ํ๋ฉด์์ ์ด๋์ ์์นํ ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ค ํฌ๊ธฐ๋ฅผ ๊ฐ์ง์ง ๋ฑ์ ๊ฒฐ์ ํฉ๋๋ค. ์ด ๊ธ์์ ์ฌ์ฉํ๊ณ ์๋ ์ฝ๋์์๋ body์ padding: 30px์ด ์ ์ฉ๋๋ฉด, class ์ด๋ฆ์ด dish์ ingredients, how์ธ ์์๋ 30px์ ์ฌ๋ฐฑ์ ๋๊ณ ๋ฐฐ์น๋๊ฒ ์ฃ .
5) ํ์ธํธ
๋ ์ด์์ ๋จ๊ณ ์ดํ, ๋ธ๋ผ์ฐ์ ๋ ์์์ ์คํ์ผ๊ณผ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ํ๋ฉด์ ํฝ์ ์ ๊ทธ๋ฆฝ๋๋ค. ์ด ๋จ๊ณ๋ฅผ ํ์ธํธ(Paint) ๋จ๊ณ๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ๋ ์ด์์ ๋จ๊ณ์์ ๊ณ์ฐ๋ ์์๋ค์ ์์น์ ํฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด, ๊ฐ ์์์ ์ ์ฉ๋ ์คํ์ผ ์์ฑ(์์, ํ ์คํธ, ๊ทธ๋ฆผ์, ํ ๋๋ฆฌ ๋ฑ)์ ์๊ฐ์ ์ผ๋ก ํํํฉ๋๋ค. ์ฆ, ๋ธ๋ผ์ฐ์ ๋ ๊ฐ ์์์ ์๊ฐ์ ์ธ ์์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ํฝ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ฉฐ, ๋ฐ์ดํฐ๋ค์ ํ๋ฉด์ ํ์๋ ์ค๋น๋ฅผ ํ๋ ๋จ๊ณ์ ๋๋ค.
class ์ด๋ฆ์ด dish์ธ ์์๋ ๊ธ์ ํฌ๊ธฐ 20px, ํ ์คํธ ๋ด์ฉ์ โ์ถ์ ๊ณ๋โ์ผ๋ก ํ๋ฉด์ ๊ทธ๋ ค์ง๋๋ค. ingredients ์์๋ โ๊ณ๋ 2๊ฐโ๋ผ๋ ํ ์คํธ๊ฐ ํ๋์์ผ๋ก ๊ทธ๋ ค์ง๊ณ , ๋ง์ง๋ง์ผ๋ก class ์ด๋ฆ์ด how์ธ ์์๋ ๊ธฐ๋ณธ ์คํ์ผ๋ก โ15๋ถ ๋์ ๋ฌผ์โฆโ์ด๋ผ๋ ํ ์คํธ๊ฐ ๊ทธ๋ ค์ง๊ฒ ๋ค์.
ํ์ธํธ ๊ณผ์ ์์ ๋ธ๋ผ์ฐ์ ๋ ๊ฐ ์์์ ์๊ฐ์ ์ธ ์์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ธํธ ๋ ์ด์ด(Paint Layer)๋ฅผ ์์ฑํ๋๋ฐ์. ์์๋ค์ ํน์ ์์ฑ(z-index, position, opacity, <video>
, <canvas>
๋ฑ)์ ๋ฐ๋ผ ๋
๋ฆฝ์ ์ธ ๋ ์ด์ด๊ฐ ์์ฑ๋ ์ ์์ต๋๋ค.
6) ์ปดํฌ์งํ
ํ์ธํธ ๊ณผ์ ์์ ์์ฑ๋ ์ฌ๋ฌ ๊ฐ์ ๋ ์ด์ด๋ค์ ์ปดํฌ์งํ (Compositing) ๋จ๊ณ์์ ํ๋์ ํ๋ฉด์ผ๋ก ๊ฒฐํฉ๋ฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ๊ฐ ๋ ์ด์ด๋ฅผ ์ฌ๋ฐ๋ฅธ ์์๋ก ํฉ์ฑํด ํ๋ฉด์ ์ ํํ ๋ ๋๋งํฉ๋๋ค. ํนํ ์์๊ฐ ๊ฒน์น๋ ๊ฒฝ์ฐ, z-index๋ position๊ณผ ๊ฐ์ ์์ฑ์ ๊ณ ๋ คํด ๊ฒน์นจ ์์๋ฅผ ์ ํํ ์ฒ๋ฆฌํฉ๋๋ค. ์ฌ๋ฌ ๋ ์ด์ด๋ค์ด ํ๋๋ก ํฉ์ณ์ง๋ ๊ณผ์ ์ ์๋์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, z-index ๊ฐ์ด ํฐ ์์๋ ๋ ์์ชฝ์ ๋ ๋๋ง ๋๊ณ , position ์์ฑ๊ฐ์ด fixed์ผ ๊ฒฝ์ฐ ๋ ๋ฆฝ์ ์ธ ๋ ์ด์ด๋ก ์ฒ๋ฆฌ๋์ด ํ๋ฉด ์ด๋๊ณผ ์๊ด์์ด ๊ณ ์ ๋ฉ๋๋ค. ์ด๋ฌํ ๋ ์ด์ด ๋ถ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณต์กํ ํ๋ฉด์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ๋ฆฝ์ ์ธ ๋ ์ด์ด๋ ํ์ด์ง์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ์ฃผ์ง ์๊ณ , ๊ฐ๋ณ์ ์ผ๋ก ๊ฐฑ์ ๋ ์ ์์ด ๋ ์ด์์์ด๋ ํ์ธํธ ์์ ์ ์ต์ํํ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ์ด๋ ๊ฒ ๋ณต์กํ ๋ ๋๋ง ๊ณผ์ ์ ํตํด ์ฌ์ฉ์๊ฐ ๋ณด๋ ์ต์ข ํ๋ฉด์ ์์ฑํฉ๋๋ค. ํ์ง๋ง ๋ ๋๋ง ๊ณผ์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ค์ํ ๋ณ์๋ก ์์ฉํ๋๋ฐ์. ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฐ๋ก DOM๊ณผ CSSOM์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ฉฐ, ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๋ค์ ๋ ๋๋งํ๋๋ก ์ ๋ฐํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ ๋๋ง์ ๋ฏธ์น๋ ์ํฅ
๊ทธ๋ ๋ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ๊ณผ์ ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๊ณ , ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ดํ๋ ค๋ฉด ์ด๋ ํ ์ ์ ์ ์ํด์ผ ํ ๊น์?
1) DOM ์กฐ์
์๋ฐ์คํฌ๋ฆฝํธ๋ DOM์ ์กฐ์ํด ํ๋ฉด์ ์์๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ถ๊ฐํ๋ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ํ์ง๋ง ์ด๋ฌํ DOM ์กฐ์์ ๋ธ๋ผ์ฐ์ ์ **๋ ์ด์์(Layout)**๊ณผ ํ์ธํธ(Paint) ๋จ๊ณ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์คํํ๋๋ก ์ ๋ํ์ฌ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
๋ฆฌํ๋ก์ฐ๋ ๋ ์ด์์ ๋จ๊ณ์์ ๋ฐ์ํ๋ ์์ ์ผ๋ก, ์์์ ํฌ๊ธฐ, ์์น, ๋ ์ด์์ ๋ฑ์ด ๋ณ๊ฒฝ๋ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ์ฒด ๋ ์ด์์์ ๋ค์ ๊ณ์ฐํ๋ ๊ณผ์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด, element.style.width = "100px";๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์คํ๋๋ฉด ํด๋น ์์์ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด์ ๋ฆฌํ๋ก์ฐ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด ๊ณผ์ ์์ ๋ธ๋ผ์ฐ์ ๋ ๋จ์ํ ํด๋น ์์๋ฟ๋ง ์๋๋ผ, ๊ทธ์ ๊ด๋ จ๋ ๋ถ๋ชจ ์์์ ์์ ์์๋ค๊น์ง ๋ค์ ๊ณ์ฐํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ์ฌ๋ฌ ์์์ ๊ฑธ์ณ ๋ ์ด์์์ ์ฌ๊ณ์ฐํด์ผ ํ๋ฏ๋ก, ๋ธ๋ผ์ฐ์ ๊ฐ ์ฒ๋ฆฌํด์ผ ํ ์ฐ์ฐ๋๊ณผ ๊ณ์ฐ ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ๊ฒ ๋ฉ๋๋ค.
๋ฆฌํ์ธํธ๋ ๋ ์ด์์์๋ ์ํฅ์ ์ฃผ์ง ์์ง๋ง, ์์์ ์๊ฐ์ ์คํ์ผ(์: ์์, ๋ฐฐ๊ฒฝ์, ํ ๋๋ฆฌ ๋ฑ)์ด ๋ณ๊ฒฝ๋ ๋ ํ๋ฉด์ ๋ค์ ๊ทธ๋ ค์ง๋ ๊ณผ์ ์ ๋งํฉ๋๋ค. ๋ฆฌํ๋ก์ฐ์ ๋นํด ๋น๊ต์ ๋ ๋ณต์กํ์ง๋ง, ๋น๋ฒํ ๋ฐ์ํ๋ฉด ์ญ์ ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ DOM ์กฐ์์ด ํ์ํ ๊ฒฝ์ฐ์๋ ์์ ์ ์ต์ ํํ์ฌ ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ์ ๋ฐ์์ ์ต์ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
2) ์คํฌ๋ฆฝํธ ์คํ ์ฐจ๋จ ๋ฌธ์
DOM ์กฐ์ ์ธ์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ธ๋ผ์ฐ์ ์ HTML ํ์ฑ ๋จ๊ณ์ ๋ ๋ ํธ๋ฆฌ ์์ฑ ๋จ๊ณ๋ฅผ ์ฐจ๋จํ ์ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ HTML์ ํ์ฑํ๋ฉด์ <script>
ํ๊ทธ๋ฅผ ๋ง๋๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ์คํฌ๋ฆฝํธ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ์คํํฉ๋๋ค. ์ฆ, ๋ธ๋ผ์ฐ์ ๋ ํด๋น ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์คํํ ๋๊น์ง HTML ํ์ฑ์ ์ค๋จํฉ๋๋ค. ์ด๋ ๋ ๋ ํธ๋ฆฌ ์์ฑ์ด ์ง์ฐ๋๊ณ , ๋ ๋๋ง์ด ๋ฆ์ด์ง๋ ์ฃผ์ ์์ธ์ด ๋ ์ ์์ต๋๋ค.
ํนํ ์ธ๋ถ ์คํฌ๋ฆฝํธ๋ฅผ ๋ก๋ํ๋ ๊ฒฝ์ฐ ๋คํธ์ํฌ ์๋๊น์ง ์ํฅ์ ๋ฐ์ ํ์ด์ง๊ฐ ๋๋ฆฌ๊ฒ ํ์๋๋ฉด์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ถ์ ์ ์ธ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ค์ด๊ธฐ ์ํด <script>
ํ๊ทธ์ async์ defer ์์ฑ์ ์ฌ์ฉํฉ๋๋ค.
async
๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๊ณ , ๋ก๋๊ฐ ์๋ฃ๋๋ ์ฆ์ ์คํํ๋ ์์ฑ์
๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค
<script async src="script.js"></script>
async
์์ฑ์ ์์ฑํ๋ฉด ์คํฌ๋ฆฝํธ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๊ธฐ ๋๋ฌธ์, HTML ํ์ฑ๊ณผ ๋์์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ด๋ก๋ ๋ฐ ๋ก๋ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ก๋ฉ๋๋ ์ฆ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํฉ๋๋ค. ์ด ๊ณผ์ ์ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
async
์์ฑ์ ์คํฌ๋ฆฝํธ๊ฐ ๋ก๋๋ ์ฆ์ ์คํ๋๋ฉฐ, ์ฌ๋ฌ ์คํฌ๋ฆฝํธ๊ฐ ์์ ๊ฒฝ์ฐ ๋ก๋๊ฐ ์๋ฃ๋ ์์๋๋ก ์คํ๋ฉ๋๋ค. ์ด ๋๋ฌธ์ ์คํ ์์๋ฅผ ๋ณด์ฅํ๊ธฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
<script>
ํ๊ทธ์ ๋ ๋ค๋ฅธ ์์ฑ์ธ defer
๋ํ ์คํฌ๋ฆฝํธ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๋ ์์ฑ์ผ๋ก, ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
<script defer src="script.js"></script>
defer
๋ async
์ ๋ฌ๋ฆฌ, ์คํฌ๋ฆฝํธ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๋, HTML ํ์ฑ์ด ์๋ฃ๋ ํ ์คํํฉ๋๋ค. ์ด๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ์์ฑ์ ์ฌ๋ฌ ์คํฌ๋ฆฝํธ๊ฐ ์์ ๊ฒฝ์ฐ ์์ฑ๋ ์์๋๋ก ์คํ๋๋ฉฐ, HTML ํ์ฑ๊ณผ ์คํฌ๋ฆฝํธ ๋ก๋๊ฐ ๋์์ ์ด๋ฃจ์ด์ง๋ฏ๋ก ๋ ๋๋ง ์ง์ฐ์ ์ต์ํํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํน์ฑ ๋๋ถ์ async
์ defer
๋ ๊ฐ๊ฐ ํน์ ์ํฉ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, async
๋ ์คํฌ๋ฆฝํธ ๊ฐ ์์กด์ฑ์ด ์๊ณ , ๋น ๋ฅด๊ฒ ๋ก๋๋์ด์ผ ํ๋ ์คํฌ๋ฆฝํธ์ ์ ํฉํฉ๋๋ค. ๋
๋ฆฝ์ ์ธ ๋ถ์ ์คํฌ๋ฆฝํธ๋ ๊ด๊ณ ์คํฌ๋ฆฝํธ์ ๊ฐ์ด ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์ ์ํธ์์ฉ์ ํ์ง ์์๋ ๋๋ ๊ฒฝ์ฐ ์ ์ฉํฉ๋๋ค. ๋ฐ๋ฉด, defer
๋ DOM์ด ์์ ํ ๋ก๋๋ ํ์ ์คํ๋์ด์ผ ํ๊ฑฐ๋, ์คํฌ๋ฆฝํธ ๊ฐ์ ์คํ ์์๊ฐ ์ค์ํ ๊ฒฝ์ฐ์ ์ ํฉํฉ๋๋ค. ์ด๋ DOM๊ณผ ๊ธด๋ฐํ ์ฐ๋๋๊ฑฐ๋, ์ฌ๋ฌ ์คํฌ๋ฆฝํธ๊ฐ ์๋ก ์์กด์ฑ์ ๊ฐ์ง ๋ ์์ ์ ์ธ ์คํ์ ๋ณด์ฅํฉ๋๋ค.
async
์ defer
๋ฅผ ์ ์ ํ ์ฌ์ฉํ๋ฉด ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ผ๋ฉฐ, ์คํฌ๋ฆฝํธ ์คํ์ผ๋ก ์ธํ ์ฐจ๋จ ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ ์ค์ ๊ฐ ์์ฑ์ ํน์ง์ ์ ์ดํดํ๊ณ ์ํฉ์ ๋ง๊ฒ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํ ์ ๋ต
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ๊ณผ์ ์ด ์ด๋ป๊ฒ ์ํธ์์ฉ์ ํ๋ฉฐ, ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๋์ง ์ดํดํ๋ค๋ฉด ์ด์ ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํ ๊ตฌ์ฒด์ ์ธ ์ ๋ต์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ต์ ํ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๋ ํต์ฌ ์์๋ก, ๋น ๋ฅด๊ณ ๋ถ๋๋ฌ์ด ์น ํ์ด์ง๋ฅผ ๋ง๋๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
1) ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ ์ค์ด๊ธฐ
๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๋ ๋ธ๋ผ์ฐ์ ์ฑ๋ฅ ์ต์ ํ์ ์ฃผ์ ๋์์ ๋๋ค. ์ด ๋ ์์ ์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ฉด CPU์ GPU์ ๋์ ๋ถํ๋ฅผ ์ฃผ์ด ํ๋ ์ ์๋๊ฐ ์ ํ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ต์ํํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋, ๋ฐ๋ก ์คํ์ผ ๋ณ๊ฒฝ์ ์ต์ํํ๋ ๊ฒ์ ๋๋ค. ์ฌ๋ฌ ์คํ์ผ ์์ฑ์ ํ ๋ฒ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ, ์คํ์ผ์ ๋ชจ์์ ๋ณ๊ฒฝํ๊ฑฐ๋ class๋ฅผ ์ถ๊ฐํ์ฌ ์คํ์ผ์ ์กฐ์ ํด์ผ ํฉ๋๋ค.
๋ํ ๋ค์๊ณผ ๊ฐ์ด ๋ฆฌํ๋ก์ฐ๋ฅผ ๋ฐ์์ํค๋ ํจ์๋, ์์ฑ์ ๋งค๋ฒ ํธ์ถํ์ง ์๊ณ ๋ณ์์ ์ ์ฅํด ํจ์์ ํธ์ถ์ ์ ํํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
// bad
for (let i = 0; i< 5; i++) {
el.style.width = target.offsetWidth + 50; // ๋ฐ๋ณต๋ฌธ์ด ๋ ๋ ๋งค๋ฒ ํธ์ถ
}
// good
const { offsetWidth } = target; // ํ ๋ฒ ํธ์ถํด์ ๋ณ์์ ์ ์ฅ
for (let i = 0; i< 5; i++) {
el.style.width = offsetWidth + 50;
}
2) ์ด๋ฏธ์ง์ ๋ฆฌ์์ค ์ต์ ํ
์น ํ์ด์ง์์ ์ด๋ฏธ์ง๋ ์๊ฐ์ ์ผ๋ก ์ค์ํ ์์์ง๋ง, ํ์ผ ํฌ๊ธฐ๊ฐ ์ปค ๋ก๋ฉ ์๋์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ํนํ ์ฌ์ฉ์๊ฐ ์ฆ์ ๋ณด์ง ์๋ ์ด๋ฏธ์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ํ๋ฉด, ๋ถํ์ํ ๋คํธ์ํฌ ์์ฒญ๊ณผ ์์ ์๋น๋ก ์ธํด ํ์ด์ง ๋ก๋ฉ ์๋๊ฐ ๋๋ ค์ง ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ Lazy Loading์ ์ฌ์ฉํด ํด๊ฒฐํ ์ ์์ต๋๋ค.
Lazy Loading์ ์ฌ์ฉ์๊ฐ ํด๋น ์ฝํ ์ธ ๋ฅผ ์ค์ ๋ก ๋ณผ ๋ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ ๊ธฐ์ ๋ก, ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ํฌ๊ฒ ๊ฐ์ ํ ์ ์์ต๋๋ค. HTML5์์๋ ์ด๋ฅผ ๊ฐํธํ๊ฒ ๊ตฌํํ ์ ์๋ loading ์์ฑ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฃผ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
<img src="example.jpg" alt="Example Image" loading="lazy">
์์ ๊ฐ์ด ์ด๋ฏธ์ง ํ๊ทธ์ loading="lazy"
์์ฑ์ ์ถ๊ฐํ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์ฌ์ฉ์๊ฐ ํด๋น ์ด๋ฏธ์ง๋ฅผ ๋ณผ ์์น์ ๋๋ฌํ ๋ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํฉ๋๋ค. ์ด๋ก ์ธํด ๋คํธ์ํฌ ์์ฒญ์ ์ค์ด๊ณ , ์ด๊ธฐ ๋ ๋๋ง ์๋๋ฅผ ๋์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
3) CSS์ JS ๋ก๋ ๋ฐฉ์ ์ต์ ํ
CSS์ JS ํ์ผ์ด ๋ก๋๋๊ณ ์คํ๋๋ ๋ฐฉ์ ๋ํ ํ์ด์ง ๋ ๋๋ง ์ฑ๋ฅ์ ์ค์ํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ด๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋จผ์ CSS ํ์ผ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์
๋๋ค. CSS๋ HTML ๋ฌธ์๋ฅผ ํ์ฑํ๊ธฐ ์ ์ ๋ก๋๋์ด์ผ ํ๋ฏ๋ก, CSS ํ์ผ์ rel="stylesheet"
์์ฑ์ ํตํด <head>
ํ๊ทธ ๋ด๋ถ์ ํฌํจํด์ผ ํฉ๋๋ค.
์์ ์ดํด๋ณธ async
์ defer
์์ฑ์ ์ ์ ํ ํ์ฉํ๋ ๊ฒ๋ JS ํ์ผ ๋ก๋ ๋ฐฉ์์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์
๋๋ค. async
์์ฑ์ ๋
๋ฆฝ์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ๋น ๋ฅด๊ฒ ์คํํด์ผ ํ ๋, defer
์์ฑ์ DOM๊ณผ ํจ๊ป ์คํ๋์ด์ผ ํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ ํฉํฉ๋๋ค.
๋ง์น๋ฉฐ
์ด์ฒ๋ผ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ๊ณผ์ ๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ญํ ์ ์ดํดํ๋ฉด, ์ฑ๋ฅ ์ ํ์ ์์ธ์ ๋ถ์ํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ๊ฐ์ ํ ์ ์์ต๋๋ค. DOM ์กฐ์๊ณผ ์คํฌ๋ฆฝํธ ์คํ ์ต์ ํ, ๋ฆฌ์์ค ์ต์ ํ๋ฅผ ํตํด ํ์ด์ง ๋ก๋ฉ ์๋๋ฅผ ๋์ด๊ณ , ๋ธ๋ผ์ฐ์ ์ ๋ถํ๋ฅผ ์ค์ผ ์ ์์ฃ .
๋ ๋๋ง ์ต์ ํ๋ ๋จ์ํ ํ์ด์ง ์๋๋ฅผ ๋์ด๋ ๋ฐ ๊ทธ์น์ง ์๊ณ , ๋ถ๋๋ฝ๊ณ ๋งค๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ํต์ฌ์ ์ธ ์์ ์ ๋๋ค. ์ง๊ธ๊น์ง ์ดํด๋ณธ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์น ๊ฐ๋ฐ ๊ณผ์ ์์ ๋ ๋๋ง ์ฑ๋ฅ์ ์ ๊ฒฝ ์ด๋ค๋ฉด, ์ฌ์ฉ์์ ๊ฐ๋ฐ์ ๋ชจ๋์๊ฒ ๋ง์กฑ์ค๋ฌ์ด ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์์ผ๋ก ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ ์ ๊น์ด ์ดํดํ๊ณ ์ด๋ฅผ ํ์ฉํ๋ค๋ฉด, ๋์ฑ ๋น ๋ฅด๊ณ ๋งค๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ์น ์ฌ์ดํธ๋ฅผ ๊ตฌํํ ์ ์์ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.