01. ๐ŸŒ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง๊ณผ CRP์˜ ์‹ฌ์ธต ์›๋ฆฌ

2026๋…„ 4์›” 30์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML์„ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š” ์ „ ๊ณผ์ •์„ ๋งˆ์Šคํ„ฐํ•˜๊ณ , ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๊ทผ๋ณธ์ธ CRP๋ฅผ ์ •๋ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ด ๋ฉด์ ‘ ํ•ญ๋ชฉ์˜ ๋ชฉํ‘œ

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 20๋ถ„ (ํ•ต์‹ฌ ์š”์•ฝ: 10๋ถ„)

๐Ÿ—บ๏ธ ์ด ์ฑ•ํ„ฐ์˜ ํ๋ฆ„
[๊ฐœ๋… ์‚ฌ์ „] โ†’ [์งˆ๋ฌธ 1: ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ] โ†’ [์งˆ๋ฌธ 2: Reflow/Repaint ์ตœ์ ํ™”] โ†’ [์งˆ๋ฌธ 3: ์• ๋‹ˆ๋ฉ”์ด์…˜ ์„ฑ๋Šฅ]

๐ŸŽฏ ์ด ์ฑ•ํ„ฐ๋ฅผ ๋‹ค ์ฝ์œผ๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  • ๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์š” ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ(Layout Thrashing)์˜ ์›์ธ๊ณผ ํ•ด๊ฒฐ์ฑ…์„ ์ œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • GPU ๊ฐ€์†์ด ์ผ์–ด๋‚˜๋Š” ์กฐ๊ฑด๊ณผ ๊ทธ ๊ธฐํšŒ๋น„์šฉ์„ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“š ํ•ต์‹ฌ ๊ฐœ๋… ์‚ฌ์ „ (Concept Glossary)

์งˆ๋ฌธ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „, ์ด ์ฑ•ํ„ฐ๋ฅผ ๊ด€ํ†ตํ•˜๋Š” ํ•ต์‹ฌ ์šฉ์–ด๋“ค์„ ๋จผ์ € ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. CRP (Critical Rendering Path)

๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML, CSS, JavaScript๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ์‹ค์ œ ํ”ฝ์…€๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ๊นŒ์ง€์˜ ์ผ๋ จ์˜ ๋‹จ๊ณ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ๋กœ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์ด ๊ณง ์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค.

2. ๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ (Layout Thrashing)

JavaScript ์ฝ”๋“œ๊ฐ€ DOM์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์ฆ‰์‹œ ๊ธฐํ•˜ํ•™์  ์ •๋ณด(offsetWidth, scrollTop ๋“ฑ)๋ฅผ ์ฝ์œผ๋ ค ํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ตœ์ ํ™”๋ฅผ ํฌ๊ธฐํ•˜๊ณ  ๊ฐ•์ œ๋กœ ๋ ˆ์ด์•„์›ƒ์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ํ˜„์ƒ์ž…๋‹ˆ๋‹ค. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ์ฃผ๋ฒ”์ž…๋‹ˆ๋‹ค.

3. ์ปดํฌ์ง€ํŒ… (Compositing)

