[TECH-QA] ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •

๋ธŒ๋ผ์šฐ์ €์˜ 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): ๋ ˆ์ด์•„์›ƒ ์ด๋™์˜ ์•ˆ์ •์„ฑ.