--- category: Unified tags: [auto-consolidated, technical-documentation] title: [[Reflow & Repaint|Reflow & Repaint]] last_updated: 2026-05-02 --- # [[Reflow & Repaint|Reflow & Repaint]] ## ๐Ÿ“Œ Brief Summary ๋ฆฌํ”Œ๋กœ์šฐ(Reflow)๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฌธ์„œ ๋‚ด ์š”์†Œ๋“ค์˜ ์ •ํ™•ํ•œ ์œ„์น˜์™€ ํฌ๊ธฐ(๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ)๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฐฐ์น˜ํ•˜๋Š” ๊ณผ์ •์ด๋ฉฐ, ๋ฆฌํŽ˜์ธํŠธ(Repaint)๋Š” ๊ณ„์‚ฐ๋œ ๋ ˆ์ด์•„์›ƒ์„ ๋ฐ”ํƒ•์œผ๋กœ ํ™”๋ฉด์— ์‹ค์ œ ํ”ฝ์…€์„ ๊ทธ๋ฆฌ๋Š” ์‹œ๊ฐ์  ์—…๋ฐ์ดํŠธ ๊ณผ์ •์ด๋‹ค [1-6]. ๋ฆฌํ”Œ๋กœ์šฐ๋Š” ์š”์†Œ์˜ ์ถ”๊ฐ€/์‚ญ์ œ๋‚˜ ํฌ๊ธฐ ๋ณ€๊ฒฝ ์‹œ ๋ฐœ์ƒํ•˜๋ฉฐ ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋งค์šฐ ๋†’์€ ๋ฐ˜๋ฉด, ๋ฆฌํŽ˜์ธํŠธ๋Š” ๋ฐฐ๊ฒฝ์ƒ‰์ด๋‚˜ ๊ทธ๋ฆผ์ž ๋“ฑ ์‹œ๊ฐ์  ์†์„ฑ๋งŒ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค [5-7]. ์ด ๋‘ ๊ณผ์ •์€ ๋ธŒ๋ผ์šฐ์ €์˜ ์ค‘์š” ๋ Œ๋”๋ง ๊ฒฝ๋กœ([[Critical Rendering Path|Critical Rendering Path]])์˜ ํ•ต์‹ฌ ๋‹จ๊ณ„๋กœ, ๊ณผ๋„ํ•˜๊ฒŒ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ ์ €ํ•˜์™€ ํ™”๋ฉด ๋Š๊น€(Jank) ํ˜„์ƒ์„ ์œ ๋ฐœํ•˜๋ฏ€๋กœ ์›น ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์žˆ์–ด ํ•„์ˆ˜์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์š”์†Œ์ด๋‹ค [5, 8-10]. --- Reflow(Layout)์™€ Repaint(Paint)๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ์š”์†Œ์˜ ํฌ๊ธฐ, ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์‹œ๊ฐ์  ์š”์†Œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š” ๋น„์šฉ์ด ๋†’์€ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ๋‹ฌ์„ฑํ•˜๊ณ  ๋งค๋„๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(์˜ˆ: 60fps ์œ ์ง€)์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” DOM ํŠธ๋ฆฌ์˜ ๊นŠ์ด ๊ฐ์†Œ, ์ƒํƒœ ๋ณ€๊ฒฝ์˜ ์ผ๊ด„ ์ฒ˜๋ฆฌ, ํ•˜๋“œ์›จ์–ด ๊ฐ€์† ๋“ฑ์„ ํ†ตํ•ด ์ด ๊ณผ์ •์ด ๋ฐœ์ƒํ•˜๋Š” ๋นˆ๋„์™€ ์—ฐ์‚ฐ๋Ÿ‰์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. --- **Reflow(๋ ˆ์ด์•„์›ƒ)**๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ™”๋ฉด์— ํ‘œ์‹œ๋  DOM ์š”์†Œ๋“ค์˜ ์ •ํ™•ํ•œ ์œ„์น˜์™€ ๊ธฐํ•˜ํ•™์  ํฌ๊ธฐ๋ฅผ ์žฌ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์ด๋ฉฐ, **Repaint(ํŽ˜์ธํŠธ)**๋Š” ๋ ˆ์ด์•„์›ƒ์˜ ๋ณ€ํ™” ์—†์ด ์š”์†Œ์˜ ์ƒ‰์ƒ์ด๋‚˜ ๊ทธ๋ฆผ์ž ๊ฐ™์€ ์‹œ๊ฐ์  ์†์„ฑ๋งŒ์„ ํ™”๋ฉด์— ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-6]. ์ด ๋‘ ๊ณผ์ •์€ ์›น ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์— ํ•„์ˆ˜์ ์ด์ง€๋งŒ ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋†’์•„ ๊ณผ๋„ํ•˜๊ฒŒ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ ์ €ํ•˜์™€ ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ(Jank)์„ ์œ ๋ฐœํ•˜๋ฏ€๋กœ ํ”„๋ก ํŠธ์—”๋“œ ์ตœ์ ํ™”์˜ ํ•ต์‹ฌ ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค [7-9]. --- Reflow๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฌธ์„œ์˜ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์š”์†Œ์˜ ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ(๋„ˆ๋น„, ๋†’์ด, ์œ„์น˜ ๋“ฑ)๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์ด๋ฉฐ, Repaint๋Š” ๋ ˆ์ด์•„์›ƒ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ์‹œ๊ฐ์  ๋ณ€ํ™”(์ƒ‰์ƒ, ๋ฐฐ๊ฒฝ ๋“ฑ)๋ฅผ ํ™”๋ฉด์— ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •์ด๋‹ค [1, 2]. ์ด ๋‘ ๊ณผ์ •์€ ์ฒ˜๋ฆฌ ๋น„์šฉ์ด ๋งค์šฐ ๋†’์•„ ๊ณผ๋„ํ•˜๊ฒŒ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ CSS ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๊ณ  ํ™”๋ฉด์˜ ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ(Janky)์„ ์œ ๋ฐœํ•œ๋‹ค [3-5]. ๋”ฐ๋ผ์„œ ํšจ์œจ์ ์ธ CSS ์†์„ฑ ์„ ํƒ๊ณผ DOM ์กฐ์ž‘์˜ ์ตœ์†Œํ™”๋ฅผ ํ†ตํ•ด Reflow์™€ Repaint์˜ ๋ฐœ์ƒ์„ ์ค„์ด๋Š” ๊ฒƒ์€ ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•˜๊ณ  ํ™•์žฅ์„ฑ ์žˆ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜์ ์ธ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด๋‹ค [5-7]. --- ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•˜๋Š” ๊ณผ์ •์—์„œ 'Reflow(๋ ˆ์ด์•„์›ƒ)'๋Š” ์š”์†Œ์˜ ์ •ํ™•ํ•œ ํฌ๊ธฐ์™€ ์œ„์น˜ ๋“ฑ ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด 'Repaint(ํŽ˜์ธํŠธ)'๋Š” ๊ณ„์‚ฐ๋œ ๊ตฌ์กฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ฐฐ๊ฒฝ์ƒ‰์ด๋‚˜ ํ…์ŠคํŠธ ์ƒ‰์ƒ ๊ฐ™์€ ์‹œ๊ฐ์  ์š”์†Œ๋ฅผ ํ™”๋ฉด์˜ ํ”ฝ์…€๋กœ ๊ทธ๋ ค๋‚ด๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ๋‘ ๊ณผ์ • ๋ชจ๋‘ ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋“ค๋ฉฐ ํ”„๋ ˆ์ž„ ์†๋„์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์— ์ง๊ฒฐ๋˜๋ฏ€๋กœ, ์ด๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ”„๋ก ํŠธ์—”๋“œ ๋ Œ๋”๋ง ์ตœ์ ํ™”์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [1-3]. --- Reflow(๋ฆฌํ”Œ๋กœ์šฐ)๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€ ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ๊ณผ ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์ด๋ฉฐ, Repaint(๋ฆฌํŽ˜์ธํŠธ)๋Š” ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ƒ‰์ƒ ๋“ฑ์˜ ์‹œ๊ฐ์  ์†์„ฑ๋งŒ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ด ๋‘ ๊ฐ€์ง€ ๊ณผ์ •์€ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์—”์ง„์— ํฐ ๋ถ€๋‹ด์„ ์ฃผ์–ด UI ์„ฑ๋Šฅ ์ €ํ•˜์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ง€์—ฐ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ํ•ต์‹ฌ ๋ณ‘๋ชฉ ์ง€์ ์ž…๋‹ˆ๋‹ค [1, 3]. ๋”ฐ๋ผ์„œ ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•˜๊ณ  ์ตœ์ ํ™”๋œ CSS๋ฅผ ์„ค๊ณ„ํ•˜๋ ค๋ฉด ๋ฆฌํ”Œ๋กœ์šฐ์™€ ๋ฆฌํŽ˜์ธํŠธ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ์ „๋žต์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [4]. --- Reflow(๋ฆฌํ”Œ๋กœ์šฐ)๋Š” ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜ ๋“ฑ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฌธ์„œ์˜ ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์ด๋ฉฐ, Repaint(๋ฆฌํŽ˜์ธํŠธ)๋Š” ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ์‹œ๊ฐ์  ์†์„ฑ(์ƒ‰์ƒ ๋“ฑ)์ด ๋ณ€๊ฒฝ๋  ๋•Œ ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค [1, 2]. ๋‘ ๊ณผ์ • ๋ชจ๋‘ ๋ธŒ๋ผ์šฐ์ €์˜ ์—ฐ์‚ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์†Œ๋ชจํ•˜๋ฏ€๋กœ, ์พŒ์ ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊ณผ ์›น ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ์ด๋ฅผ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 3, 4]. ์œ ์ง€๋ณด์ˆ˜์™€ ์„ฑ๋Šฅ์„ ๋ชจ๋‘ ๊ณ ๋ คํ•œ CSS ์‹ค์ „ ์„ค๊ณ„์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์˜ ํŠน์„ฑ์„ ์ดํ•ดํ•˜๊ณ  ํšจ์œจ์ ์ธ ์Šคํƒ€์ผ๋ง๊ณผ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ „๋žต์„ ์ฑ„ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3, 5]. --- ๋ฆฌํ”Œ๋กœ์šฐ(Reflow)๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€์˜ ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜์—ฌ ๋ฌธ์„œ ๋‚ด ์š”์†Œ๋“ค์˜ ํฌ๊ธฐ, ์œ„์น˜ ๋“ฑ ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ๋ฅผ ์žฌ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ๋ฆฌํŽ˜์ธํŠธ(Repaint)๋Š” ๋ ˆ์ด์•„์›ƒ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ƒ‰์ƒ, ๊ฐ€์‹œ์„ฑ ๋“ฑ ์‹œ๊ฐ์ ์ธ ๊ป๋ฐ๊ธฐ(skin)๋งŒ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ Œ๋”๋ง ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ๋‘ ๊ณผ์ • ๋ชจ๋‘ ๋ธŒ๋ผ์šฐ์ €์˜ ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋งค์šฐ ๋†’์œผ๋ฉฐ ์žฆ์€ ๋ฐœ์ƒ์€ ์›น ํŽ˜์ด์ง€ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์„ฑ๋Šฅ ์ €ํ•˜(๋ฒ„๋ฒ…๊ฑฐ๋ฆผ ๋“ฑ)๋กœ ์ง๊ฒฐ๋˜๋ฏ€๋กœ, ์‹ค๋ฌด CSS ์„ค๊ณ„ ์‹œ ์ด๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ตฌ์กฐ์™€ ์Šคํƒ€์ผ ์ž‘์„ฑ ์ „๋žต์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. --- ๋ฆฌํ”Œ๋กœ์šฐ(Reflow)๋Š” ์š”์†Œ์˜ ๋„ˆ๋น„, ๋†’์ด ๋“ฑ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฌธ์„œ์˜ ๊ตฌ์กฐ๋ฅผ ์žฌ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์ด๋ฉฐ, ๋ฆฌํŽ˜์ธํŠธ(Repaint)๋Š” ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ์‹œ๊ฐ์  ์š”์†Œ(์ƒ‰์ƒ, ๋ฐฐ๊ฒฝ ๋“ฑ)๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•˜์—ฌ ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-3]. ๋‘ ๊ณผ์ • ๋ชจ๋‘ ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋†’๊ณ  ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œ์ผœ ํ™”๋ฉด ๋Š๊น€(Jank) ํ˜„์ƒ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, CSS ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌํ˜„ ์‹œ ์ด๋“ค์˜ ๋ฐœ์ƒ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ์ตœ์ ํ™” ์ „๋žต์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [1, 4, 5]. --- Reflow(๋ฆฌํ”Œ๋กœ์šฐ)๋Š” ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜ ๋“ฑ ๋ ˆ์ด์•„์›ƒ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฌธ์„œ์˜ ๊ตฌ์กฐ์™€ ๊ธฐํ•˜ํ•™์  ํ˜•ํƒœ๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์ด๋ฉฐ, Repaint(๋ฆฌํŽ˜์ธํŠธ)๋Š” ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ์‹œ๊ฐ์  ์š”์†Œ(์ƒ‰์ƒ, ๋ฐฐ๊ฒฝ ๋“ฑ)๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ํ™”๋ฉด์— ๋‹ค์‹œ ํ”ฝ์…€์„ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์ด ๋‘ ๊ณผ์ •์€ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ๋ฆฌ์†Œ์Šค๋ฅผ ํฌ๊ฒŒ ์†Œ๋ชจํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ €ํ•˜์™€ ํ”„๋ ˆ์ž„ ๋“œ๋กญ์˜ ์ฃผ์š” ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค. ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์ด ๋›ฐ์–ด๋‚œ CSS๋ฅผ ์„ค๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌํ”Œ๋กœ์šฐ์™€ ๋ฆฌํŽ˜์ธํŠธ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ „๋žต์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ## ๐Ÿ“– Core Content **๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด์˜ ์—ญํ• ** ๋ธŒ๋ผ์šฐ์ €๋Š” ์ˆ˜์‹ ๋œ HTML๊ณผ CSS๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ [[DOM (Document Object Model)|DOM(Document Object Model]]๊ณผ CSSOM์„ ๊ตฌ์ถ•ํ•œ ํ›„, ๊ฐ€์‹œ์ ์ธ ์ฝ˜ํ…์ธ ๋งŒ ํฌํ•จํ•˜๋Š” ๋ Œ๋” ํŠธ๋ฆฌ([[Render Tree|Render Tree]])๋ฅผ ์ƒ์„ฑํ•œ๋‹ค [11-14]. ์ด ๋ Œ๋” ํŠธ๋ฆฌ๊ฐ€ ์™„์„ฑ๋˜๋ฉด ์š”์†Œ๋“ค์„ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๋ฆฌํ”Œ๋กœ์šฐ(Layout)์™€ ๋ฆฌํŽ˜์ธํŠธ(Paint) ๋‹จ๊ณ„๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค [1, 13]. **๋ฆฌํ”Œ๋กœ์šฐ (Reflow / Layout)** * ๋ฆฌํ”Œ๋กœ์šฐ๋Š” ๋ Œ๋” ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ํƒ์ƒ‰ํ•˜๋ฉฐ ๋ทฐํฌํŠธ ํฌ๊ธฐ์™€ ๋ฐ•์Šค ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ํ‘œ์‹œ๋˜๋Š” ์š”์†Œ์˜ ์ •ํ™•ํ•œ ๋„ˆ๋น„, ๋†’์ด, x/y ์œ„์น˜ ์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์ด๋‹ค [1, 3, 7, 15]. * HTML ์š”์†Œ๋“ค์€ ์—ฐ์†์ ์ธ ๋ฌธ์„œ ํ๋ฆ„์˜ ์ผ๋ถ€์ด๊ธฐ ๋•Œ๋ฌธ์—, ํŠน์ • ์š”์†Œ ํ•˜๋‚˜์˜ ๊ธฐํ•˜ํ•™์  ๋ณ€ํ™”๋งŒ์œผ๋กœ๋„ ํŠธ๋ฆฌ ์ „์ฒด์— ๊ฑธ์นœ ์—ฐ์‡„์ ์ธ ์žฌ๊ณ„์‚ฐ(Cascade of recalculations)์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค [1, 5, 16]. * ๋ธŒ๋ผ์šฐ์ € ์ฐฝ ํฌ๊ธฐ ์กฐ์ ˆ, DOM ๋…ธ๋“œ์˜ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ, `width`, `height`, `margin`, `padding` ๋“ฑ์˜ ๋ ˆ์ด์•„์›ƒ ๊ด€๋ จ ์†์„ฑ์„ ์กฐ์ž‘ํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค [5, 7, 17, 18]. * ์ด๋Š” ๋งค์šฐ ๊ณ„์‚ฐ ์ง‘์•ฝ์ ์ธ ์ž‘์—…์ด๋ฉฐ, ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋ธŒ๋ผ์šฐ์ € ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ฐจ๋‹จ(User-[[Blocking|Blocking]])ํ•  ์ˆ˜ ์žˆ๋‹ค [5, 7, 16]. **๋ฆฌํŽ˜์ธํŠธ (Repaint / Paint)** * ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ์ด ์™„๋ฃŒ๋œ ํ›„, ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ์™€ ์Šคํƒ€์ผ์„ ๋ฐ”ํƒ•์œผ๋กœ ํ…์ŠคํŠธ, ์ƒ‰์ƒ, ๊ทธ๋ฆผ์ž ๋“ฑ์˜ ์‹œ๊ฐ์  ์š”์†Œ๋ฅผ ํ™”๋ฉด์— ํ”ฝ์…€๋กœ ๋ž˜์Šคํ„ฐํ™”(Rasterize)ํ•˜์—ฌ ๊ทธ๋ฆฌ๋Š” ๋‹จ๊ณ„์ด๋‹ค [2, 4, 6, 7]. * `background-color`, `box-shadow`, `visibility`, ํ…์ŠคํŠธ ์ƒ‰์ƒ ๋“ฑ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์š”์†Œ์˜ ํฌ๊ธฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ์‹œ๊ฐ์ ์ธ ์†์„ฑ๋งŒ ๋ณ€๊ฒฝ๋  ๋•Œ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐœ์ƒํ•œ๋‹ค [6, 7, 18]. * ๊ธฐํ•˜ํ•™์  ๊ณ„์‚ฐ์„ ์ˆ˜๋ฐ˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌํ”Œ๋กœ์šฐ๋ณด๋‹ค๋Š” ๊ณ„์‚ฐ ๋น„์šฉ์ด ์ ๊ฒŒ ๋“ค์ง€๋งŒ, ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์ด ๊ณผ๋„ํ•˜๊ฒŒ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ (์˜ˆ: ๋ฐฐ๊ฒฝ์ƒ‰ ์• ๋‹ˆ๋ฉ”์ด์…˜) ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์„ ๋ฐฉํ•ดํ•˜์—ฌ ํ”„๋ ˆ์ž„ ๋“œ๋กญ(Jank)์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค [2, 19, 20]. **์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋žต** * **๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ ์ตœ์†Œํ™”:** DOM ํŠธ๋ฆฌ์˜ ๊นŠ์ด๋ฅผ ์ค„์ด๊ณ , ๋ณต์žกํ•œ CSS ์„ ํƒ์ž(ํŠนํžˆ ์ž์† ์„ ํƒ์ž)๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” CSS ๊ทœ์น™์„ ์ œ๊ฑฐํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์˜ ๋งค์นญ ๋ฐ ๊ณ„์‚ฐ ๋ถ€๋‹ด์„ ์ค„์—ฌ์•ผ ํ•œ๋‹ค [21, 22]. * **๋ฐฐ์นญ([[Batching|Batching]]) ๋ฐ ๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ ๋ฐฉ์ง€:** DOM ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ€๊ธ‰์  ์ผ๊ด„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์†์„ฑ์„ ์ฝ๊ณ  ์“ฐ๋Š” ์ž‘์—…์„ ์ฝ”๋“œ ๋‚ด์—์„œ ๋ฒˆ๊ฐˆ์•„ ์‹คํ–‰ํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” '๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ([[Layout Thrashing|Layout Thrashing]])' ํ˜„์ƒ์„ ํ”ผํ•ด์•ผ ํ•œ๋‹ค [7, 10, 23]. * **๋ฌธ์„œ ํ๋ฆ„ ๋ถ„๋ฆฌ:** ๋ณต์žกํ•œ ๋ Œ๋”๋ง ๋ณ€๊ฒฝ์ด๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” ๋Œ€์ƒ ์š”์†Œ์— `position: absolute` ๋˜๋Š” `position: fixed`๋ฅผ ์ ์šฉํ•˜์—ฌ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์„œ ํ๋ฆ„์—์„œ ๋ถ„๋ฆฌ(Out of the flow)์‹œํ‚ด์œผ๋กœ์จ ๋‹ค๋ฅธ ์š”์†Œ๋“ค์— ๋ฏธ์น˜๋Š” ์—ฐ์‡„์ ์ธ ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค [22]. * **GPU ๊ฐ€์† ํ™œ์šฉ:** `top`์ด๋‚˜ `left` ๋Œ€์‹  `transform: translate()` ์†์„ฑ์„ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜ `opacity`๋ฅผ ์ œ์–ดํ•˜๋ฉด, ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ํŽ˜์ธํŠธ ์‚ฌ์ดํด์„ ์œ ๋ฐœํ•˜์ง€ ์•Š๊ณ  GPU๋ฅผ ํ™œ์šฉํ•œ ์ปดํฌ์ง€ํŒ…(Compositing) ๋‹จ๊ณ„์—์„œ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์–ด 60fps์˜ ๋ถ€๋“œ๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค [2, 20, 24, 25]. --- **DOM ๊ตฌ์กฐ ๋ฐ CSS ๊ทœ์น™ ์ตœ์ ํ™”** * ๋ถˆํ•„์š”ํ•œ DOM ํŠธ๋ฆฌ์˜ ๊นŠ์ด๋ฅผ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. DOM ํŠธ๋ฆฌ์˜ ํŠน์ • ๋…ธ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฃจํŠธ๋ถ€ํ„ฐ ํ•˜์œ„ ๋…ธ๋“œ๊นŒ์ง€ ๊ณ„์‚ฐ์ด ํŒŒ๊ธ‰๋˜์–ด Reflow์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค [1]. React์˜ ๊ฒฝ์šฐ, ๋ถˆํ•„์š”ํ•œ ๋ž˜ํผ(wrapper) ๋Œ€์‹  Fragment๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DOM ๋…ธ๋“œ ์ˆ˜๋ฅผ ์ค„์ด๋ฉด ๋ธŒ๋ผ์šฐ์ €์˜ ๋ ˆ์ด์•„์›ƒ๊ณผ ํŽ˜์ธํŠธ ์†๋„๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. * ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” CSS ๊ทœ์น™์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ํŠนํžˆ ํ•˜์œ„ ์„ ํƒ์ž(descendant selectors)์™€ ๊ฐ™์ด CPU ์—ฐ์‚ฐ๋ ฅ์„ ๋” ๋งŽ์ด ์š”๊ตฌํ•˜๋Š” ๋ณต์žกํ•œ CSS ์„ ํƒ์ž์˜ ์‚ฌ์šฉ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [1]. `display: none`์„ ์‚ฌ์šฉํ•˜๋ฉด ์š”์†Œ๊ฐ€ [[Render Tree|Render Tree]]์—์„œ ์™„์ „ํžˆ ์ œ๊ฑฐ๋˜์–ด ๋ ˆ์ด์•„์›ƒ์—์„œ ๋ฐฐ์ œ๋˜๋ฏ€๋กœ, ๋ Œ๋”๋ง์„ ์–ต์ œํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. **DOM ์ ‘๊ทผ ๋ฐ ์ˆ˜์ •์˜ ์ผ๊ด„ ์ฒ˜๋ฆฌ ([[Batching|Batching]])** * ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜ ๋“ฑ์„ ๊ณ„์‚ฐํ•˜๋Š” ์†์„ฑ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ฝ๊ณ  ์“ฐ๋Š” ์ž‘์—…์„ ๊ต์ฐจ๋กœ ์‹คํ–‰ํ•˜๋ฉด "๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ([[Layout Thrashing|Layout Thrashing]])"์ด๋ผ๋Š” ๋น„ํšจ์œจ์ ์ธ Reflow๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [5]. * ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” DOM ๊ฐ’์„ ์ฝ๋Š” ๋‹จ๊ณ„์™€ ์ˆ˜์ •ํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ Œ๋”๋ง ์—”์ง„์˜ ์ž‘์—…์„ ์ผ๊ด„ ์ฒ˜๋ฆฌ(batch)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 7]. * ๋ฃจํ”„ ๋‚ด๋ถ€์—์„œ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ , ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” DOM ๋…ธ๋“œ๋‚˜ ์†์„ฑ๊ฐ’์„ ๋ณ€์ˆ˜์— ์บ์‹ฑ(Caching)ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•˜๊ฒŒ DOM ๊ตฌ์กฐ์— ๋ฐ˜๋ณต์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 8]. **์• ๋‹ˆ๋ฉ”์ด์…˜ ์ตœ์ ํ™” ๋ฐ ํ•˜๋“œ์›จ์–ด ๊ฐ€์†(GPU) ํ™œ์šฉ** * ๋ฐ•์Šค ๋ชจ๋ธ์˜ ์†์„ฑ(`width`, `height`, `margin`, `top`, `left` ๋“ฑ)์„ ์ง์ ‘์ ์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [9, 10]. * ๋Œ€์‹  ์‹œ๊ฐ์  ๋ณ€ํ™”๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ CSS์˜ `transform` ์†์„ฑ(์˜ˆ: `transform: translate()`)์ด๋‚˜ `opacity`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ƒˆ๋กœ์šด Reflow๋‚˜ Repaint ์ฃผ๊ธฐ๋ฅผ ์œ ๋ฐœํ•˜์ง€ ์•Š๊ณ  GPU๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ž์ฒด ๋ ˆ์ด์–ด์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11-14]. * ๋ณต์žกํ•œ ๋ Œ๋”๋ง ๋ณ€๊ฒฝ์ด๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” `position: absolute` ๋˜๋Š” `position: fixed`๋ฅผ ์ ์šฉํ•˜์—ฌ ํ•ด๋‹น ์š”์†Œ๋ฅผ ๋ฌธ์„œ์˜ ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„(flow)์—์„œ ๋ถ„๋ฆฌ์‹œ์ผœ ๋‹ค๋ฅธ ์š”์†Œ์— ๋ฏธ์น˜๋Š” Reflow ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1]. * [[JavaScript|JavaScript]]๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ `window.requestAnimationFrame`์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋™์‹œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋‹จ์ผ Reflow ๋ฐ Repaint ์ฃผ๊ธฐ๋กœ ํ†ตํ•ฉ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13, 15]. --- * **Reflow (Layout) ๊ฐœ๋… ๋ฐ ๋ฐœ์ƒ ์›์ธ** * Reflow๋Š” ๋ฌธ์„œ ํ๋ฆ„ ๋‚ด์—์„œ ์š”์†Œ์˜ ์œ„์น˜, ํฌ๊ธฐ(width, height, margin, padding, border ๋“ฑ)๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1, 4, 6]. * DOM ์š”์†Œ์˜ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ, ๋ธŒ๋ผ์šฐ์ € ์ฐฝ ํฌ๊ธฐ ์กฐ์ ˆ, ํฐํŠธ ํฌ๊ธฐ ๋ณ€๊ฒฝ, ๋˜๋Š” ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” CSS ์†์„ฑ ๋ณ€๊ฒฝ ์‹œ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค [4-6, 10]. * ์›น ๋ฌธ์„œ๋Š” ์—ฐ์†์ ์ธ ํ๋ฆ„์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด, ๋‹จ์ผ ์š”์†Œ์˜ ๊ตฌ์กฐ์  ๋ณ€ํ™”๊ฐ€ ๋ถ€๋ชจ๋‚˜ ์ž์‹ ์š”์†Œ ๋“ฑ DOM ํŠธ๋ฆฌ ์ „์ฒด์— ๊ฑธ์นœ ์žฌ๊ณ„์‚ฐ์„ ์—ฐ์‡„์ ์œผ๋กœ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋งค์šฐ ๋†’์€ ์‚ฌ์šฉ์ž ์ฐจ๋‹จ(User-[[Blocking|Blocking]]) ์ž‘์—…์ž…๋‹ˆ๋‹ค [1, 3, 5, 6]. * **Repaint (Paint) ๊ฐœ๋… ๋ฐ ๋ฐœ์ƒ ์›์ธ** * Repaint๋Š” ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ , ์š”์†Œ์˜ ๊ฐ€์‹œ์„ฑ, ๋ฐฐ๊ฒฝ์ƒ‰, ํ…์ŠคํŠธ ์ƒ‰์ƒ, ๊ทธ๋ฆผ์ž ๋“ฑ์˜ ์‹œ๊ฐ์  ์Šคํƒ€์ผ๋งŒ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [2, 4, 6]. * ๊ธฐํ•˜ํ•™์  ์žฌ๊ณ„์‚ฐ์ด ํ•„์š”ํ•˜์ง€ ์•Š์•„ Reflow๋ณด๋‹ค๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋น„์šฉ์ด ์ ์ง€๋งŒ, ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฒ˜๋ฆฌ ์ค‘ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋ฉด ์—ฌ์ „ํžˆ ํ”„๋ ˆ์ž„ ๋“œ๋ž์ด๋‚˜ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 9, 11]. * **Reflow / Repaint ์ตœ์†Œํ™” ๋ฐ ๋ Œ๋”๋ง ์ตœ์ ํ™” ๋ฐฉ๋ฒ•** * **DOM ์กฐ์ž‘ ์ผ๊ด„ ์ฒ˜๋ฆฌ([[Batching|Batching]]) ๋ฐ ๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ([[Layout Thrashing|Layout Thrashing]]) ๋ฐฉ์ง€**: DOM ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ž‘์—…์„ ํ˜ผํ•ฉํ•˜์ง€ ์•Š๊ณ  ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ ˆ์ด์•„์›ƒ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์žฌ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 8, 9, 12, 13]. * **GPU ๊ฐ€์† ํ™œ์šฉ (Compositing)**: `top`, `left`์™€ ๊ฐ™์€ ๋ ˆ์ด์•„์›ƒ ์†์„ฑ ๋Œ€์‹  `transform`์„, ์ƒ‰์ƒ ๋ณ€๊ฒฝ ๋Œ€์‹  `opacity`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋ฉด Reflow๋‚˜ Repaint ์—†์ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณ„๋„ ๋ ˆ์ด์–ด์—์„œ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 9, 11]. * **๊ตฌ์กฐ ๋ฐ ์Šคํƒ€์ผ ์ตœ์ ํ™”**: DOM ํŠธ๋ฆฌ์˜ ๊นŠ์ด๋ฅผ ์ค„์ด๊ณ , ์—ฐ์‚ฐ์ด ๋งŽ์ด ํ•„์š”ํ•œ ๋ณต์žกํ•œ CSS ์„ ํƒ์ž(ํŠนํžˆ ์ž์† ์„ ํƒ์ž)์˜ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [14]. ๋ ˆ์ด์•„์›ƒ ๋ณ€ํ™” ์—†์ด ์š”์†Œ๋ฅผ ์ˆจ๊ธฐ๋ ค๋ฉด `display: none` (Reflow ์œ ๋ฐœ) ๋Œ€์‹  `visibility: hidden`์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [15]. * **๋ฌธ์„œ ํ๋ฆ„(Flow)์—์„œ ๋ถ„๋ฆฌ**: ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“ฑ ๋ณต์žกํ•œ ๋ Œ๋”๋ง ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋Š” ์š”์†Œ๋Š” `position: absolute` ๋˜๋Š” `position: fixed`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ๋ณ€ ์š”์†Œ์˜ Reflow์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ๊ฒฉ๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [14]. * **React์˜ ๋ Œ๋”๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ์„ฑ๋Šฅ ์ตœ์ ํ™”** * ๊ธฐ์กด์˜ ์ง์ ‘์ ์ธ DOM ์กฐ์ž‘์€ ๋งค ๋ณ€๊ฒฝ๋งˆ๋‹ค ๋น„์šฉ์ด ๋†’์€ Reflow์™€ Repaint๋ฅผ ์œ ๋ฐœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋А๋ฆด ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค [16]. * React๋Š” **[[Virtual DOM|Virtual DOM]]**์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ์ด์ „ ์ƒํƒœ์™€ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋น„๊ต(Diffing)ํ•œ ๋’ค, ๋ณ€๊ฒฝ๋œ ์ตœ์†Œํ•œ์˜ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ์ผ๊ด„ ๋ฐ˜์˜ํ•จ์œผ๋กœ์จ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [16, 17]. * ๋˜ํ•œ [[React 18|React 18]]๋ถ€ํ„ฐ ๋„์ž…๋œ **์ž๋™ ์ผ๊ด„ ์ฒ˜๋ฆฌ([[Automatic Batching|Automatic Batching]])** ๊ธฐ๋Šฅ์€ ๋น„๋™๊ธฐ ์ž‘์—…(Promise, setTimeout ๋“ฑ) ๋‚ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—ฌ๋Ÿฌ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋‹จ ํ•œ ๋ฒˆ์˜ ๋ฆฌ๋ Œ๋”๋ง์œผ๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•˜์—ฌ DOM ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [18-20]. --- * **Reflow์™€ Repaint์˜ ๊ฐœ๋… ๋ฐ ๋ฐœ์ƒ ์›์ธ** * **Repaint:** ์š”์†Œ์˜ ์Šคํ‚จ(outline, visibility, background color ๋“ฑ)์ด ๋ณ€๊ฒฝ๋˜์–ด ๊ฐ€์‹œ์„ฑ์—๋งŒ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธธ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค [2]. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ DOM ํŠธ๋ฆฌ์˜ ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค์˜ ๊ฐ€์‹œ์„ฑ๊นŒ์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋น„์šฉ์ด ๋“ ๋‹ค [2]. * **Reflow:** ์š”์†Œ์˜ ํฌ๊ธฐ(width, height, margin, padding ๋“ฑ)๋‚˜ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ํŽ˜์ด์ง€์˜ ๋ ˆ์ด์•„์›ƒ์ด ๋ฐ”๋€” ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค [2, 3]. ํ•œ ์š”์†Œ์˜ Reflow๋Š” ์ž์‹ ์š”์†Œ, ์กฐ์ƒ ์š”์†Œ, ๊ทธ๋ฆฌ๊ณ  DOM ํŠธ๋ฆฌ์—์„œ ๋’ค๋”ฐ๋ฅด๋Š” ์š”์†Œ๋“ค์˜ ์—ฐ์‡„์ ์ธ Reflow๋ฅผ ์œ ๋ฐœํ•˜์—ฌ ๊ฑฐ์˜ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋ ˆ์ด์•„์›ƒํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์—„์ฒญ๋‚œ ์ฒ˜๋ฆฌ ๋น„์šฉ์„ ์š”๊ตฌํ•œ๋‹ค [2, 4, 8]. * **์ฃผ์š” ์›์ธ:** ์ฐฝ ํฌ๊ธฐ ์กฐ์ ˆ, ํฐํŠธ ๋ณ€๊ฒฝ, `:hover` ๋“ฑ์˜ ๊ฐ€์ƒ ํด๋ž˜์Šค ํ™œ์„ฑํ™”, ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ DOM ์กฐ์ž‘, `offsetWidth` ๋˜๋Š” `offsetHeight` ๊ณ„์‚ฐ, ์ธ๋ผ์ธ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ ๋“ฑ์ด ๋ชจ๋‘ Reflow๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•œ๋‹ค [9, 10]. * **CSS ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ตœ์ ํ™” ์ „๋žต** * **๋ ˆ์ด์•„์›ƒ ์†์„ฑ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ง€์–‘:** `width`, `height`, `margin`, `left`, `top` ๋“ฑ์˜ ์†์„ฑ์„ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ™”ํ•˜๋ฉด ์ง€์†์ ์ธ Reflow์™€ Repaint ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ๋–จ์–ด๋œจ๋ฆฐ๋‹ค [3, 5, 8, 11]. ๋Œ€์‹  ๋ ˆ์ด์•„์›ƒ ์žฌ๊ณ„์‚ฐ์„ ํ”ผํ•˜๊ณ  GPU ๊ฐ€์†(Compositing)์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” `transform`๊ณผ `opacity`๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค [8, 12, 13]. * **๊ณ ๋น„์šฉ ์†์„ฑ ์ตœ์†Œํ™” ๋ฐ `will-change` ํ™œ์šฉ:** `box-shadow`, `filter`, `border-radius`์™€ ๊ฐ™์ด ๋ Œ๋”๋ง ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์†Œ๋ชจํ•˜๋Š” ์†์„ฑ์˜ ์‚ฌ์šฉ์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค [12, 14]. ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ์š”์†Œ๋ฅผ ๋ฏธ๋ฆฌ ์•Œ๋ ค์ฃผ๋Š” `will-change` ์†์„ฑ์„ ํ™œ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋„์›€์ด ๋˜์ง€๋งŒ, ๋„ˆ๋ฌด ๋งŽ์€ ์š”์†Œ์— ๋‚จ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค [7, 15, 16]. * **์• ๋‹ˆ๋ฉ”์ด์…˜ ์š”์†Œ์˜ ์œ„์น˜ ๋…๋ฆฝ:** ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•  ์š”์†Œ์— `position: fixed` ๋˜๋Š” `absolute`๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋‹ค๋ฅธ ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„ ๋ฌด๊ฑฐ์šด Reflow ๋Œ€์‹  ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ€๋ฒผ์šด Repaint๋งŒ ๋ฐœ์ƒํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค [17, 18]. * **DOM ์กฐ์ž‘ ๋ฐ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ตœ์ ํ™”** * **DOM ์กฐ์ž‘ ์ตœ์†Œํ™” ๋ฐ ์ผ๊ด„ ์ฒ˜๋ฆฌ:** `documentFragment`๋ฅผ ์‚ฌ์šฉํ•ด DOM ์—…๋ฐ์ดํŠธ๋ฅผ ์ผ๊ด„๋กœ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ณ€๊ฒฝํ•œ ํ›„ ์›๋ณธ๊ณผ ํ•œ ๋ฒˆ์— ๊ต์ฒดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ Reflow/Repaint ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค [6, 19]. ๋˜ํ•œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ๋ฐ˜๋ณตํ•ด์„œ ์„ค์ •ํ•˜๊ธฐ๋ณด๋‹ค๋Š” CSS ํด๋ž˜์Šค ํ•œ ๋ฒˆ์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์Šคํƒ€์ผ์„ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค [17, 19]. * **๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ([[Layout Thrashing|Layout Thrashing]]) ๋ฐฉ์ง€:** DOM ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ์ข์€ ๋ฃจํ”„ ์•ˆ์—์„œ ๋ฒˆ๊ฐˆ์•„ ์ˆ˜ํ–‰ํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ์ •ํ™•ํ•œ ์ˆ˜์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ•์ œ๋กœ ๋™๊ธฐ์ ์ธ Reflow๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜์–ด ์‹ฌ๊ฐํ•œ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค [7, 10]. ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ž‘์—…์„ ๋ถ„๋ฆฌํ•˜๊ณ , `requestAnimationFrame`์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ์ฃผ๊ธฐ์— ๋งž์ถ”์–ด ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค [7, 10]. * **๊ตฌ์กฐ์  ์ตœ์ ํ™” ๊ณ ๋ ค์‚ฌํ•ญ** * **DOM ํŠธ๋ฆฌ ํ•˜๋‹จ์—์„œ์˜ ํด๋ž˜์Šค ๋ณ€๊ฒฝ:** Reflow์˜ ํŒŒ๊ธ‰ ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด, ์ƒ์œ„ ๋ž˜ํผ(wrapper) ์š”์†Œ๋ณด๋‹ค๋Š” DOM ํŠธ๋ฆฌ์—์„œ ์ตœ๋Œ€ํ•œ ํ•˜๋‹จ์— ์œ„์น˜ํ•œ ์š”์†Œ์˜ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•˜๋‹ค [20]. * **ํ…Œ์ด๋ธ” ๋ ˆ์ด์•„์›ƒ ์ง€์–‘ ๋ฐ ์„ ํƒ์ž ๋‹จ์ˆœํ™”:** ํ…Œ์ด๋ธ” ๋ ˆ์ด์•„์›ƒ์€ ๋ Œ๋”๋ง ์‹œ ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ๊ณ„์‚ฐ ํŒจ์Šค๊ฐ€ ํ•„์š”ํ•˜๊ณ , ์ž‘์€ ๋ณ€๊ฒฝ์—๋„ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๋…ธ๋“œ์— Reflow๋ฅผ ์œ ๋ฐœํ•˜๋ฏ€๋กœ ํ”ผํ•ด์•ผ ํ•œ๋‹ค(ํ•„์š”์‹œ `table-layout: fixed` ์‚ฌ์šฉ) [21, 22]. ๋”๋ถˆ์–ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋˜๊ณ  ๋ณต์žกํ•œ CSS ์„ ํƒ์ž๋Š” ๋ Œ๋”๋ง ํŒŒ์‹ฑ ์†๋„๋ฅผ ๋Šฆ์ถ”๋ฏ€๋กœ ๋‹จ์ˆœํ•˜๊ณ  ์ง์ ‘์ ์ธ ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค [19, 23, 24]. --- - **๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ดํ•ด:** ๋ธŒ๋ผ์šฐ์ €๋Š” HTML๊ณผ CSS๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ๊ฐ๊ฐ DOM๊ณผ [[CSSOM|CSSOM]]์„ ๊ตฌ์„ฑํ•˜๊ณ , ์ด๋ฅผ ๊ฒฐํ•ฉํ•ด ํ™”๋ฉด์— ๋ณด์ผ ์š”์†Œ๋“ค๋งŒ ํฌํ•จํ•˜๋Š” ๋ Œ๋” ํŠธ๋ฆฌ([[Render Tree|Render Tree]])๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [4-7]. ์ดํ›„ ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” Reflow ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ, ํ”ฝ์…€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” Repaint, ๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ๋ ˆ์ด์–ด๋ฅผ ํ•ฉ์„ฑํ•˜๋Š” Compositing ๋‹จ๊ณ„๋กœ ๋ Œ๋”๋ง์„ ๋งˆ์นฉ๋‹ˆ๋‹ค [1, 7, 8]. - **Reflow (Layout) ์ƒ์„ธ:** - ๋ทฐํฌํŠธ์˜ ํฌ๊ธฐ์™€ ๋ฐ•์Šค ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ๊ฐ€์‹œ์  ์š”์†Œ์˜ x, y ์ขŒํ‘œ ๋ฐ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค [1, 2]. - ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์˜ ํฌ๊ธฐ ์กฐ์ ˆ, DOM ์š”์†Œ์˜ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ, ๋˜๋Š” ๋„ˆ๋น„(width), ๋†’์ด(height), ์—ฌ๋ฐฑ(margin, padding)๊ณผ ๊ฐ™์ด ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” CSS ์†์„ฑ ๋ณ€๊ฒฝ ์‹œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [2, 3, 9, 10]. - HTML ์š”์†Œ๋“ค์€ ์—ฐ์†์ ์ธ ๋ฌธ์„œ ํ๋ฆ„(Document Flow) ์•ˆ์— ์กด์žฌํ•˜๋ฏ€๋กœ, ํ•œ ์š”์†Œ์˜ ๊ธฐํ•˜ํ•™์  ๋ณ€ํ™”๊ฐ€ ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊นŒ์ง€ ์—ฐ์‡„์ ์œผ๋กœ ์žฌ๊ณ„์‚ฐํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค [1, 9, 11, 12]. - **Repaint (Paint) ์ƒ์„ธ:** - ๋ ˆ์ด์•„์›ƒ(ํฌ๊ธฐ๋‚˜ ์œ„์น˜)์˜ ๋ณ€ํ™” ์—†์ด, ์š”์†Œ์˜ ์‹œ๊ฐ์  ํ˜•ํƒœ๋งŒ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [2, 3, 10]. - ๋ฐฐ๊ฒฝ์ƒ‰, ํ…์ŠคํŠธ ์ƒ‰์ƒ, ๊ทธ๋ฆผ์ž(box-shadow), ๊ฐ€์‹œ์„ฑ ๋ณ€๊ฒฝ ๋“ฑ์ด ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค [2, 3, 10]. - Reflow๋ณด๋‹ค๋Š” ์—ฐ์‚ฐ ๋น„์šฉ์ด ์ ๊ฒŒ ๋“ค์ง€๋งŒ, ์žฆ์€ Repaint ์—ญ์‹œ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์„ ๋ฐฉํ•ดํ•ด ์Šคํฌ๋กค์ด๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ ํ™”๋ฉด์ด ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ๋Š” ํ˜„์ƒ(Jank)์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 11-13]. - **์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ• ([[Optimization|Optimization]] Strategies):** - **DOM ์กฐ์ž‘ ์ตœ์†Œํ™”:** ๋ถˆํ•„์š”ํ•œ DOM ํŠธ๋ฆฌ์˜ ๊นŠ์ด๋ฅผ ์ค„์ด๊ณ  ๋ณต์žกํ•œ ํ•˜์œ„ CSS ์„ ํƒ์ž ์‚ฌ์šฉ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13, 14]. DOM ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ๋ฒˆ๊ฐˆ์•„ ํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” '๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ([[Layout Thrashing|Layout Thrashing]])'์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์กฐ์ž‘์„ ์ผ๊ด„ ์ฒ˜๋ฆฌ([[Batching|Batching]])ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [2, 15]. - **GPU ๊ฐ€์† ํ™œ์šฉ:** `top`์ด๋‚˜ `left` ์†์„ฑ ๋Œ€์‹  `transform`๊ณผ `opacity`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, Reflow์™€ Repaint๋ฅผ ์œ ๋ฐœํ•˜์ง€ ์•Š๊ณ  GPU๋ฅผ ํ†ตํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 12, 13, 16]. - **์Šคํƒ€์ผ ๋ฐ ์œ„์น˜ ์ตœ์ ํ™”:** Reflow๋ฅผ ํ”ผํ•˜๋ฉด์„œ ์š”์†Œ๋ฅผ ์ˆจ๊ธธ ๋•Œ๋Š” `display: none` ๋Œ€์‹  `visibility: hidden`์„ ์‚ฌ์šฉํ•˜๊ณ  [16], ๋ณต์žกํ•œ ๋ Œ๋”๋ง ๋ณ€ํ™”๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์žˆ๋Š” ์š”์†Œ๋Š” `position: absolute`๋‚˜ `position: fixed`๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌธ์„œ์˜ ๊ธฐ๋ณธ ํ๋ฆ„์—์„œ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [14]. --- * **๋ฆฌํ”Œ๋กœ์šฐ(Reflow)์™€ ๋ฆฌํŽ˜์ธํŠธ(Repaint)์˜ ์ •์˜ ๋ฐ ์ฐจ์ด์ ** * **Reflow (Layout):** ์š”์†Œ์˜ ๋„ˆ๋น„, ๋†’์ด, ๋งˆ์ง„, ํŒจ๋”ฉ ๋“ฑ ๊ธฐํ•˜ํ•™์  ํ˜•ํƒœ๋‚˜ ๋ ˆ์ด์•„์›ƒ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€์˜ ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ํ˜„์ƒ์ž…๋‹ˆ๋‹ค [1, 5]. ํŠน์ • ์š”์†Œ์—์„œ ๋ฆฌํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์š”์†Œ์˜ ์ž์‹, ์ƒ์œ„ ์กฐ์ƒ ์š”์†Œ, ๊ทธ๋ฆฌ๊ณ  DOM ํŠธ๋ฆฌ์˜ ๋’ค๋”ฐ๋ฅด๋Š” ์š”์†Œ๋“ค๊นŒ์ง€ ์—ฐ์‡„์ ์œผ๋กœ ๋ฆฌํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋งค์šฐ ๋†’์€ ์ฒ˜๋ฆฌ ๋น„์šฉ์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [2]. * **Repaint:** ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ์€ ๋ณ€ํ•˜์ง€ ์•Š๋˜, ๋ฐฐ๊ฒฝ์ƒ‰, ์•„์›ƒ๋ผ์ธ, ๊ฐ€์‹œ์„ฑ(visibility) ๋“ฑ ์‹œ๊ฐ์  ์š”์†Œ(skin)๋งŒ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์˜คํŽ˜๋ผ([[Opera|Opera]]) ๋ธŒ๋ผ์šฐ์ €์— ๋”ฐ๋ฅด๋ฉด, ๋ฆฌํŽ˜์ธํŠธ ์—ญ์‹œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ DOM ํŠธ๋ฆฌ์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ€์‹œ์„ฑ์„ ๊ฒ€์ฆํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค [2]. * **๋ฐœ์ƒ ์›์ธ(Triggers)** * ์œˆ๋„์šฐ ์ฐฝ ํฌ๊ธฐ ์กฐ์ ˆ, ํฐํŠธ ๋ณ€๊ฒฝ, ์Šคํƒ€์ผ์‹œํŠธ ์ถ”๊ฐ€/์ œ๊ฑฐ, DOM ์กฐ์ž‘, ์ž…๋ ฅ ์ฐฝ์˜ ํ…์ŠคํŠธ ๋ณ€๊ฒฝ ๋“ฑ์€ ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [6]. * CSS `:hover` ๊ฐ€์ƒ ํด๋ž˜์Šค ํ™œ์„ฑํ™”, ํด๋ž˜์Šค ์†์„ฑ ์กฐ์ž‘, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ๋ผ์ธ ์Šคํƒ€์ผ ์ ์šฉ ๋“ฑ๋„ ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค [6, 7]. * ํŠนํžˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ `offsetWidth`๋‚˜ `offsetHeight`์™€ ๊ฐ™์€ ๋ ˆ์ด์•„์›ƒ ์†์„ฑ์„ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜ ์ฝ๊ณ  ์“ฐ๋Š” ํ–‰์œ„๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ •ํ™•ํ•œ ์น˜์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ์ด์•„์›ƒ ํ๋ฅผ ๋น„์šฐ๊ณ  ๋™๊ธฐ์ ์œผ๋กœ ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ([[Layout Thrashing|Layout Thrashing]])์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [6, 8, 9]. * **์ตœ์ ํ™” ๋ฐ ์ตœ์†Œํ™” ๊ธฐ๋ฒ•** * **GPU ๊ฐ€์† ํ™œ์šฉ:** ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ ์šฉ ์‹œ ๋ ˆ์ด์•„์›ƒ ์†์„ฑ(width, height, top, left ๋“ฑ) ๋Œ€์‹  `transform`๊ณผ `opacity`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌํ”Œ๋กœ์šฐ์™€ ๋ฆฌํŽ˜์ธํŠธ๋ฅผ ๋ชจ๋‘ ๋ฐฉ์ง€ํ•˜๊ณ  GPU ์ปดํฌ์ง€ํŒ…(Compositing)๋งŒ ๋ฐœ์ƒ์‹œ์ผœ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10-12]. * **DOM ๋ฐ ํด๋ž˜์Šค ์กฐ์ž‘ ์ตœ์ ํ™”:** DOM ์กฐ์ž‘ ์‹œ `documentFragment`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ผ๊ด„ ์ฒ˜๋ฆฌ(batch)ํ•˜๊ฑฐ๋‚˜ `requestAnimationFrame`์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ Œ๋”๋ง ์ฃผ๊ธฐ์— ๋™๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 9, 13]. ๋˜ํ•œ ์š”์†Œ์˜ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” DOM ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ํ•œ ์•„๋ž˜์ชฝ(ํ•˜์œ„ ๋…ธ๋“œ)์—์„œ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฆฌํ”Œ๋กœ์šฐ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋…ธ๋“œ ์ˆ˜๋ฅผ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [14]. * **์ธ๋ผ์ธ ์Šคํƒ€์ผ ์ง€์–‘:** ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ , ๋Œ€์‹  ๋ฏธ๋ฆฌ ์ •์˜๋œ CSS ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ œ์–ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [7, 15]. * **์ ˆ๋Œ€ ์œ„์น˜ ์ง€์ •:** ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ๋˜๋Š” ์š”์†Œ๋Š” `position: fixed` ๋˜๋Š” `absolute`๋กœ ์„ค์ •ํ•˜์—ฌ, ๋‹ค๋ฅธ ์š”์†Œ๋“ค์˜ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ  ๋ฆฌํŽ˜์ธํŠธ๋งŒ ๋ฐœ์ƒํ•˜๋„๋ก ๊ฒฉ๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [7]. * **ํ…Œ์ด๋ธ” ๋ ˆ์ด์•„์›ƒ ์ง€์–‘:** ํ…Œ์ด๋ธ”์€ ์…€ ํฌ๊ธฐ ๋ณ€๊ฒฝ ์‹œ ์ „์ฒด ๋…ธ๋“œ์˜ ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ์œ ๋ฐœํ•˜๊ณ  ๋ Œ๋”๋ง์— ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ํŒจ์Šค(pass)๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ ˆ์ด์•„์›ƒ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค [16]. --- * **๊ฐœ๋…๊ณผ ์ฐจ์ด์  ๋ฐ ๋ฐœ์ƒ ์›์ธ** * **Reflow (Layout)**: ๋ธŒ๋ผ์šฐ์ € ์ฐฝ ํฌ๊ธฐ ์กฐ์ ˆ, ํฐํŠธ ๋ณ€๊ฒฝ, ์ƒˆ๋กœ์šด DOM ์š”์†Œ ์ถ”๊ฐ€/์ œ๊ฑฐ, `width`, `height`, `margin`, `padding`, `top` ๋“ฑ ๊ธฐํ•˜ํ•™์  ํ˜•ํƒœ๋‚˜ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์†์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [3, 6, 7]. ํ•œ ์š”์†Œ์˜ Reflow๋Š” ์ž์‹ ๋ฐ ์กฐ์ƒ ์š”์†Œ, ๊ทธ๋ฆฌ๊ณ  DOM์—์„œ ๊ทธ ๋’ค์— ๋‚˜ํƒ€๋‚˜๋Š” ๋ชจ๋“  ์š”์†Œ์˜ ์—ฐ์‡„์ ์ธ Reflow๋ฅผ ์œ ๋ฐœํ•˜๋ฏ€๋กœ ๋งค์šฐ ํฐ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค [2, 4]. * **Repaint**: `color`, `background-color`, `outline`, `visibility` ๋“ฑ ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ ๊ฒ‰๋ชจ์Šต๋งŒ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [2, 3, 6]. * **์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•œ CSS ์„ค๊ณ„ ๊ธฐ๋ฒ•** * **๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ([[Layout Thrashing|Layout Thrashing]]) ๋ฐฉ์ง€ ๋ฐ DOM ์กฐ์ž‘ ์ตœ์†Œํ™”**: [[JavaScript|JavaScript]]๋ฅผ ํ†ตํ•ด ๋‹ค์ˆ˜์˜ ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์„ค์ •ํ•˜๋ฉด ๊ฐœ๋ณ„์ ์œผ๋กœ Reflow๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [5, 8]. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์™ธ๋ถ€ CSS ํด๋ž˜์Šค์— ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ํ•œ ๋ฒˆ์˜ ์กฐ์ž‘์œผ๋กœ DOM ํŠธ๋ฆฌ์˜ ํด๋ž˜์Šค ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์ด ์„ฑ๋Šฅ๊ณผ ์œ ์ง€๋ณด์ˆ˜์— ํ›จ์”ฌ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค [8, 9]. DOM์„ ์ฝ๊ณ  ์“ฐ๋Š” ๊ณผ์ •์„ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10]. * **ํด๋ž˜์Šค ๋ณ€๊ฒฝ์˜ ๋ฒ”์œ„ ์ œํ•œ**: Reflow์˜ ํŒŒ๊ธ‰ ๋ฒ”์œ„๋ฅผ ์ค„์ด๋ ค๋ฉด DOM ํŠธ๋ฆฌ์—์„œ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋‚ฎ์€ ์œ„์น˜(ํ•˜์œ„ ๋…ธ๋“œ)์— ์žˆ๋Š” ์š”์†Œ์˜ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 11]. * **์˜ฌ๋ฐ”๋ฅธ ์• ๋‹ˆ๋ฉ”์ด์…˜(transition/keyframes) ์ „๋žต**: `width`, `height`, `box-shadow` ๋“ฑ์˜ ์†์„ฑ์„ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ง€์†์ ์œผ๋กœ Reflow์™€ Repaint๋ฅผ ์œ ๋ฐœํ•ด ํ™”๋ฉด์ด ๋Š๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 12, 13]. ๋Œ€์‹  ๋ ˆ์ด์•„์›ƒ์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋Š” `transform`๊ณผ `opacity`, `filter` ์†์„ฑ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ž‘์„ฑํ•ด์•ผ GPU ๊ฐ€์†(Compositing)์„ ํ†ตํ•œ ๋ถ€๋“œ๋Ÿฌ์šด ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค [3, 13, 14]. * **์š”์†Œ์˜ ์œ„์น˜ ๋ฐ ์†์„ฑ ๋ถ„๋ฆฌ**: ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋“ค์–ด๊ฐ„ ์š”์†Œ์— `position: fixed` ๋˜๋Š” `absolute`๋ฅผ ์ ์šฉํ•˜๋ฉด ํ•ด๋‹น ์š”์†Œ๊ฐ€ ๋ฌธ์„œ์˜ ํ๋ฆ„์—์„œ ๋ถ„๋ฆฌ๋˜์–ด ์ฃผ๋ณ€ ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋น„์šฉ์ด ํฐ ์ „์ฒด Reflow ๋Œ€์‹  Repaint๋งŒ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 8, 15]. * **์„ ํƒ์ž ๋ฐ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ ๋‹จ์ˆœํ™”**: ๋‹ค์ค‘ ๊ฒฝ๋กœ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๋ณต์žกํ•œ CSS ์„ ํƒ์ž๋ฅผ ํ”ผํ•˜๊ณ  [9], ์ „์ฒด ๋…ธ๋“œ์˜ Reflow๋ฅผ ์ž์ฃผ ์œ ๋ฐœํ•˜๋Š” ํ…Œ์ด๋ธ”(`table`) ๊ธฐ๋ฐ˜์˜ ๋ ˆ์ด์•„์›ƒ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 16]. --- **๋ฆฌํ”Œ๋กœ์šฐ(Reflow)์™€ ๋ฆฌํŽ˜์ธํŠธ(Repaint)์˜ ๊ฐœ๋… ๋ฐ ์›์ธ** * **๋ฆฌํŽ˜์ธํŠธ(Repaint):** ์•„์›ƒ๋ผ์ธ, ๊ฐ€์‹œ์„ฑ, ๋ฐฐ๊ฒฝ์ƒ‰ ๋“ฑ ์š”์†Œ์˜ ์‹œ๊ฐ์  ํ˜•ํƒœ๋งŒ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [1]. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ๊ณผ์ •์—์„œ DOM ํŠธ๋ฆฌ์˜ ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค์˜ ๊ฐ€์‹œ์„ฑ๊นŒ์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [1]. * **๋ฆฌํ”Œ๋กœ์šฐ(Reflow):** ํŽ˜์ด์ง€์˜ ์ „์ฒด ๋˜๋Š” ์ผ๋ถ€ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋ฉฐ, ๋ฆฌํŽ˜์ธํŠธ๋ณด๋‹ค ํ›จ์”ฌ ์—ฐ์‚ฐ ๋น„์šฉ์ด ํฝ๋‹ˆ๋‹ค [1, 2]. ํŠน์ • ์š”์†Œ๊ฐ€ ๋ฆฌํ”Œ๋กœ์šฐ๋˜๋ฉด ์ž์‹ ๋…ธ๋“œ, ์กฐ์ƒ ๋…ธ๋“œ๋Š” ๋ฌผ๋ก  DOM ํŠธ๋ฆฌ์—์„œ ๊ทธ ๋’ค์— ์˜ค๋Š” ์š”์†Œ๋“ค๊นŒ์ง€ ์—ฐ์‡„์ ์œผ๋กœ ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [1]. * **์ฃผ์š” ๋ฐœ์ƒ ์›์ธ:** ์ฐฝ ํฌ๊ธฐ ์กฐ์ ˆ, ํฐํŠธ ๋ณ€๊ฒฝ, DOM ์Šคํฌ๋ฆฝํŠธ ์กฐ์ž‘, `offsetWidth` ๋ฐ `offsetHeight` ๋“ฑ์˜ ๊ณ„์‚ฐ, ์ธ๋ผ์ธ ์Šคํƒ€์ผ ์„ค์ • ๋“ฑ์ด ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [3]. ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•  ๋•Œ `width`, `height`, `margin`, `padding`, `left`/`top`๊ณผ ๊ฐ™์ด ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋Š” ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋„ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์ฃผ๋œ ์›์ธ์ž…๋‹ˆ๋‹ค [4-6]. **์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” CSS ๊ตฌ์กฐ ์„ค๊ณ„ ์ „๋žต** * **DOM ํŠธ๋ฆฌ ํ•˜์œ„์—์„œ ํด๋ž˜์Šค ๋ณ€๊ฒฝํ•˜๊ธฐ:** ๋ฆฌํ”Œ๋กœ์šฐ์˜ ์—ฐ์‡„์  ํŒŒ๊ธ‰ ํšจ๊ณผ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด, ํฐ ๋ž˜ํผ(wrapper) ์š”์†Œ๋ณด๋‹ค๋Š” DOM ํŠธ๋ฆฌ์˜ ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€์žฅ ๊นŠ์€ ํ•˜๋‹จ์— ์žˆ๋Š” ์š”์†Œ์˜ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [7]. OOCSS, BEM๊ณผ ๊ฐ™์€ ๊ฐ์ฒด ์ง€ํ–ฅ์  ์ ‘๊ทผ์€ ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค ๋ณ€๊ฒฝ ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋ฆฌํ”Œ๋กœ์šฐ์˜ ์˜ํ–ฅ์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค [7]. * **๋‹ค์ค‘ ์ธ๋ผ์ธ ์Šคํƒ€์ผ ์ง€์–‘:** ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์„ค์ •ํ•˜๋ฉด ๋งค๋ฒˆ ๋ฆฌํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. ๋Œ€์‹  ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฌถ์€ ์™ธ๋ถ€ CSS ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ ํ•œ ๋ฒˆ์˜ ๋ฆฌํ”Œ๋กœ์šฐ๋งŒ ๋ฐœ์ƒํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 9]. * **ํ…Œ์ด๋ธ” ๋ ˆ์ด์•„์›ƒ ์‚ฌ์šฉ ๊ธˆ์ง€:** ํ…Œ์ด๋ธ”์€ ๋‚ด๋ถ€ ์š”์†Œ์˜ ํฌ๊ธฐ ๋ณ€ํ™”๊ฐ€ ๊ตฌ์กฐ ์ „์ฒด์˜ ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ์œ ๋ฐœํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฒˆ ๋ Œ๋”๋ง์„ ์‹œ๋„ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ ˆ์ด์•„์›ƒ์šฉ์œผ๋กœ๋Š” ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10]. ๋ถ€๋“์ดํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ `table-layout: fixed` ์†์„ฑ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค [11]. * **CSS ์ปจํ…Œ์ธ๋จผํŠธ(Containment) ํ™œ์šฉ:** `contain` ์†์„ฑ ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ํŽ˜์ด์ง€์˜ ํŠน์ • ์˜์—ญ์„ ๊ฒฉ๋ฆฌํ•˜๋„๋ก ์ง€์‹œํ•˜๋ฉด, ๋‹ค๋ฅธ ๋ถ€๋ถ„๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ๊ณผ ํŽ˜์ธํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ์Šคํƒ€์ผ ์žฌ๊ณ„์‚ฐ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12, 13]. **์• ๋‹ˆ๋ฉ”์ด์…˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•** * **GPU ๊ฐ€์† ํ™œ์šฉ:** `width`๋‚˜ `height` ๋Œ€์‹  `transform`๊ณผ `scale`, `opacity`, `filter`์™€ ๊ฐ™์€ ์†์„ฑ์„ ์• ๋‹ˆ๋ฉ”์ด์…˜์— ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 14, 15]. ์ด๋Ÿฌํ•œ ์†์„ฑ๋“ค์€ ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ(๋ฆฌํ”Œ๋กœ์šฐ)์„ ์ผ์œผํ‚ค์ง€ ์•Š๊ณ  ๋ Œ๋”๋ง ๊ณ„์ธต์—์„œ๋งŒ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ GPU ๊ฐ€์†์„ ์œ ๋„ํ•˜์—ฌ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ํš๊ธฐ์ ์œผ๋กœ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15]. * **`position: fixed` ๋˜๋Š” `absolute` ํ™œ์šฉ:** ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ๋˜๋Š” ์š”์†Œ์— ์ ˆ๋Œ€ ์œ„์น˜(`absolute` ๋˜๋Š” `fixed`)๋ฅผ ๋ถ€์—ฌํ•˜๋ฉด ํ•ด๋‹น ์š”์†Œ๊ฐ€ ๋‹ค๋ฅธ ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ฌด๊ฑฐ์šด ๋ฆฌํ”Œ๋กœ์šฐ ๋Œ€์‹  ๋น„๊ต์  ๊ฐ€๋ฒผ์šด ๋ฆฌํŽ˜์ธํŠธ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [8, 16]. * **`will-change` ์†์„ฑ๊ณผ ๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ([[Layout Thrashing|Layout Thrashing]]) ๋ฐฉ์ง€:** ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก `will-change` ์†์„ฑ์„ ํ†ตํ•ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฏธ๋ฆฌ ํžŒํŠธ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [17, 18]. ๋˜ํ•œ DOM ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , `requestAnimationFrame`์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ DOM ์—…๋ฐ์ดํŠธ๋ฅผ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์ฃผ๊ธฐ์— ๋งž์ถฐ ์ผ๊ด„ ์ฒ˜๋ฆฌ(batch)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [19, 20]. --- **๋ฆฌํ”Œ๋กœ์šฐ์™€ ๋ฆฌํŽ˜์ธํŠธ์˜ ๊ฐœ๋… ๋ฐ ๋น„์šฉ** * **๋ฆฌํ”Œ๋กœ์šฐ(Reflow):** ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ, ํฌ๊ธฐ, ์œ„์น˜ ๋“ฑ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์š”์†Œ์—์„œ ๋ฆฌํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์š”์†Œ์˜ ์ž์‹, ๋ถ€๋ชจ ๋…ธ๋“œ๋Š” ๋ฌผ๋ก  DOM ํŠธ๋ฆฌ์—์„œ ๊ทธ ๋’ค์— ์˜ค๋Š” ๋ชจ๋“  ์š”์†Œ๊นŒ์ง€ ์žฌ๊ณ„์‚ฐ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ๋งค์šฐ ๋น„์Œ‰๋‹ˆ๋‹ค [3, 5]. ์‹ฌํ•œ ๊ฒฝ์šฐ ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋ ˆ์ด์•„์›ƒํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค [5]. * **๋ฆฌํŽ˜์ธํŠธ(Repaint):** ์œค๊ณฝ์„ (outline), ๊ฐ€์‹œ์„ฑ(visibility), ๋ฐฐ๊ฒฝ์ƒ‰ ๋“ฑ ๋ ˆ์ด์•„์›ƒ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์ง€๋งŒ ์‹œ๊ฐ์ ์ธ ์Šคํ‚จ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค [3]. ๋ธŒ๋ผ์šฐ์ €๋Š” ์‹œ๊ฐ์  ๋ณ€ํ™”๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๊ฐ€์‹œ์„ฑ์„ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ด ๋˜ํ•œ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค [3]. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ Œ๋” ํŠธ๋ฆฌ ์ƒ์„ฑ ํ›„ ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•˜๊ณ  ๊ทธ ํ›„์— ํŽ˜์ธํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [6]. **๋ฐœ์ƒ ์›์ธ** * ์ฐฝ ํฌ๊ธฐ ์กฐ์ ˆ, ํฐํŠธ ๋ณ€๊ฒฝ, ์Šคํƒ€์ผ์‹œํŠธ ์ถ”๊ฐ€/์ œ๊ฑฐ, ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ(ํ…์ŠคํŠธ ํƒ€์ดํ•‘ ๋“ฑ), DOM ์กฐ์ž‘, `:hover`์™€ ๊ฐ™์€ ๊ฐ€์ƒ ํด๋ž˜์Šค ํ™œ์„ฑํ™”, `offsetWidth` ๋ฐ `offsetHeight` ์†์„ฑ ๊ณ„์‚ฐ, ์ธ๋ผ์ธ ์Šคํƒ€์ผ ์„ค์ • ๋“ฑ์ด ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [7, 8]. * ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ ์šฉ ์‹œ `width`, `height`, `margin`, `padding`, `top`, `left`, `box-shadow` ๋“ฑ์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ([[Layout Thrashing|Layout Thrashing]])๊ณผ ๋ฆฌํŽ˜์ธํŠธ ์ฃผ๊ธฐ๋ฅผ ์ด‰๋ฐœํ•˜์—ฌ ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํžˆ ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค [4, 9, 10]. **์ตœ์ ํ™” ๋ฐ ๊ฐ์†Œ ๊ธฐ๋ฒ•** * **DOM ๋ฐ ์Šคํƒ€์ผ ์กฐ์ž‘ ์ตœ์†Œํ™”:** ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ๊ฐ๊ฐ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์™ธ๋ถ€ ํด๋ž˜์Šค๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ ํ•œ ๋ฒˆ์˜ ํด๋ž˜์Šค ์†์„ฑ ์กฐ์ž‘์œผ๋กœ ๋ฆฌํ”Œ๋กœ์šฐ๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ๋ฐœ์ƒํ•˜๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 11]. DOM ํŠธ๋ฆฌ์˜ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋‚ฎ์€ ๊ณ„์ธต(ํ•˜์œ„)์—์„œ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฆฌํ”Œ๋กœ์šฐ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋…ธ๋“œ ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [12]. DOM ๋ณ€๊ฒฝ ์‹œ์—๋Š” `documentFragment`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 13]. * **์• ๋‹ˆ๋ฉ”์ด์…˜ ์ตœ์ ํ™”:** ๋ ˆ์ด์•„์›ƒ์„ ๊ฑด๋“œ๋ฆฌ๋Š” ์†์„ฑ ๋Œ€์‹  `transform`, `opacity`, `filter` ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 10, 14]. ๋˜ํ•œ `position: fixed` ๋˜๋Š” `absolute`์ธ ์š”์†Œ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•˜๋ฉด ์ „์ฒด ๋ฌธ์„œ์˜ ๋ฆฌํ”Œ๋กœ์šฐ ๋Œ€์‹  ๋ถ€๋ถ„์ ์ธ ๋ฆฌํŽ˜์ธํŠธ๋งŒ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15]. * **๋ธŒ๋ผ์šฐ์ € ํžŒํŒ…(Hinting) ๋ฐ ๋™๊ธฐํ™”:** ์žฆ์€ ๋ณ€๊ฒฝ์ด ์˜ˆ์ƒ๋˜๋Š” ์š”์†Œ์— `will-change` ์†์„ฑ์„ ๋ถ€์—ฌํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ Œ๋”๋ง์„ ๋ฏธ๋ฆฌ ์ตœ์ ํ™”ํ•˜๋„๋ก ์œ ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16-18]. ์•„์šธ๋Ÿฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฆฌํŽ˜์ธํŠธ ์ฃผ๊ธฐ์™€ ๋™๊ธฐํ™”๋˜๋Š” `requestAnimationFrame`์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13, 18]. * **๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ ๋ฐฉ์ง€ ๋ฐ ๊ธฐํƒ€ ์ฃผ์˜์‚ฌํ•ญ:** DOM์„ ์ฝ๊ณ  ์“ฐ๋Š” ์ž‘์—…์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ(๋ฐฐ์นญ) ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ•์ œ๋กœ ๋™๊ธฐ์‹ ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13, 18]. ๋˜ํ•œ ๋ Œ๋”๋ง์„ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์ž‘์€ ๋ณ€๊ฒฝ์—๋„ ๋ชจ๋“  ๋…ธ๋“œ์˜ ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ…Œ์ด๋ธ”(Table) ๋ ˆ์ด์•„์›ƒ ์‚ฌ์šฉ์„ ํ”ผํ•˜๊ณ  [19], ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ณ  ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ CSS ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค [11]. --- **Reflow์™€ Repaint์˜ ๊ฐœ๋… ๋ฐ ๋ฐœ์ƒ ์›์ธ** * **Reflow (Layout)**: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ํŽ˜์ด์ง€์˜ ๋ ˆ์ด์•„์›ƒ์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. `width`, `height`, `margin`, `padding`, `top`, `left`์™€ ๊ฐ™์ด ์š”์†Œ์˜ ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์†์„ฑ์ด ์• ๋‹ˆ๋ฉ”์ด์…˜๋˜๊ฑฐ๋‚˜ ์กฐ์ž‘๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [1, 2]. ํ•œ ์š”์†Œ์—์„œ ๋ฆฌํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ž์‹ ์š”์†Œ, ๋ถ€๋ชจ ์š”์†Œ ๋ฐ DOM ํŠธ๋ฆฌ ๊ตฌ์กฐ์—์„œ ๋’ค๋”ฐ๋ฅด๋Š” ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊นŒ์ง€ ์—ฐ์‡„์ ์ธ ๋ฆฌํ”Œ๋กœ์šฐ๊ฐ€ ์œ ๋ฐœ๋˜๋ฏ€๋กœ ์„ฑ๋Šฅ์— ๋งค์šฐ ์น˜๋ช…์ ์ž…๋‹ˆ๋‹ค [3]. ๋ฆฌํ”Œ๋กœ์šฐ๋Š” ์ฐฝ ํฌ๊ธฐ ์กฐ์ ˆ, ํฐํŠธ ๋ณ€๊ฒฝ, DOM ๋…ธ๋“œ ์กฐ์ž‘, ๊ทธ๋ฆฌ๊ณ  [[JavaScript|JavaScript]]์—์„œ `offsetWidth`๋‚˜ `offsetHeight`๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋ ˆ์ด์•„์›ƒ ์ •๋ณด๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ๋„ ์œ ๋ฐœ๋ฉ๋‹ˆ๋‹ค [4]. * **Repaint (Paint)**: ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์š”์†Œ์˜ ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ `color`, `background-color`, `visibility`, `box-shadow`, `outline` ๊ฐ™์€ ์‹œ๊ฐ์  ์†์„ฑ๋งŒ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [2, 3, 5]. ๋ฆฌํ”Œ๋กœ์šฐ๋ณด๋‹ค๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ€๋ณ์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค์˜ ๊ฐ€์‹œ์„ฑ ๋“ฑ์„ ํ™•์ธํ•˜๊ณ  ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ•˜๋ฏ€๋กœ ์—ฌ์ „ํžˆ ๋†’์€ ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค [3, 6]. **์„ฑ๋Šฅ ์ตœ์ ํ™”(Reflow & Repaint ๊ฐ์†Œ) ํ•ต์‹ฌ ๊ธฐ๋ฒ•** * **Compositing(ํ•ฉ์„ฑ) ์†์„ฑ ํ™œ์šฉ**: ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ๋ฆฌํ”Œ๋กœ์šฐ์™€ ๋ฆฌํŽ˜์ธํŠธ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์†์„ฑ ๋Œ€์‹  `transform`๊ณผ `opacity`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค [6, 7]. ์ด ์†์„ฑ๋“ค์€ ๋ธŒ๋ผ์šฐ์ €์˜ GPU ๊ฐ€์†์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ(Composite ๋‹จ๊ณ„๋งŒ ์ˆ˜ํ–‰)๋˜๋ฏ€๋กœ ๋ ˆ์ด์•„์›ƒ ์žฌ๊ณ„์‚ฐ์ด๋‚˜ ํŽ˜์ธํŒ… ๊ณผ์ • ์—†์ด ๋ถ€๋“œ๋Ÿฌ์šด 60fps ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2, 8]. * **DOM ์กฐ์ž‘ ๋ฐ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ์˜ ์ผ๊ด„ ์ฒ˜๋ฆฌ([[Batching|Batching]])**: JavaScript๋ฅผ ํ†ตํ•ด ๊ฐœ๋ณ„์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์„ค์ •ํ•˜๋ฉด ์žฆ์€ ๋ฆฌํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [9]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด `documentFragment`๋ฅผ ํ™œ์šฉํ•ด DOM ์กฐ์ž‘์„ ์ผ๊ด„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, JavaScript๋กœ ๊ฐœ๋ณ„ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋Œ€์‹  CSS ํด๋ž˜์Šค๋ฅผ ํ•œ ๋ฒˆ์— ๊ต์ฒดํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10, 11]. * **[[Layout Thrashing|Layout Thrashing]](๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ) ๋ฐฉ์ง€**: JavaScript ๋ฃจํ”„ ๋‚ด๋ถ€์—์„œ DOM์˜ ๋ ˆ์ด์•„์›ƒ ๊ฐ’(์˜ˆ: `offsetWidth`)์„ ์ฝ๊ณ  ์ฆ‰์‹œ ์“ฐ๋Š” ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ •ํ™•ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ•์ œ๋กœ ๋™๊ธฐ์ ์ธ ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ํ”„๋ ˆ์ž„๋ฅ ์ด ๊ธ‰๊ฐํ•ฉ๋‹ˆ๋‹ค [12, 13]. DOM ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ์ž‘์—…์„ ๋ถ„๋ฆฌํ•˜๊ณ , `requestAnimationFrame`์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฆฌํŽ˜์ธํŠธ ์ฃผ๊ธฐ์— ๋งž์ถฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [12, 13]. * **DOM ํŠธ๋ฆฌ ํ•˜๋‹จ๋ถ€์—์„œ์˜ ํด๋ž˜์Šค ๋ณ€๊ฒฝ**: ๋ฆฌํ”Œ๋กœ์šฐ์˜ ์—ฐ์‡„ ์ž‘์šฉ ์Šค์ฝ”ํ”„๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด, ์ตœ์ƒ์œ„ ๋ž˜ํผ(Wrapper)๋‚˜ ๋ถ€๋ชจ ์š”์†Œ ๋Œ€์‹  ํ™”๋ฉด ๋ณ€๊ฒฝ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฐ€์žฅ ํ•˜์œ„์˜ DOM ๋…ธ๋“œ์—์„œ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [14]. * **๋ ˆ์ด์•„์›ƒ ํ๋ฆ„์—์„œ ๋ถ„๋ฆฌ (`position: absolute/fixed`)**: ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ๋˜๋Š” ์š”์†Œ์— `position: absolute` ๋˜๋Š” `fixed`๋ฅผ ๋ถ€์—ฌํ•˜๋ฉด ํ•ด๋‹น ์š”์†Œ๊ฐ€ ๋ฌธ์„œ์˜ ์ •์ƒ์ ์ธ ํ๋ฆ„(Flow)์—์„œ ๋น ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [9, 15]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ค‘ ์ฃผ๋ณ€ ์š”์†Œ๋“ค์˜ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„ ์ „์ฒด ๋ฆฌํ”Œ๋กœ์šฐ ๋Œ€์‹  ํ•ด๋‹น ์š”์†Œ์˜ ๋ฆฌํŽ˜์ธํŠธ๋งŒ ์œ ๋ฐœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [15]. * **`will-change` ์†์„ฑ์˜ ํ™œ์šฉ**: ํŠน์ • ์š”์†Œ๊ฐ€ ๊ณง ์• ๋‹ˆ๋ฉ”์ด์…˜๋  ๊ฒƒ์ž„์„ ๋ธŒ๋ผ์šฐ์ €์— ๋ฏธ๋ฆฌ ์•Œ๋ ค์ฃผ์–ด ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ์ค€๋น„ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 17]. ์ด ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์†Œ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์„ฑ๋Šฅ ๋ฌธ์ œ ๋ฐœ์ƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ ์จ์•ผ ํ•˜๋ฉฐ ๊ณผ๋„ํ•œ ์‚ฌ์šฉ์€ ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 18]. * **ํ…Œ์ด๋ธ” ๋ ˆ์ด์•„์›ƒ ๋ฐ ๋ณต์žกํ•œ ์„ ํƒ์ž ํšŒํ”ผ**: ํ…Œ์ด๋ธ”(``)์€ ๋‚ด์šฉ๋ฌผ์ด๋‚˜ ์…€ ํ•˜๋‚˜์˜ ํฌ๊ธฐ๊ฐ€ ๋ณ€ํ•ด๋„ ์ „์ฒด ํ…Œ์ด๋ธ” ๋…ธ๋“œ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ๋ฆฌํ”Œ๋กœ์šฐ ํŒจ์Šค๋ฅผ ๊ฑฐ์น  ์ˆ˜ ์žˆ์–ด ๋ ˆ์ด์•„์›ƒ ์šฉ๋„๋กœ ๋ถ€์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [19]. ๋˜ํ•œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ CSS ์„ ํƒ์ž๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ํŒŒ์‹ฑ ์†๋„๋ฅผ ๋Šฆ์ถ”๋ฏ€๋กœ ์ตœ๋Œ€ํ•œ ์ง๊ด€์ ์ด๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 20]. ## โš–๏ธ Trade-offs & Caveats No trade-offs available. ## ๐Ÿ”— Knowledge Connections - **Related Topics:** [[Critical Rendering Path|Critical Rendering Path]], DOM & CSSOM, [[Render Tree|Render Tree]], GPU Compositing - **Projects/Contexts:** [[Frontend|Frontend]] Performance Optimization, React Virtual DOM and [[Reconciliation|Reconciliation]] - **Contradictions/Notes:** ์†Œ์Šค์— ๋”ฐ๋ฅด๋ฉด ๋ฆฌํŽ˜์ธํŠธ(Repaint)๋Š” ๋ ˆ์ด์•„์›ƒ ์žฌ๊ณ„์‚ฐ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌํ”Œ๋กœ์šฐ(Reflow)๋ณด๋‹ค ์ƒ๋Œ€์ ์œผ๋กœ ์‹œ์Šคํ…œ ๋น„์šฉ์ด ๋œ ๋“œ๋Š” ์ž‘์—…์œผ๋กœ ์„ค๋ช…๋œ๋‹ค [2, 20]. ๊ทธ๋Ÿฌ๋‚˜ ๋‘ ์ž‘์—… ๋ชจ๋‘ ๊ณผ๋„ํ•˜๊ฒŒ ํŠธ๋ฆฌ๊ฑฐ๋  ๊ฒฝ์šฐ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ ์œ ํ•˜๊ณ  ๋ฐฐํ„ฐ๋ฆฌ ์†Œ๋ชจ ๋ฐ ๋ฒ„๋ฒ…์ž„(Jank)์„ ์œ ๋ฐœํ•˜๋ฏ€๋กœ, ์„ฑ๋Šฅ ์ตœ์ ํ™” ์‹œ์—๋Š” ๋‘˜ ์ค‘ ์–ด๋А ํ•˜๋‚˜๋ฅผ ๋ฌด์‹œํ•˜์ง€ ์•Š๊ณ  ๋‘ ๊ณผ์ • ๋ชจ๋‘๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์ตœ์ ํ™”์˜ ํ•ต์‹ฌ์ด๋‹ค [19, 20]. --- *Last updated: 2026-04-25* --- - **Related Topics:** [[แ„‡แ…ณแ„…แ…กแ„‹แ…ฎแ„Œแ…ฅ แ„…แ…ฆแ†ซแ„ƒแ…ฅแ„…แ…ตแ†ผ แ„€แ…ชแ„Œแ…ฅแ†ผ (HTML โ†’ CSSOM โ†’ Render Tree)|๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ • (HTML โ†’ CSSOM โ†’ Render Tree]], Virtual DOM, [[แ„…แ…ฆแ†ซแ„ƒแ…ฅแ„…แ…ตแ†ผ แ„Žแ…ฌแ„Œแ…ฅแ†จแ„’แ…ช แ„€แ…ขแ„‚แ…งแ†ท แ„‰แ…ฅแ†ฏแ„†แ…งแ†ผ แ„Œแ…กแ„…แ…ญ|๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ฐœ๋… ์„ค๋ช… ์ž๋ฃŒ]] - **Projects/Contexts:** [[React แ„€แ…ตแ„‡แ…กแ†ซ แ„‘แ…ณแ„…แ…ฉแ†ซแ„แ…ณแ„‹แ…ฆแ†ซแ„ƒแ…ณ แ„‰แ…ฅแ†ผแ„‚แ…ณแ†ผ แ„Žแ…ฌแ„Œแ…ฅแ†จแ„’แ…ช|React ๊ธฐ๋ฐ˜ ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™”]], [[แ„ƒแ…กแ†ซแ„‹แ…ตแ†ฏ แ„‘แ…ฆแ„‹แ…ตแ„Œแ…ต แ„‹แ…ขแ„‘แ…ณแ†ฏแ„…แ…ตแ„แ…ฆแ„‹แ…ตแ„‰แ…งแ†ซ(SPA) UI แ„‰แ…ฅแ†ผแ„‚แ…ณแ†ผ แ„€แ…ชแ†ซแ„…แ…ต|๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(SPA) UI ์„ฑ๋Šฅ ๊ด€๋ฆฌ]] - **Contradictions/Notes:** ๋ณต์žกํ•œ CSS ์„ ํƒ์ž๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋„์›€์ด ๋˜์ง€๋งŒ, ์†Œ์Šค์— ๋”ฐ๋ฅด๋ฉด ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ CSS ๊ทœ์น™ ์ตœ์ ํ™”๋กœ ์–ป๋Š” ๋ Œ๋”๋ง ์†๋„ ๊ฐœ์„ ์€ ๋งˆ์ดํฌ๋กœ์ดˆ ๋‹จ์œ„๋กœ ๋ฏธ๋ฏธํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค [16]. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋Š” ์ง๊ด€์ ์ธ CSS ์ตœ์ ํ™”์— ๋งค๋ชฐ๋˜๊ธฐ๋ณด๋‹ค๋Š” ๋ฐ˜๋“œ์‹œ ์ธก์ • ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ๊ฐ€์žฅ ๋А๋ฆฐ ๋ณ‘๋ชฉ ํ˜„์ƒ(Reflow/Repaint๊ฐ€ ์žฆ์€ ๊ณณ)์„ ์ฐพ์•„ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘๊ณ  ์ตœ์ ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [16, 17]. --- *Last updated: 2026-04-25* --- - **Related Topics:** [[แ„‡แ…ณแ„…แ…กแ„‹แ…ฎแ„Œแ…ฅ แ„…แ…ฆแ†ซแ„ƒแ…ฅแ„…แ…ตแ†ผ แ„€แ…ชแ„Œแ…ฅแ†ผ (HTML โ†’ CSSOM โ†’ Render Tree)|๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ • (HTML โ†’ CSSOM โ†’ Render Tree]], [[DOM vs Virtual DOM|DOM vs Virtual DOM]] - **Projects/Contexts:** [[React แ„€แ…ตแ„‡แ…กแ†ซ แ„‰แ…ตแ†ผแ„€แ…ณแ†ฏ แ„‘แ…ฆแ„‹แ…ตแ„Œแ…ต แ„‹แ…ขแ„‘แ…ณแ†ฏแ„…แ…ตแ„แ…ฆแ„‹แ…ตแ„‰แ…งแ†ซ(SPA)แ„‹แ…ด แ„…แ…ฆแ†ซแ„ƒแ…ฅแ„…แ…ตแ†ผ แ„Žแ…ฌแ„Œแ…ฅแ†จแ„’แ…ช|React ๊ธฐ๋ฐ˜ ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(SPA)์˜ ๋ Œ๋”๋ง ์ตœ์ ํ™”]], [[Automatic Batchingแ„‹แ…ณแ†ฏ แ„แ…ฉแ†ผแ„’แ…กแ†ซ React 18 แ„‰แ…ฅแ†ผแ„‚แ…ณแ†ผ แ„Žแ…ฌแ„Œแ…ฅแ†จแ„’แ…ช|Automatic Batching์„ ํ†ตํ•œ React 18 ์„ฑ๋Šฅ ์ตœ์ ํ™”]] - **Contradictions/Notes:** ์†Œ์Šค ๋ฌธ์„œ๋“ค์— ๋”ฐ๋ฅด๋ฉด `display: none`์€ ์š”์†Œ๋ฅผ ๋ Œ๋” ํŠธ๋ฆฌ์—์„œ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋ฏ€๋กœ ์ „์ฒด์ ์ธ ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ(Reflow)์„ ์œ ๋ฐœํ•˜์ง€๋งŒ, ์‹œ๊ฐ์ ์œผ๋กœ๋งŒ ๋ณด์ด์ง€ ์•Š๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” `visibility: hidden`์„ ์‚ฌ์šฉํ•˜๋ฉด Reflow๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค [15, 21]. --- *Last updated: 2026-04-25* --- - **Related Topics:** CSS ์„ฑ๋Šฅ ์ตœ์ ํ™”, CSS ์• ๋‹ˆ๋ฉ”์ด์…˜(transition / keyframes), DOM ์กฐ์ž‘๊ณผ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ, GPU ๊ฐ€์†(Compositing) - **Projects/Contexts:** ํ™•์žฅ ๊ฐ€๋Šฅํ•œ CSS ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„, ์‹ค๋ฌด์—์„œ์˜ CSS ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ๊ฐœ์„  - **Contradictions/Notes:** ๋ธŒ๋ผ์šฐ์ € ์ œ์กฐ์‚ฌ๋“ค์ด ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ๋ฒ”์œผ๋กœ ์ง€๋ชฉํ•˜๋Š” Reflow์™€ Repaint ์ž์ฒด๋ฅผ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ์™„์ „ํžˆ ์—†์•จ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋Š” ๋ถˆํ•„์š”ํ•œ ๋ ˆ์ด์•„์›ƒ ์†์„ฑ ๋ณ€๊ฒฝ์ด๋‚˜ ๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ์„ ํ”ผํ•˜๋„๋ก ์„ค๊ณ„ํ•จ์œผ๋กœ์จ ๊ทธ ์˜ํ–ฅ์„ ํš๊ธฐ์ ์œผ๋กœ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [20, 25, 26]. `will-change` ์†์„ฑ ๋˜ํ•œ ๋ธŒ๋ผ์šฐ์ € ์ตœ์ ํ™”๋ฅผ ๋•๋Š” ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์ด์ง€๋งŒ, ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์˜คํžˆ๋ ค ๋””๋ฐ”์ด์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ ๊ฐˆ์‹œ์ผœ ํ”„๋ ˆ์ž„ ๋“œ๋ž์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [15, 16, 27]. --- *Last updated: 2026-04-26* --- - **Related Topics:** `[[Critical Rendering Path|Critical Rendering Path]]`, `DOM ๋ฐ CSSOM`, `Render Tree`, `Compositing (GPU ๊ฐ€์†)`, `[[Virtual DOM|Virtual DOM]]` - **Projects/Contexts:** `ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ([[Web Performance Optimization|Web Performance Optimization]])`, `React ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์•„ํ‚คํ…์ฒ˜` - **Contradictions/Notes:** ์†Œ์Šค ๊ฐ„์˜ ์ƒ์ถฉ๋˜๋Š” ์˜๊ฒฌ์€ ์—†์œผ๋ฉฐ, ๋ชจ๋“  ์ž๋ฃŒ๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ Reflow์™€ Repaint์˜ ๋ฐœ์ƒ ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฐ 60 FPS ์œ ์ง€์— ํ•„์ˆ˜์ ์ด๋ผ๊ณ  ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค [8, 12, 17, 18]. --- *Last updated: 2026-04-25* --- - **Related Topics:** [[CSS แ„‰แ…ฅแ†ผแ„‚แ…ณแ†ผ แ„Žแ…ฌแ„Œแ…ฅแ†จแ„’แ…ช(CSS Performance Optimization)|CSS ์„ฑ๋Šฅ ์ตœ์ ํ™”(CSS Performance Optimization]], ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ตœ์ ํ™”(Animation Optimization), ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ(Rendering Pipeline), [[แ„…แ…ฆแ„‹แ…ตแ„‹แ…กแ„‹แ…ฎแ†บ แ„‰แ…ณแ„…แ…ขแ„‰แ…ตแ†ผ(Layout Thrashing)|๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ(Layout Thrashing]] - **Projects/Contexts:** ์‹ค๋ฌด์—์„œ์˜ CSS ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์„ค๊ณ„, ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์˜ UI ์„ฑ๋Šฅ ๊ฐœ์„  - **Contradictions/Notes:** `will-change` ์†์„ฑ์€ ๋ธŒ๋ผ์šฐ์ €์— ์š”์†Œ์˜ ๋ณ€๊ฒฝ์„ ๋ฏธ๋ฆฌ ์•Œ๋ฆผ์œผ๋กœ์จ ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํžŒํŠธ๋ฅผ ์ฃผ์ง€๋งŒ, ๋„ˆ๋ฌด ๋งŽ์€ ์š”์†Œ์— ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‚จ์šฉํ•  ๊ฒฝ์šฐ ์˜คํžˆ๋ ค ์ž์›์„ ์†Œ๋ชจํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ธฐ์กด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๋•Œ ์ตœํ›„์˜ ์ˆ˜๋‹จ(last resort)์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [9, 17, 18]. ๋˜ํ•œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌ(dirty reflows)ํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐ„ํ˜น ๋ Œ๋”๋ง ๋ฒ„๊ทธ(์˜ˆ: ๊ทธ๋ฆผ์ž๊ฐ€ ์ž”๋ฅ˜ํ•˜๋Š” ํ˜„์ƒ ๋“ฑ)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ๊ฐ•์ œ๋กœ ๋ฆฌํ”Œ๋กœ์šฐ๋ฅผ ์œ ๋ฐœํ•˜์—ฌ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์˜ˆ์™ธ ์ƒํ™ฉ๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค [19, 20]. --- *Last updated: 2026-04-26* --- - **Related Topics:** CSS ์• ๋‹ˆ๋ฉ”์ด์…˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” (transition / keyframes), [[CSS แ„€แ…ฎแ„Œแ…ฉ แ„‰แ…ฅแ†ฏแ„€แ…จ แ„‡แ…กแ†ผแ„‰แ…ตแ†จ|CSS ๊ตฌ์กฐ ์„ค๊ณ„ ๋ฐฉ์‹]], DOM ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ - **Projects/Contexts:** [[แ„‰แ…ตแ†ฏแ„†แ…ฎแ„‹แ…ฆแ„‰แ…ฅ CSS แ„€แ…ชแ†ซแ„…แ…ตแ„’แ…กแ„‚แ…ณแ†ซ แ„‡แ…กแ†ผแ„‡แ…ฅแ†ธ|์‹ค๋ฌด์—์„œ CSS ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•]], ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•˜๊ฒŒ CSS ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์ถ• - **Contradictions/Notes:** ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์š”์†Œ์— ๋Œ€ํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฏธ๋ฆฌ ์ตœ์ ํ™”๋ฅผ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” `will-change` ์†์„ฑ์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค [10, 17, 18]. ํ•˜์ง€๋งŒ ์ด ์†์„ฑ์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์€ ์š”์†Œ์— ๋‚จ์šฉํ•  ๊ฒฝ์šฐ ๋„๋ฆฌ์–ด ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์†Œ๋ชจ์‹œ์ผœ ์„ฑ๋Šฅ ์ €ํ•˜(Performance issues)๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ๋งŒ ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [17, 18]. --- *Last updated: 2026-04-26* --- - **Related Topics:** [[แ„‰แ…ตแ†ฏแ„†แ…ฎแ„‹แ…ฆแ„‰แ…ฅ CSS แ„€แ…ชแ†ซแ„…แ…ตแ„’แ…กแ„‚แ…ณแ†ซ แ„‡แ…กแ†ผแ„‡แ…ฅแ†ธ|์‹ค๋ฌด์—์„œ CSS ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•]], ์• ๋‹ˆ๋ฉ”์ด์…˜ (transition / keyframes), CSS ๊ตฌ์กฐ ์„ค๊ณ„ ๋ฐฉ์‹ BEM - **Projects/Contexts:** ์‹ค๋ฌด์—์„œ ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์˜ CSS๋ฅผ ์„ค๊ณ„ํ•˜๊ฑฐ๋‚˜ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ UI ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•  ๋•Œ, ํ™”๋ คํ•จ("์˜ˆ์˜๊ฒŒ")์— ์น˜์ค‘ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์ฝ”๋“œ๋ฅผ ํ”ผํ•˜๊ณ , ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ™•๋ณด๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ง€์นจ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. - **Contradictions/Notes:** ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” `will-change` ์†์„ฑ์˜ ๊ฒฝ์šฐ, ๋ธŒ๋ผ์šฐ์ €์˜ ์ตœ์ ํ™”๋ฅผ ๋•๋Š” ์ข‹์€ ํžŒํŠธ๊ฐ€ ๋˜์ง€๋งŒ ํ•„์š” ์ด์ƒ์œผ๋กœ ๋งŽ์€ ์š”์†Œ์— ๋‚จ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์†Œ๋ชจํ•˜์—ฌ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [17, 18]. ๋˜ํ•œ, ๊ทนํ•œ์˜ ์ƒํ™ฉ์—์„œ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์‹œ๊ฐ์  ๋ถ€๋“œ๋Ÿฌ์›€์„ ๋‹ค์†Œ ํฌ์ƒํ•˜๋”๋ผ๋„ ํ•œ ๋ฒˆ์— ์ด๋™ํ•˜๋Š” ํ”ฝ์…€ ํญ์„ ๋„“ํ˜€ CPU์˜ ๋ถ€ํ•˜(๋ฆฌํ”Œ๋กœ์šฐ ๊ณผ๋ถ€ํ•˜)๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ ๋“ฑ์—์„œ ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16]. --- *Last updated: 2026-04-26* --- - **Related Topics:** [[CSS แ„‹แ…ขแ„‚แ…ตแ„†แ…ฆแ„‹แ…ตแ„‰แ…งแ†ซ แ„Žแ…ฌแ„Œแ…ฅแ†จแ„’แ…ช(CSS Animations Optimization)|CSS ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ตœ์ ํ™”(CSS Animations Optimization]], [[แ„…แ…ฆแ„‹แ…ตแ„‹แ…กแ„‹แ…ฎแ†บ แ„‰แ…ณแ„…แ…ขแ„‰แ…ตแ†ผ(Layout Thrashing)|๋ ˆ์ด์•„์›ƒ ์Šค๋ž˜์‹ฑ(Layout Thrashing]], [[แ„…แ…ฆแ†ซแ„ƒแ…ฅแ„…แ…ตแ†ผ แ„‘แ…กแ„‹แ…ตแ„‘แ…ณแ„…แ…กแ„‹แ…ตแ†ซ(Rendering Pipeline)|๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ(Rendering Pipeline]] - **Projects/Contexts:** [[แ„ƒแ…ขแ„€แ…ฒแ„†แ…ฉ แ„‘แ…ณแ„…แ…ฉแ†ซแ„แ…ณแ„‹แ…ฆแ†ซแ„ƒแ…ณ แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ(Large Frontend Projects)|๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ(Large Frontend Projects]], [[แ„‡แ…กแ†ซแ„‹แ…ณแ†ผแ„’แ…งแ†ผ แ„ƒแ…ตแ„Œแ…กแ„‹แ…ตแ†ซ แ„†แ…ตแ†พ แ„‹แ…ตแ†ซแ„แ…ฅแ„…แ…ขแ†จแ„แ…ตแ„‡แ…ณ UI(Responsive and Interactive UI)|๋ฐ˜์‘ํ˜• ๋””์ž์ธ ๋ฐ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ UI(Responsive and Interactive UI]] - **Contradictions/Notes:** ์†Œ์Šค์— ๋”ฐ๋ฅด๋ฉด `will-change` ์†์„ฑ์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋„์›€์ด ๋˜์ง€๋งŒ, ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์˜คํžˆ๋ ค ๋ธŒ๋ผ์šฐ์ €์˜ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์†Œ๋ชจํ•˜์—ฌ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ผญ ํ•„์š”ํ•œ ์š”์†Œ(์ตœํ›„์˜ ์ˆ˜๋‹จ)์—๋งŒ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค [16, 17]. --- *Last updated: 2026-04-26* --- - **Related Topics:** CSS ์• ๋‹ˆ๋ฉ”์ด์…˜(transition / keyframes), CSS ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ - **Projects/Contexts:** [[แ„‰แ…ตแ†ฏแ„†แ…ฎแ„‹แ…ฆแ„‰แ…ฅ CSS แ„€แ…ชแ†ซแ„…แ…ตแ„’แ…กแ„‚แ…ณแ†ซ แ„‡แ…กแ†ผแ„‡แ…ฅแ†ธ|์‹ค๋ฌด์—์„œ CSS ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•]], ๋ฐ˜์‘ํ˜• ๋””์ž์ธ ๋ฐ ๊ณ ์„ฑ๋Šฅ UI ๊ตฌํ˜„ - **Contradictions/Notes:** ์†Œ์Šค ๋ฌธํ—Œ๋“ค์€ `will-change` ์†์„ฑ์ด ๋ฆฌํ”Œ๋กœ์šฐ ๋ฐ ํŽ˜์ธํŠธ๋ฅผ ๋Œ€๋น„ํ•œ ์ตœ์ ํ™”์— ๋„์›€์„ ์ค€๋‹ค๊ณ  ์†Œ๊ฐœํ•˜๋ฉด์„œ๋„, ์ด๋ฅผ ๋„ˆ๋ฌด ๋งŽ์€ ์š”์†Œ์— ๋‚จ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฏธ๋ฆฌ ์˜ˆ์ธกํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋„๋ฆฌ์–ด ๋ธŒ๋ผ์šฐ์ € ๋ฆฌ์†Œ์Šค์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋ชจ์‹œ์ผœ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ(bottleneck)์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ผ๊ด€๋˜๊ฒŒ ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค [16-18]. --- *Last updated: 2026-04-26*