ํ™”๋ฉด์˜ ๊ฐ ๋ถ€๋ถ„์„ ๋ณ„๋„์˜ ๋ ˆ์ด์–ด๋กœ ๋‚˜๋ˆ„์–ด ๊ทธ๋ฆฐ ๋’ค, ๋งˆ์ง€๋ง‰์— ํ•˜๋‚˜๋กœ ํ•ฉ์„ฑํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. transform, opacity ๋ณ€๊ฒฝ์€ ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ์„ ๋‹ค์‹œ ํ•˜์ง€ ์•Š๊ณ  ํ•ฉ์„ฑ ๋‹จ๊ณ„์—์„œ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜ ์„ฑ๋Šฅ์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋ ˆ์ด์–ด๊ฐ€ ๋Š˜๋ฉด GPU ๋ฉ”๋ชจ๋ฆฌ๋„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ๋ฐฐ๊ฒฝ ์„ธ๊ณ„๊ด€: '์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ'

  • ๐Ÿฃ ์˜์ฒ  (์ดˆ๋ฐ˜): "์˜ํ˜ธ ๋‹˜! ์ด๋ฒˆ์— '์˜์ˆ˜๋„ค ๊ฒŒ์‹œํŒ' ๋ฌดํ•œ ์Šคํฌ๋กค์„ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ์Šคํฌ๋กคํ•  ๋•Œ๋งˆ๋‹ค ํ™”๋ฉด์ด ๋Š๊ฒจ์š”. ๋ถ„๋ช… ์‚ฌ์–‘ ์ข‹์€ ๋งฅ๋ถ์ธ๋ฐ ์™œ ์ด๋Ÿด๊นŒ์š”?"
  • ๐Ÿฆ ์˜ํ˜ธ (๋ฆฌ๋“œ): "์˜์ฒ  ๋‹˜, ํ™”๋ฉด์ด ๋Š๊ธด๋‹ค๋Š” ๊ฑด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดˆ๋‹น 60ํ”„๋ ˆ์ž„์„ ์œ ์ง€ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ตฌ๊ฐ„์ด ์žˆ๋‹ค๋Š” ๋œป์ด์—์š”. ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€๋งŒ ๋ณด์ง€ ๋ง๊ณ , ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML๊ณผ CSS๋ฅผ ํ”ฝ์…€๋กœ ๋ฐ”๊พธ๋Š” ์ˆœ์„œ๋ฅผ ๋”ฐ๋ผ๊ฐ€ ๋ด…์‹œ๋‹ค."

๋ฉด์ ‘ ์งˆ๋ฌธ 1. ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•ด ๋ณด์„ธ์š”.

๐ŸŽฏ ์ถœ์ œ ์˜๋„

์ง€์›์ž๊ฐ€ ๋‹จ์ˆœํžˆ ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์šฉ๋ฒ•์„ ๋„˜์–ด, ์›น์ด ๋™์ž‘ํ•˜๋Š” ํ•˜๋ถ€ ํ™˜๊ฒฝ(Browser)์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋Šฅ๋ ฅ์„ ํŒ๋‹จํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ธ ์ฒ™๋„์ž…๋‹ˆ๋‹ค.

๐Ÿฃ ์˜์ฒ ์ด์˜ Naive ๊ตฌํ˜„ (Bad Case)

์˜์ฒ ์ด๋Š” ๊ฒŒ์‹œ๋ฌผ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๋ฆฌ์ŠคํŠธ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

// ๐Ÿฃ ์˜์ฒ : "๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์œผ๋‹ˆ ๊น”๋”ํ•˜๊ฒŒ ์ƒˆ๋กœ ๊ทธ๋ ค์•ผ์ง€!"
function updateBoardList(posts) {
    const list = document.getElementById('board-list');
    list.innerHTML = ''; // โš ๏ธ ๊ธฐ์กด DOM์„ ํ†ต์งธ๋กœ ๋‚ ๋ฆฌ๊ณ  ์ƒˆ๋กœ ์ƒ์„ฑ (๋น„์‹ผ ๋น„์šฉ)
 
    posts.forEach(post => {
        list.innerHTML += `<li>${post.title}</li>`; // โš ๏ธ ๋งค ๋ฃจํ”„๋งˆ๋‹ค ๋ฌธ์ž์—ด ํŒŒ์‹ฑ & DOM ํŠธ๋ฆฌ ์žฌ๊ตฌ์„ฑ
    });
}

๐Ÿฆ ์˜ํ˜ธ์˜ ๋ฆฌ๋ทฐ ํฌ์ธํŠธ
"์˜์ฒ  ๋‹˜, innerHTML +=๋Š” ๋งค ๋ฐ˜๋ณต๋งˆ๋‹ค ๊ธฐ์กด HTML์„ ๋‹ค์‹œ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค๊ณ  ํŒŒ์‹ฑํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ DOM ๋ณ€๊ฒฝ์„ ํ•œ ๋ฒˆ์— ๋ชจ์•„ ์ฒ˜๋ฆฌํ•  ๊ธฐํšŒ๋ฅผ ์žƒ์œผ๋‹ˆ, ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ํŒŒ์‹ฑ๊ณผ ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋น ๋ฅด๊ฒŒ ๋Š˜์–ด์š”."

