01. ๐ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง๊ณผ CRP์ ์ฌ์ธต ์๋ฆฌ
๐ ๊ฐ์
๋ธ๋ผ์ฐ์ ๊ฐ 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 ํจ๋๋ถํฐ ์ผ์ผ๊ฒ ๋ค. ์ํธ ๋์ด ๋งํ "์ฝ๊ธฐ๋ ์ฝ๊ธฐ๋ผ๋ฆฌ, ์ฐ๊ธฐ๋ ์ฐ๊ธฐ๋ผ๋ฆฌ"๋ผ๋ ๊ธฐ์ค ํ๋๋ง ๋ถ์ก์๋ ์ค๋์ ๋๋ ์ด์ ๋ณด๋ค ๋ ๋ง์ฐํ ๊ฐ๋ฐ์๊ฐ ๋ ๊ฒ ๊ฐ๋ค.