๐Ÿช„ ํ”„๋ก ํŠธ์—”๋“œ ๋ฉด์ ‘ ์งˆ๋ฌธ ์Šคํ„ฐ๋”” - 2ํŽธ. HTML, CSS, JAVASCRIPT์˜ ๋ธŒ๋ผ์šฐ์ € ๋žœ๋”๋ง ์›๋ฆฌ

MJยท2023๋…„ 1์›” 3์ผ
1
post-thumbnail
ํŒŒ์ผ์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋žœ๋”๋ง ์›๋ฆฌ๋ฅผ ์•Œ๊ธฐ์ „ ์•„๋ž˜ ๋‹จ์–ด๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š” ๋žœ๋”๋ง ๊ฒฝ๋กœ

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•˜๋‚˜์˜ ํ™”๋ฉด์„ ๊ทธ๋ ค๋‚ด๋Š” ๊ณผ์ •์„ ์ค‘์š” ๋žœ๋”๋ง ๊ฒฝ๋กœ(Critical Rendering Path)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Webkit, Gecko

Webkit์€ ์• ํ”Œ์ด ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ฐœ๋ฐœํ•œ ์›น ๋ Œ๋”๋ง ์—”์ง„์œผ๋กœ ์‚ฌํŒŒ๋ฆฌ, ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ํฌ๋กฌ์€ Webkit ์ง€์›์„ ์ค‘๋‹จํ•˜๊ณ  ๊ธฐ๋ฐ˜์œผ๋กœ ์ œ์ž‘ํ•œ Blink๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Gecko๋Š” ๋ชจ์งˆ๋ผ ์žฌ๋‹จ์—์„œ ๊ฐœ๋ฐœํ•œ ์›น ๋ Œ๋”๋ง ์—”์ง„์œผ๋กœ Firefox ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โœ”๏ธ HTML, CSS, JAVASCRIPT์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋žœ๋”๋ง ์›๋ฆฌ

๋ธŒ๋ผ์šฐ์ €์—์„œ ๋žœ๋”๋ง ์›๋ฆฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ์„œ๋ฒ„์—์„œ ์‘๋‹ต์œผ๋กœ ๋ฐ›์€ HTML ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑparsingํ•œ๋‹ค

์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ์‘๋‹ต ๋ฐ›์€ HTML ํŒŒ์ผ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ํŒŒ์‹ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

  • โ—javascript๋ฅผ ๋งŒ๋‚˜๋ฉด ํ•ด๋‹น ํŒŒ์ผ์„ ๋ฐ›์•„์™€์„œ ์‹คํ–‰ํ•  ๋•Œ๊นŒ์ง€ ํŒŒ์‹ฑ์ด ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.โ—

2. HTML์„ ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋กœ DOM Tree๋ฅผ ๋งŒ๋“ ๋‹ค

๊ทธ๋ฆผ ์ถœ์ฒ˜

3. ํŒŒ์‹ฑํ•˜๋Š” ์ค‘ CSS ํŒŒ์ผ ๋งํฌ๋ฅผ ๋งŒ๋‚˜๋ฉด CSS ํŒŒ์ผ์„ ์š”์ฒญํ•ด์„œ ๋ฐ›์•„์˜จ๋‹ค

4. CSS ํŒŒ์ผ์„ ์ฝ์–ด์„œ CSSOM(CSS Object Model)์„ ๋งŒ๋“ ๋‹ค

5. DOM Tree์™€ CSSOM์ด ๋ชจ๋‘ ๋งŒ๋“ค์–ด์ง€๋ฉด ์ด ๋‘˜์„ ์‚ฌ์šฉํ•ด Render Tree๋ฅผ ๋งŒ๋“ ๋‹ค

6. Render Tree์— ์žˆ๋Š” ๊ฐ๊ฐ์˜ ๋…ธ๋“œ๋“ค์ด ํ™”๋ฉด์˜ ์–ด๋””์— ์–ด๋–ป๊ฒŒ ์œ„์น˜ํ•  ์ง€๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” Layout๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค

ํ™”๋ฉด์— ๋ณด์ด๋Š” ์š”์†Œ ๊ฐ๊ฐ์ด ์–ด๋””์— ์–ด๋–ป๊ฒŒ ์œ„์น˜ํ•  ์ง€๋ฅผ ์ •ํ•ด์ฃผ๋Š” ๊ณผ์ •์„