๐Ÿฆ ์˜ํ˜ธ์˜ ์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ (Good Case)

์˜ํ˜ธ ๋ฆฌ๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํšจ์œจ์ ์œผ๋กœ ์ผํ•  ์ˆ˜ ์žˆ๋„๋ก DocumentFragment์™€ ์ตœ์ ํ™”๋œ API๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

// ๐Ÿฆ ์˜ํ˜ธ: "๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ '์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ'๋งŒ ํ•œ ๋ฒˆ์— ๋˜์ ธ์ฃผ์„ธ์š”."
function updateBoardList(posts) {
    const list = document.getElementById('board-list');
    const fragment = document.createDocumentFragment(); // ๋ฉ”๋ชจ๋ฆฌ์ƒ ๊ฐ€์ƒ ์ปจํ…Œ์ด๋„ˆ
 
    posts.forEach(post => {
        const li = document.createElement('li');
        li.textContent = post.title; // ํ…์ŠคํŠธ๋งŒ ์•ˆ์ „ํ•˜๊ฒŒ ์ฃผ์ž…
        fragment.appendChild(li);
    });
 
    list.replaceChildren(fragment); // DOM ๋ฐ˜์˜ ์ง€์ ์„ ํ•œ ๋ฒˆ์œผ๋กœ ๋ชจ์•„ ๋ Œ๋”๋ง ๋น„์šฉ์„ ์ค„์ž„
}

์ด ๊ฐœ์„ ์€ "DOM์„ ์ „ํ˜€ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค"๊ฐ€ ์•„๋‹ˆ๋ผ DOM ๋ณ€๊ฒฝ ํšŸ์ˆ˜์™€ ํŒŒ์‹ฑ ๋น„์šฉ์„ ์ค„์ธ๋‹ค๋Š” ์ ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ๋ฉด์ ‘์—์„œ๋Š” textContent๋ฅผ ์‚ฌ์šฉํ•ด HTML ์‚ฝ์ž… ์œ„ํ—˜์„ ์ค„์ธ ์ ๊นŒ์ง€ ํ•จ๊ป˜ ๋งํ•˜๋ฉด ๋” ์„ค๋“๋ ฅ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Š ๋ ˆ๋ฒจ๋ณ„ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ (Self-Check)

  • Level 1 (Junior): "HTML๋กœ DOM ํŠธ๋ฆฌ, CSS๋กœ CSSOM ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ๋‘˜์„ ํ•ฉ์ณ Render Tree๋ฅผ ๋งŒ๋“ค๊ณ , ์š”์†Œ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ์ •ํ•˜๋Š” Layout, ์ƒ‰์„ ์น ํ•˜๋Š” Paint ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ํ™”๋ฉด์— ๋ณด์—ฌ์ค๋‹ˆ๋‹ค."
  • Level 2 (Senior): "Render Tree์—๋Š” display: none ๊ฐ™์€ ์š”์†Œ๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Œ์„ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. Layout ์ดํ›„ Paint ๋‹จ๊ณ„์—์„œ ๋ ˆ์ด์–ด๊ฐ€ ๋‚˜๋ˆ„์–ด์ง€๋ฉฐ, ๋งˆ์ง€๋ง‰์— Composite ๋‹จ๊ณ„์—์„œ ๋ ˆ์ด์–ด๊ฐ€ ํ•ฉ์„ฑ๋œ๋‹ค๋Š” ์ ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. transform ์†์„ฑ์ด ์™œ ๋น ๋ฅธ์ง€ ํŒŒ์ดํ”„๋ผ์ธ ๊ด€์ ์—์„œ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค."
  • Level 3 (Specialist): "ํ•˜๋“œ์›จ์–ด ๊ฐ€์†(GPU)์ด ์ผ์–ด๋‚˜๋Š” ํŠน์ • ์กฐ๊ฑด(Will-change ๋“ฑ)์„ ์„ค๋ช…ํ•˜๊ณ , ๋ฌด๋ถ„๋ณ„ํ•œ ๋ ˆ์ด์–ด ์ƒ์„ฑ์ด ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ(Memory Bloat)์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์—”์ง„(V8, Blink ๋“ฑ)์˜ ์ตœ์ ํ™” ์ „๋žต๊ณผ ์—ฐ๊ด€ ์ง€์–ด ๋‹ต๋ณ€ํ•ฉ๋‹ˆ๋‹ค."

