๋ธ๋ผ์ฐ์ ์ HTML ๋ ๋๋ง์ ์น ํ์ด์ง๋ฅผ ํ๋ฉด์ ํ์ํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ๊ฐ HTML, CSS, JavaScript ๋ฑ์ ๋ฆฌ์์ค๋ฅผ ์ฒ๋ฆฌํ๊ณ ์๊ฐ์ ์ผ๋ก ํํํ๋ ๊ณผ์ ์
๋๋ค. ์ด ๊ณผ์ ์ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ์์ง(์: Chrome์ Blink, Firefox์ Gecko, Safari์ WebKit)์ ์ํด ์ํ๋๋ฉฐ, ์ฌ๋ฌ ๋จ๊ณ๋ก ๋๋ ์ ์์ต๋๋ค. ์๋์์ ์ด ๊ณผ์ ์ ์์ธํ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ ์ ๊ฐ์
๋ธ๋ผ์ฐ์ ๋ HTML ๋ฌธ์๋ฅผ ๋ฐ์ ํ๋ฉด์ ๋ ๋๋งํ๊ธฐ ์ํด ๋ค์ ์ฃผ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค.
- HTML ํ์ฑ ๋ฐ DOM ์์ฑ
- CSS ํ์ฑ ๋ฐ CSSOM ์์ฑ
- ๋ ๋ ํธ๋ฆฌ(Render Tree) ์์ฑ
- ๋ ์ด์์(Layout, Reflow)
- ํ์ธํ (Painting)
- ์ปดํฌ์งํ (Compositing, ์ ํ์ )
์ด ๊ณผ์ ์ Critical Rendering Path(CRP, ์ค์ ๋ ๋๋ง ๊ฒฝ๋ก)๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ, ์น ํ์ด์ง ๋ก๋ฉ ์๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
HTML ํ์ฑ ๋ฐ DOM ์์ฑ
- HTML ํ์ฑ: ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ HTML ํ์ผ์ ๋ฐ์ดํธ ๋จ์๋ก ์ฝ์ด ๋ฌธ์๋ฅผ ํด์ํ๊ณ , ์ด๋ฅผ ํ ํฐ(์: ํ๊ทธ, ์์ฑ, ํ ์คํธ)์ผ๋ก ๋ณํํฉ๋๋ค. ์ด ํ ํฐ๋ค์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์กฐ์งํ๋ฉ๋๋ค.
- DOM(Document Object Model) ์์ฑ: ํ์ฑ๋ HTML์ ๊ณ์ธต์ ํธ๋ฆฌ ๊ตฌ์กฐ์ธ DOM์ผ๋ก ๋ณํ๋ฉ๋๋ค. DOM์ HTML ์์์ ๊ทธ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด ๋ชจ๋ธ๋ก, ๊ฐ ์์๋ ๋ ธ๋๋ก ํํ๋ฉ๋๋ค. - ์) <div><p>Hello</p></div>๋ <div>์ <p>๊ฐ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ก DOM ํธ๋ฆฌ์ ์ถ๊ฐ๋ฉ๋๋ค.
- ๋น๋๊ธฐ ๋ฆฌ์์ค ์ฒ๋ฆฌ: HTML ํ์ฑ ์ค <script>, <img>, <link> ๋ฑ์ ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ๋ง๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ ํด๋น ๋ฆฌ์์ค๋ฅผ ๋ณ๋ ฌ์ ์ผ๋ก ์์ฒญํฉ๋๋ค. ๋จ, <script> ํ๊ทธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑ์ ์ฐจ๋จ(blocking)ํ ์ ์์ผ๋ฏ๋ก async ๋๋ defer ์์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
CSS ํ์ฑ ๋ฐ CSSOM ์์ฑ
- CSS ํ์ฑ: HTML ํ์ฑ๊ณผ ๋ณ๋ ฌ์ ์ผ๋ก, ๋ธ๋ผ์ฐ์ ๋ <link> ํ๊ทธ๋ <style> ํ๊ทธ๋ฅผ ํตํด CSS ํ์ผ ๋๋ ์คํ์ผ์ ์ฝ์ต๋๋ค. CSS๋ ํ ํฐํ๋๊ณ ํ์ฑ๋์ด ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๋ณํ๋ฉ๋๋ค.
- CSSOM(CSS Object Model) ์์ฑ: ํ์ฑ๋ CSS๋ CSSOM์ด๋ผ๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ ์ฅ๋ฉ๋๋ค. CSSOM์ ๊ฐ ์์์ ์ ์ฉ๋ ์คํ์ผ ๊ท์น(์: color, margin)์ ์ ์ํฉ๋๋ค.
- CSS๋ ๊ณ์ธต์ ์ด๋ฉฐ, ์์๊ณผ ์ฐ์ ์์(์: !important, ์ ํ์ ํน์ด์ฑ)์ ๋ฐ๋ผ ์คํ์ผ์ด ๊ฒฐ์ ๋ฉ๋๋ค.
- ๋ ๋๋ง ์ฐจ๋จ: CSS๋ ๋ ๋๋ง์ ์ฐจ๋จํ๋ ๋ฆฌ์์ค์ ๋๋ค. CSSOM์ด ์์ฑ๋๊ธฐ ์ ์๋ ํ๋ฉด ๋ ๋๋ง์ด ์์๋์ง ์์ผ๋ฏ๋ก, CSS ํ์ผ์ ์ต์ ํ(์: ์ต์ํ, ์ธ๋ผ์ธ CSS ์ฌ์ฉ)ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ ๋ ํธ๋ฆฌ(Render Tree) ์์ฑ
- DOM๊ณผ CSSOM ๊ฒฐํฉ: ๋ธ๋ผ์ฐ์ ๋ DOM๊ณผ CSSOM์ ๊ฒฐํฉํ์ฌ ๋ ๋ ํธ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค. ๋ ๋ ํธ๋ฆฌ๋ ํ๋ฉด์ ์ค์ ๋ก ํ์๋ ์์๋ค๋ง ํฌํจํฉ๋๋ค. - ์) display: none์ด ์ ์ฉ๋ ์์๋ ๋ด๋ถ์ ๋ฉํ๋ฐ์ดํฐ๋ ๋ ๋ ํธ๋ฆฌ์ ํฌํจ๋์ง ์์ต๋๋ค.
- ๋ ๋ ํธ๋ฆฌ๋ ๊ฐ ๋ ธ๋์ ๋ํด ์คํ์ผ ์ ๋ณด(์: ์์, ํฌ๊ธฐ)์ ๊ตฌ์กฐ์ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค.
- ๋ ๋ ํธ๋ฆฌ์ ์ญํ : ๋ ๋ ํธ๋ฆฌ๋ ๋ ์ด์์ ๋จ๊ณ์์ ์์์ ํฌ๊ธฐ์ ์์น๋ฅผ ๊ณ์ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ ์ด์์(Layout, Reflow)
- ๋ฐ์ค ๋ชจ๋ธ ๊ธฐ๋ฐ ๊ณ์ฐ: ๋ ๋ ํธ๋ฆฌ์ ๊ฐ ๋ ธ๋๋ CSS ๋ฐ์ค ๋ชจ๋ธ(์ฝํ ์ธ , ํจ๋ฉ, ํ ๋๋ฆฌ, ๋ง์ง)์ ๊ธฐ๋ฐ์ผ๋ก ํฌ๊ธฐ์ ์์น๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ๋ทฐํฌํธ ๊ธฐ์ค ๋ฐฐ์น: ๋ธ๋ผ์ฐ์ ๋ ๋ทฐํฌํธ(ํ๋ฉด ํฌ๊ธฐ)๋ฅผ ๊ธฐ์ค์ผ๋ก ์์์ ์ ํํ ์์น(x, y ์ขํ)์ ํฌ๊ธฐ(width, height)๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. - ์: position: absolute๋ ๋ถ๋ชจ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก, float๋ ์ฃผ๋ณ ์ฝํ ์ธ ํ๋ฆ์ ๋ฐ๋ผ ๋ฐฐ์น๋ฉ๋๋ค.
- ๋ฆฌํ๋ก์ฐ(Reflow): ๋ ์ด์์ ๊ณ์ฐ์ ์ด๊ธฐ ๋ ๋๋ง๋ฟ๋ง ์๋๋ผ DOM์ด๋ CSS ๋ณ๊ฒฝ(์: JavaScript๋ก ์คํ์ผ ๋ณ๊ฒฝ, ์ฐฝ ํฌ๊ธฐ ์กฐ์ ) ์์๋ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฆฌํ๋ก์ฐ๋ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก ์ต์ํํด์ผ ํฉ๋๋ค.
ํ์ธํ (Painting)
- ํฝ์ ๋ณํ: ๋ ์ด์์ ๋จ๊ณ์์ ๊ณ์ฐ๋ ๋ ๋ ํธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, ๋ธ๋ผ์ฐ์ ๋ ๊ฐ ์์๋ฅผ ํ๋ฉด์ ํฝ์ ๋ก ๋ณํํฉ๋๋ค. - ์์, ๊ทธ๋ฆผ์, ํ ์คํธ, ์ด๋ฏธ์ง ๋ฑ ์๊ฐ์ ์คํ์ผ์ด ์ ์ฉ๋ฉ๋๋ค.
- ๋ ์ด์ด(Layer): ๋ณต์กํ ํ์ด์ง์์๋ ์์๋ฅผ ์ฌ๋ฌ ๋ ์ด์ด๋ก ๋๋์ด ํ์ธํ ํฉ๋๋ค. ์) transform์ด๋ opacity๋ฅผ ์ฌ์ฉํ๋ ์์๋ ๋ณ๋์ ๋ ์ด์ด๋ก ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค.
- GPU ๊ฐ์: ํ๋ ๋ธ๋ผ์ฐ์ ๋ GPU๋ฅผ ํ์ฉํด ํ์ธํ ์ ๊ฐ์ํํฉ๋๋ค. CSS ์์ฑ ์ค will-change๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ์์์ ๋ ๋๋ง์ ์ต์ ํํ ์ ์์ต๋๋ค.
๐ will-change๋ฅผ ์ฌ์ฉํ CSS ์ ๋๋ฉ์ด์ ์ต์ ํ
<!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>will-change ์์</title> <style> .box { width: 100px; height: 100px; background-color: #3498db; position: relative; transition: transform 0.3s ease; /* ๋ธ๋ผ์ฐ์ ์ transform ๋ณ๊ฒฝ์ ๋ฏธ๋ฆฌ ์๋ฆผ */ will-change: transform; } .box:hover { transform: translateX(200px); /* ๋ง์ฐ์ค ํธ๋ฒ ์ ์ด๋ */ } </style> </head> <body> <div class="box"></div> </body> </html>
will-change ์์
- will-change: transform;: ๋ธ๋ผ์ฐ์ ์ .box ์์์ transform ์์ฑ์ด ๋ณ๊ฒฝ๋ ๊ฒ์์ ์๋ ค, ํด๋น ์์๋ฅผ GPU ๋ ์ด์ด๋ก ์น๊ฒฉ์์ผ ๋ ๋๋ง์ ๊ฐ์ํํฉ๋๋ค.
- ํจ๊ณผ: ๋ง์ฐ์ค๋ฅผ .box ์์ ์ฌ๋ฆฌ๋ฉด ์์๊ฐ ๋ถ๋๋ฝ๊ฒ 200px ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํฉ๋๋ค. will-change๋ก ์ธํด ๋ธ๋ผ์ฐ์ ๋ ์ด ๋ณํ์ ๋ฏธ๋ฆฌ ์ค๋นํ์ฌ ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
- ์ฃผ์์ฌํญ - will-change๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ ์ ์์ผ๋ฏ๋ก, ์ค์ ๋ก ์ ๋๋ฉ์ด์ ์ด๋ ๋ณ๊ฒฝ์ด ๋น๋ฒํ ์์์๋ง ์ ์ฉํ์ธ์. - ์ ๋๋ฉ์ด์ ์ด ๋๋ ํ์๋ will-change๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค(์: JavaScript๋ก ๋์ ์ผ๋ก ์ถ๊ฐ/์ ๊ฑฐ).
๐ ์คํฌ๋กค ์ ๋๋ฉ์ด์
.scroll-element { position: fixed; top: 0; will-change: transform; transition: transform 0.5s ease; } /* JavaScript๋ก ์คํฌ๋กค ์ transform ๋ณ๊ฒฝ */ document.addEventListener('scroll', () => { document.querySelector('.scroll-element').style.transform = "translateY(${window.scrollY}px)"; });
์ด ๊ฒฝ์ฐ, will-change: transform์ ์คํฌ๋กค์ ๋ฐ๋ฅธ ์์ ์ด๋์ GPU๋ก ์ฒ๋ฆฌํ์ฌ ๋ถ๋๋ฌ์ด ๋ ๋๋ง์ ๋ณด์ฅํฉ๋๋ค. will-change๋ GPU ๊ฐ์์ ํ์ฉํด ์ ๋๋ฉ์ด์
์ด๋ ์ ํ ์ฑ๋ฅ์ ๊ฐ์ ํ์ง๋ง, ์ ์ ํ ์ฌ์ฉํด์ผ ๋ฆฌ์์ค ๋ญ๋น๋ฅผ ํผํ ์ ์์ต๋๋ค. ์ ์์๋ transform์ ์ด์ ์ ๋ง์ท์ง๋ง, opacity, scroll-position ๋ฑ ๋ค๋ฅธ ์์ฑ์๋ ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
์ปดํฌ์งํ (Compositing, ์ ํ์ )
- ๋ ์ด์ด ํฉ์ฑ: ํ์ธํ ๋ ๋ ์ด์ด๋ฅผ ์ต์ข ์ ์ผ๋ก ํฉ์ณ ํ๋ฉด์ ํ์ํฉ๋๋ค. ์ปดํฌ์งํ ์ GPU๋ฅผ ํ์ฉํด ๋น ๋ฅด๊ฒ ์ํ๋ฉ๋๋ค.
- ์ ๋๋ฉ์ด์ ์ต์ ํ: transform์ด๋ opacity ๊ฐ์ ์์ฑ์ ๋ ์ด์์์ด๋ ํ์ธํ ์ ์ ๋ฐํ์ง ์๊ณ ์ปดํฌ์งํ ๋จ๊ณ์์๋ง ์ฒ๋ฆฌ๋๋ฏ๋ก ์ฑ๋ฅ์ด ์ข์ต๋๋ค.
- ์ฑ๋ฅ ๊ณ ๋ ค: ์ปดํฌ์งํ ์ ๋ฆฌํ๋ก์ฐ๋ ๋ฆฌํ์ธํ ๋ณด๋ค ๋น์ฉ์ด ์ ์ผ๋ฏ๋ก, ์ ๋๋ฉ์ด์ ์ ์ ํฉํ ์์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ฐ์ค ๋ชจ๋ธ๊ณผ์ ์ฐ๊ด์ฑ
CSS ๋ฐ์ค ๋ชจ๋ธ์ ๋ ๋๋ง ๊ณผ์ , ํนํ ๋ ์ด์์ ๋จ๊ณ์์ ํต์ฌ์ ์ธ ์ญํ ์ ํฉ๋๋ค
- ๊ฐ HTML ์์๋ ๋ฐ์ค ๋ชจ๋ธ(์ฝํ ์ธ , ํจ๋ฉ, ํ ๋๋ฆฌ, ๋ง์ง)์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๊ฐํ ๋ฐ์ค๋ก ๊ณ์ฐ๋ฉ๋๋ค.
- ๋ ์ด์์ ๋จ๊ณ์์ ๋ธ๋ผ์ฐ์ ๋ ๋ฐ์ค ๋ชจ๋ธ์ ์์ฑ(width, height, margin, padding, border)์ ์ฌ์ฉํด ์์์ ํฌ๊ธฐ์ ์์น๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- box-sizing ์์ฑ์ ๋ฐ์ค ํฌ๊ธฐ ๊ณ์ฐ ๋ฐฉ์(content-box vs border-box)์ ์ ์ํ๋ฉฐ, ๋ ์ด์์์ ์์ธก ๊ฐ๋ฅ์ฑ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๋ค์์ ๊ฐ๋จํ HTML๊ณผ CSS๋ก ๋ ๋๋ง ๊ณผ์ ์ ๋ณด์ฌ์ฃผ๋ ์์ ์
๋๋ค:
<!DOCTYPE html> <html> <head> <style> div { width: 200px; height: 100px; margin: 20px; padding: 10px; border: 5px solid blue; background-color: lightgray; } </style> </head> <body> <div>Hello, World!</div> </body> </html>
- HTML ํ์ฑ: <div>์ ํ ์คํธ๊ฐ DOM ํธ๋ฆฌ๋ก ๋ณํ๋ฉ๋๋ค.
- CSS ํ์ฑ: ์คํ์ผ์ด CSSOM์ผ๋ก ๋ณํ๋ฉ๋๋ค.
- ๋ ๋ ํธ๋ฆฌ: <div>์ ์คํ์ผ์ด ๊ฒฐํฉ๋ ๋ ๋ ํธ๋ฆฌ๊ฐ ์์ฑ๋ฉ๋๋ค.
- ๋ ์ด์์: ๋ฐ์ค ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก <div>์ ํฌ๊ธฐ(230px ร 130px, content-box ๊ธฐ์ค)์ ์์น๊ฐ ๊ณ์ฐ๋ฉ๋๋ค.
- ํ์ธํ : <div>์ ๋ฐฐ๊ฒฝ์, ํ ๋๋ฆฌ, ํ ์คํธ๊ฐ ํ๋ฉด์ ๊ทธ๋ ค์ง๋๋ค.
์ถ๊ฐ ๊ณ ๋ ค์ฌํญ
- Progressive Rendering: ๋ธ๋ผ์ฐ์ ๋ ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ๋ก๋๋๊ธฐ ์ ์ ๋ถ๋ถ์ ์ผ๋ก ๋ ๋๋ง์ ์์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์์๊ฒ ๋ ๋น ๋ฅด๊ฒ ์ฝํ ์ธ ๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๋ค.
- Web Vitals: Google์ Core Web Vitals(LCP, FID, CLS)๋ ๋ ๋๋ง ์ฑ๋ฅ์ ์ธก์ ํ๋ ์งํ๋ก, ์ต์ ํ ๋ชฉํ๋ก ์ฌ์ฉ๋ฉ๋๋ค. - LCP(Largest Contentful Paint): ์ฃผ์ ์ฝํ ์ธ ๋ ๋๋ง ์๊ฐ. - FID(First Input Delay): ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ํ ์๋ต์ฑ. - CLS(Cumulative Layout Shift): ๋ ์ด์์ ์ด๋์ ์์ ์ฑ.