Webkit์—์„œ๋Š” โ—layoutโ—์œผ๋กœ, Gecko์—์„œ๋Š” โ—reflowโ—๋กœ ๋ถ€๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

7. ํ™”๋ฉด์— ์‹ค์ œ ํ”ฝ์…€์„ Paintํ•œ๋‹ค

๋งŒ์•ฝ Render Layer๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด ๊ฐ๊ฐ์˜ Layer๋ฅผ paintํ•œ ๋’ค ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋กœ Compositeํ•˜๋Š” ๊ณผ์ •์„ ์ถ”๊ฐ€๋กœ ๊ฑฐ์นœ ๋’ค์— ์‹ค์ œ๋กœ ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๊ฒŒ ๋˜๋Š”๋ฐ ์ด ๊ณผ์ •์„

โ—repaintโ—์ด๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.


๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ๊ณผ์ •์„ ์ดํ•ดํ•˜๋ฉด reflow์™€ repaint๋ฅผ ์ค„์—ฌ ์„ฑ๋Šฅ์„ ๋†’์ด๊ฑฐ๋‚˜, ๋ถˆํ•„์š”ํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ค„์—ฌ ์ตœ์ ํ™”๋ฅผ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ—Reflowโ—

6๋ฒˆ Render Tree ๊ณผ์ •์—์„œ ํ™”๋ฉด์— ๋ณด์ด๋Š” ์š”์†Œ ๊ฐ๊ฐ์ด ์–ด๋””์— ์–ด๋–ป๊ฒŒ ์œ„์น˜ํ•  ์ง€๋ฅผ ์ •ํ•ด์ฃผ๋Š” ๊ณผ์ •์„ ๊ฒช์„๋•Œ ํ•œ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š”๋ฐ, ์ตœ์ดˆ ํ•œ๋ฒˆ ์‹คํ–‰๋˜๊ณ , ์ดํ›„์— ์š”์†Œ๋“ค์—์„œ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธธ๋•Œ ๋‹ค์‹œ Render Tree๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

// bad
// ์ด ์ฝ”๋“œ๋Š” Render Tree๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์ˆ˜์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ํ™”๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค.
const ulElement = document.getElementsByTagName('ul')[0];
for(let i=0; i<10; i++) {
  ulElement.innerHTML += `<li> list${i} </li>`;
}


// good
const ulElement = document.getElementsByTagName('ul')[0];
let strHtml = ulElement.innerHTML;
for(let i=0; i<10; i++) {
  strHtml += `<li> list${i} </li>`;
}
ulElement.innerHTML = strHtml;

์—ฌ๋Ÿฌ๊ฐœ์˜ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ, ์œ„์™€ ๊ฐ™์ด ๊ฐ€์ƒ์˜ ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€ํ•  ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ํ•œ๋ฒˆ์— ์ˆ˜์ •ํ•ด์„œ reflow๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.


โ—Repaintโ—

๋งŒ์•ฝ Render Layer๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด ๊ฐ๊ฐ์˜ Layer๋ฅผ paintํ•œ ๋’ค ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋กœ Compositeํ•˜๋Š” ๊ณผ์ •์„ ์ถ”๊ฐ€๋กœ ๊ฑฐ์นœ ๋’ค์— ์‹ค์ œ๋กœ ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๊ฒŒ ๋˜๋Š”๋ฐ ์ด ๊ณผ์ •์„ repaint๋ผ๊ณ  ํ•œ๋‹ค.

ํ•œ๋งˆ๋””๋กœ. Layer๋ฅผ paintํ–ˆ๋Š”๋ฐ ๋‹ค์‹œ paint๋ฅผ ํ•ด์•ผํ•˜๋Š” ๊ณผ์ •์ด ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ ์ตœ์ ํ™”๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.


๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๋“œ๋งต ์Šคํ„ฐ๋”” - 1ํŽธ ์ธํ„ฐ๋„ท ๋ถ€๋ถ„์„ ์ฐธ์กฐ!

์ฐธ๊ณ ์ž๋ฃŒ

profile
A fancy web like a rose

0๊ฐœ์˜ ๋Œ“๊ธ€