๋ฉด์ ‘ ์งˆ๋ฌธ 2. ๋ฆฌํ”Œ๋กœ์šฐ(Reflow)์™€ ๋ฆฌํŽ˜์ธํŠธ(Repaint)์˜ ์ฐจ์ด์™€ ์ตœ์ ํ™” ์ „๋žต์„ ์„ค๋ช…ํ•ด ๋ณด์„ธ์š”.

๐ŸŽฏ ์ถœ์ œ ์˜๋„

๋‹จ์ˆœํžˆ ์šฉ์–ด๋ฅผ ์•„๋Š”์ง€ ๋ฌป๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, DOM ์กฐ์ž‘์ด ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€ ํ”„๋กœ์„ธ์Šค์— ๋ฏธ์น˜๋Š” '๋น„์šฉ(Cost)'์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ์ฝ”๋”ฉ ์Šต๊ด€์„ ๊ฐ–์ถ”๊ณ  ์žˆ๋Š”์ง€ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿฃ ์˜์ฒ ์ด์˜ Naive ๊ตฌํ˜„ (Bad Case)

์˜์ฒ ์ด๋Š” ์Šคํฌ๋กค ์œ„์น˜๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์–ด์„œ scrollTop์„ ์ฝ์€ ์งํ›„, style.height๋ฅผ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ˆœ์„œ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ ˆ์ด์•„์›ƒ ์บ์‹œ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์ฆ‰์‹œ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

// ๐Ÿฃ ์˜์ฒ : "์Šคํฌ๋กค ์œ„์น˜๋ฅผ ํ™•์ธํ•˜๊ณ , ๊ทธ์— ๋งž์ถฐ ๋†’์ด๋ฅผ ์กฐ์ ˆํ•ด์•ผ์ง€!"
function adjustLayout() {
    const container = document.getElementById('container');
 
    // โš ๏ธ 1. ์ฝ๊ธฐ (Read): ๋ ˆ์ด์•„์›ƒ ์ •๋ณด ์š”์ฒญ
    const currentScroll = container.scrollTop;
 
    // โš ๏ธ 2. ์“ฐ๊ธฐ (Write): ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ
    container.style.height = (currentScroll + 100) + 'px';
 
    // โš ๏ธ 3. ๋‹ค์‹œ ์ฝ๊ธฐ (Read): ๋ฐฉ๊ธˆ ๋ฐ”๋€ ๋†’์ด๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•ด์•ผ ํ•จ!
    console.log(container.offsetHeight); // โŒ ์—ฌ๊ธฐ์„œ Reflow ๊ฐ•์ œ ๋ฐœ์ƒ!
}

๐Ÿฆ ์˜ํ˜ธ์˜ ๋ฆฌ๋ทฐ ํฌ์ธํŠธ
"์˜์ฒ  ๋‹˜, scrollTop์„ ์ฝ๊ณ  ๋ฐ”๋กœ height๋ฅผ ๋ฐ”๊พธ๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” '์•„์ฐจ, ๋ฐฉ๊ธˆ ๋ฐ”๋€ ๋†’์ด๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผ๊ฒ ๋„ค?'๋ผ๋ฉฐ 1๋ฒˆ๋ถ€ํ„ฐ 4๋ฒˆ๊นŒ์ง€์˜ ๊ณผ์ •์„ ๊ฐ•์ œ๋กœ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ **๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ(Layout Thrashing)**์ด๋ผ๊ณ  ํ•ด์š”. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉˆ์ถ”๋Š” ์ฃผ๋ฒ”์ด์ฃ ."

