--- 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]. * **ํ ์ด๋ธ ๋ ์ด์์ ๋ฐ ๋ณต์กํ ์ ํ์ ํํผ**: ํ ์ด๋ธ(`