๐Ÿฆ ์˜ํ˜ธ์˜ ์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ (Good Case)

์˜ํ˜ธ ๋ฆฌ๋“œ๋Š” ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ์ž‘์—…์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.

// ๐Ÿฆ ์˜ํ˜ธ: "์ฝ์„ ๊ฑด ๋‹ค ์ฝ๊ณ , ์“ธ ๊ฑด ๋‹ค ์“ฐ์„ธ์š”. ์ค‘๊ฐ„์— ๋ผ์–ด๋“ค์ง€ ๋งˆ์„ธ์š”!"
function adjustLayoutOptimized() {
    const container = document.getElementById('container');
 
    // 1. ์ฝ๊ธฐ ์ž‘์—… ๋ชจ์œผ๊ธฐ (Read Batch)
    // ์ด ๋‹จ๊ณ„์—์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ตœ๋Œ€ํ•œ ์บ์‹ฑํ•ฉ๋‹ˆ๋‹ค.
    const currentScroll = container.scrollTop;
    const currentHeight = container.offsetHeight;
 
    // 2. ์“ฐ๊ธฐ ์ž‘์—… ๋ชจ์œผ๊ธฐ (Write Batch)
    // ๊ณ„์‚ฐ๋œ ๊ฐ’์œผ๋กœ ํ•œ ๋ฒˆ์— ์Šคํƒ€์ผ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
    const nextHeight = Math.max(currentHeight, currentScroll + 100);
    container.style.height = `${nextHeight}px`;
}

์“ฐ๊ธฐ ์ดํ›„์— ๋‹ค์‹œ offsetHeight๋ฅผ ์ฝ์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ƒˆ ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐœ์„ ๋œ ์ฝ”๋“œ๋Š” ์ธก์ •๊ฐ’์„ ๋จผ์ € ๋ชจ๋‘ ํ™•๋ณดํ•˜๊ณ , ๋ณ€๊ฒฝ์€ ๋งˆ์ง€๋ง‰์— ํ•œ ๋ฒˆ๋งŒ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Š ๋ ˆ๋ฒจ๋ณ„ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ (Self-Check)

  • Level 1 (Junior): "Reflow๋Š” ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜๊ฐ€ ๋ฐ”๋€Œ์–ด ๋ ˆ์ด์•„์›ƒ์„ ์žฌ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๊ณ , Repaint๋Š” ์ƒ‰์ƒ์ด๋‚˜ ๋ฐฐ๊ฒฝ ๋“ฑ ์‹œ๊ฐ์  ์Šคํƒ€์ผ๋งŒ ๋ฐ”๋€Œ์–ด ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Reflow๊ฐ€ ๋” ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค."
  • Level 2 (Senior): "Reflow๋Š” DOM ํŠธ๋ฆฌ ์ „์ฒด ๋˜๋Š” ์ผ๋ถ€์˜ ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ๋ฅผ ์žฌ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. width, height, margin, padding, font-size ๋ณ€๊ฒฝ ์‹œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Repaint๋Š” ๋ ˆ์ด์•„์›ƒ์€ ์œ ์ง€๋œ ์ฑ„ ์ƒ‰์ƒ๋งŒ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. color, background-color ๋ณ€๊ฒฝ ์‹œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค."
  • Level 3 (Specialist): "๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ(Layout Thrashing)์„ ์–ธ๊ธ‰ํ•˜๋ฉฐ, ์ฝ๊ธฐ(Read)์™€ ์“ฐ๊ธฐ(Write) ์ž‘์—…์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ์ตœ์ ํ™” ์ „๋žต์ž„์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, transform, opacity๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Reflow์™€ Paint ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  Composite ๋‹จ๊ณ„์—์„œ ์ฒ˜๋ฆฌ๋˜์–ด ๊ฐ€์žฅ ๋น ๋ฅด๋‹ค๋Š” ์ ์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค."

๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ

Q1. ์˜์ˆ˜๋„ค ๊ฒŒ์‹œํŒ ๋ฌดํ•œ ์Šคํฌ๋กค์ด ๋ฒ„๋ฒ…์ผ ๋•Œ, ์˜์ฒ ์ด๊ฐ€ ๋ฉด์ ‘ ๋‹ต๋ณ€์—์„œ ๊ฐ€์žฅ ๋จผ์ € ์„ค๋ช…ํ•ด์•ผ ํ•  ํ๋ฆ„์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

โœ… ์ •๋‹ต: DOM/CSSOM ์ƒ์„ฑ โ†’ Render Tree โ†’ Layout โ†’ Paint โ†’ Composite๋กœ ์ด์–ด์ง€๋Š” ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ ๋ฉด์ ‘์€ "React๊ฐ€ ๋А๋ ค์š”"์—์„œ ์‹œ์ž‘ํ•˜๋ฉด ์–•์•„์ง‘๋‹ˆ๋‹ค. ๋จผ์ € ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML, CSS, JS๋ฅผ ์–ด๋–ค ๋‹จ๊ณ„๋กœ ํ”ฝ์…€๊นŒ์ง€ ๋ฐ”๊พธ๋Š”์ง€ ๋งํ•ด์•ผ ๋ณ‘๋ชฉ์„ ์ขํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: useMemo๋‚˜ debounce๋ถ€ํ„ฐ ๋งํ•˜๋ฉด ๋„๊ตฌ ์ด์•ผ๊ธฐ๋Š” ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Reflow์™€ Paint ์ค‘ ์–ด๋””๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ์„ค๋ช…ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: ํ™”๋ฉด์ด ๋А๋ฆฌ๋ฉด ๋จผ์ € ๋ธŒ๋ผ์šฐ์ €์˜ ๊ณต์ •ํ‘œ๋ถ€ํ„ฐ ํŽผ์นฉ๋‹ˆ๋‹ค.

Q2. ์˜ํ˜ธ๊ฐ€ scrollTop์„ ์ฝ๊ณ  ๋ฐ”๋กœ style.height๋ฅผ ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ๋ฅผ ์ง€์ ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

โœ… ์ •๋‹ต: ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๊ฐ€ ์„ž์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ•์ œ Layout์„ ๋ฐ˜๋ณตํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: ๋ ˆ์ด์•„์›ƒ ์ •๋ณด๋ฅผ ์ฝ์€ ๋’ค ์Šคํƒ€์ผ์„ ๋ฐ”๊พธ๊ณ  ๋‹ค์‹œ ์ฝ์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ์บ์‹œํ•œ ๋ ˆ์ด์•„์›ƒ์„ ๋ฒ„๋ฆฌ๊ณ  ์ฆ‰์‹œ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋กค, ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋Œ€๋Ÿ‰ DOM ์กฐ์ž‘์—์„œ ํ”„๋ ˆ์ž„ ๋“œ๋กญ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: ๋‹จ์ˆœํžˆ style.height๊ฐ€ ๋‚˜์˜๋‹ค๋Š” ๋œป์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ์„ž์–ด ๋ธŒ๋ผ์šฐ์ €์˜ ์ตœ์ ํ™” ๊ธฐํšŒ๋ฅผ ๋นผ์•—๋Š” ์ˆœ์„œ์ž…๋‹ˆ๋‹ค.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: ์ธก์ •์€ ๋ชจ์•„์„œ ์ฝ๊ณ , ๋ณ€๊ฒฝ์€ ๋ชจ์•„์„œ ์”๋‹ˆ๋‹ค.

Q3. ์˜์ฒ ์ด์˜ ํ…Œ์ŠคํŠธ ํƒ€์ž„: ๋ฌดํ•œ ์Šคํฌ๋กค ๊ฐœ์„  ์ „ ๊ฐ€์žฅ ์„ค๋“๋ ฅ ์žˆ๋Š” ๊ฒ€์ฆ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

โœ… ์ •๋‹ต: Performance ํŒจ๋„๋กœ Layout/Paint/Composite ๋น„์šฉ์„ ํ™•์ธํ•˜๊ณ , DOM ์กฐ์ž‘์„ batch ์ฒ˜๋ฆฌํ•œ ์ „ํ›„ ํ”„๋ ˆ์ž„ ๋ณ€ํ™”๋ฅผ ๋น„๊ตํ•œ๋‹ค

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: ๋ฉด์ ‘์—์„œ ์ข‹์€ ๋‹ต๋ณ€์€ "์ด๋ ‡๊ฒŒ ๊ณ ์ณค์Šต๋‹ˆ๋‹ค"๊ฐ€ ์•„๋‹ˆ๋ผ "์ด ์ง€ํ‘œ๊ฐ€ ๋ณ‘๋ชฉ์ด์—ˆ๊ณ , ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ด๋ ‡๊ฒŒ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค"๊นŒ์ง€ ์ด์–ด์ง‘๋‹ˆ๋‹ค.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: ์ฒด๊ฐ์ƒ ๋นจ๋ผ์กŒ๋‹ค๋Š” ๋ง๋งŒ์œผ๋กœ๋Š” ์žฌํ˜„์„ฑ๊ณผ ์„ค๋“๋ ฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: ์„ฑ๋Šฅ ๋‹ต๋ณ€์€ ๊ฐ์ƒ์ด ์•„๋‹ˆ๋ผ ํƒ€์ž„๋ผ์ธ์œผ๋กœ ๋งํ•ฉ๋‹ˆ๋‹ค.

๐Ÿฃ ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ

์˜ค๋Š˜์€ ๋ฉด์ ‘ ๋‹ต๋ณ€์„ ์™ธ์šฐ๋Š” ๋Œ€์‹ , ํ™”๋ฉด์ด ๋А๋ฆด ๋•Œ ๋ธŒ๋ผ์šฐ์ € ์•ˆ์—์„œ ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๋Š”์ง€ ์ˆœ์„œ๋Œ€๋กœ ๋งํ•˜๋Š” ์—ฐ์Šต์„ ํ–ˆ๋‹ค. ์˜ˆ์ „ ๊ฐ™์œผ๋ฉด "React ์ตœ์ ํ™”ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋‹ตํ–ˆ์„ ํ…๋ฐ, ์ด์ œ๋Š” Layout๊ณผ Paint๊ฐ€ ์–ด๋””์„œ ๋ฐ˜๋ณต๋˜๋Š”์ง€ ๋จผ์ € ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑธ ์•Œ์•˜๋‹ค.

๐Ÿ’ก "์„ฑ๋Šฅ ๋ฌธ์ œ๋Š” ๊ฐ์œผ๋กœ ์žก๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€๋‚˜๊ฐ„ ๋ฐœ์ž๊ตญ์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์ขํ˜€์•ผ ํ•œ๋‹ค."

๋‚ด์ผ๋ถ€ํ„ฐ๋Š” ์Šคํฌ๋กค์ด๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ด์Šˆ๋ฅผ ๋งŒ๋‚˜๋ฉด ๋ฐ”๋กœ ์ฝ”๋“œ๋ฅผ ๋œฏ๊ธฐ ์ „์— Performance ํŒจ๋„๋ถ€ํ„ฐ ์ผœ์•ผ๊ฒ ๋‹ค. ์˜ํ˜ธ ๋‹˜์ด ๋งํ•œ "์ฝ๊ธฐ๋Š” ์ฝ๊ธฐ๋ผ๋ฆฌ, ์“ฐ๊ธฐ๋Š” ์“ฐ๊ธฐ๋ผ๋ฆฌ"๋ผ๋Š” ๊ธฐ์ค€ ํ•˜๋‚˜๋งŒ ๋ถ™์žก์•„๋„ ์˜ค๋Š˜์˜ ๋‚˜๋Š” ์–ด์ œ๋ณด๋‹ค ๋œ ๋ง‰์—ฐํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™๋‹ค.


๐Ÿ”— ๋” ์•Œ์•„๋ณด๊ธฐ