-
[React] ๋ฆฌ์กํธ๋ Reflow, Repaint ์ด์๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ์๊น? (feat. ๊ฐ์๋)๐ Browser 2023. 2. 20. 19:12
๐ ์๋ก
์ ์ ์ธ ์น์ฌ์ดํธ, ๋์ ๋ณ๊ฒฝ์ด ์ ์ ์น์ฌ์ดํธ๋ผ๋ฉด ๋ฌธ์ ๊ฐ ์๊ฒ ์ง๋ง, SPA์ฒ๋ผ ๋ ๋ณ๊ฒฝ์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ์น์ฌ์ดํธ์ ๊ฒฝ์ฐ ๋ ๋๋ง ๊ณผ์ ์์ ๊ฐ ๋ ธ๋์ ๊ดํด ๋ง์ ์ฐ์ฐ์ ์ํํ์ฌ ์น์๋ฒ ์ฑ๋ฅ ์ด์์ ์์ธ์ด ๋ ์ ์์ต๋๋ค. ๋ฆฌ์กํธ๋ ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ์์๊น์?
(๋ ๋๋ง ๊ณผ์ ๊ณผ ์น์๋ฒ ์ฑ๋ฅ ์ด์์ ๊ณต๊ฐ์ด ๊ฐ์ง ์๋๋ค๋ฉด ์๋ ๐ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง์ ํ๋ฆ?๋ถํฐ ์ฝ์ด๋ณด์๊ธธ ์ถ์ฒ๋๋ฆฝ๋๋ค)
๐ DOM์ด ๋ญ๊ฐ์?
์ ํฌ๊ฐ ๋ถ๋ฅด๋ DOM์ DOM ํธ๋ฆฌ์ ๋๋ค. DOM ํธ๋ฆฌ๋ ๋ฐ๋ก / ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ๊ณ ๋ ์กฐ์ํ ์ ์๋๋ก / ์๋ต์ผ๋ก ๋ฐ์์จ HTMLํ์ผ์ ๊ฐ ์์๋ค์ / ๋ ธ๋๋ก ํ๋ / ํธ๋ฆฌ ํํ์ ํ์ฑ๋ณธ์ด๋๋๋ค.
์ด๋ ํ ์์์ ๊ฐ๋ฐ์๊ฐ ์์ฑ์ ๋ถ์ฌํ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ๊ทธ ์์๋ฅผ ๋ด์ ๋ ธ๋๋ฅผ ๋ ํธ๋ฆฌ์์ ์ฐพ๊ณ , ์์ ํ ์์ ๋ฐ ๊ทธ ์์์์๋ฅผ ์ ๊ฑฐํ๊ณ , ์๋กญ๊ฒ ์์ ํ ์์๋ก ๊ต์ฒดํฉ๋๋ค. ์ดํ ๋ค์ ๋ ์ด์์๊ณผ ํ์ธํ ๊ณผ์ ์ด ์งํ๋๊ฒ ๋์ฃ .
๋ฆฌ์กํธ๋ "๊ฐ์๋ (Virtual DOM)"์ด๋ผ๋ ์๋ฆฌ๋ก ๋ ๋น ๋ฅธ! ์ฌ์ฉ์ฑ์ ์ ๊ณตํด ์ค๋๋ค.
๐ ๋ฆฌ์กํธ ๊ฐ์๋๊ณผ ์กฐ์ ๊ณผ์
๊ฐ์๋์ ์ค์ ๋์ ๋ณต์ฌ๋ณธ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ด ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ธ์ ํธ ํํ๋ก ์ ์ฅ๋์ด ์์ต๋๋ค. ๋ฆฌ์กํธ๋ 2๊ฐ์ ๊ฐ์๋์ ๋ง๋ค์ด, ํ๋๋ ๋ณ๊ฒฝ ์ , ๋ค๋ฅธ ํ๋๋ ๋ณ๊ฒฝ ํ ํํ๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
๋ ๋ณต์ฌ๋ณธ์ ๋น๊ตํ์ฌ ์ ํํ ์ด๋ค ์์๊ฐ ๋ณํ๋์ง ์ฐพ์๋ด๋ Diffing ๊ณผ์ ์ ๊ฑฐ์น ํ → ๋ฑ ๋ฐ๋ ๋ถ๋ถ๋ค๋ง ์ค์ ๋ธ๋ผ์ฐ์ ์ ํ ๋ฒ์ ์ ์ฉ(Batch Update)์์ผ์ฃผ๋ Reconciliation ๊ณผ์ ์ ์งํํฉ๋๋ค.
์ด๋ ๋์์ ์ ๊ฑฐ ๋ฐ ๊ต์ฒดํ๋ ๊ณผ์ ๋ณด๋ค JS ๊ฐ์ฒด ์์ฒด๋ฅผ ์กฐ์ํ๋ ๊ณผ์ ์ด ๋ ์ฝ๊ณ ๋น ๋ฅด๊ธฐ์ ๋ฆฌ์กํธ๋ ๋น ๋ฅธ ์ฌ์ฉ์ฑ์ ์ ๊ณตํฉ๋๋ค.
๋ํ, ๋ ์กฐ์์ด ๋ฐ์ํ๋ฉด ๊ฐ์ ๋์์ ๋ชจ๋ ์ฐ์ฐ์ ํ๋ฒ์ ์ฒ๋ฆฌํจ์ผ๋ก์จ Reflow, Repaint๋ฅผ ์ต์ํํ์ฌ ๋ ๋๋ง ๊ณผ์ ์ ์ฑ๋ฅ ์ด์๋ฅผ ํด๊ฒฐํ์์ต๋๋ค.
๐ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง์ ํ๋ฆ?๋ ๋๋ง ๊ณผ์ ์ ์ดํดํ๋ฉด ๋ถํ์ํ ๋ ๋๋ง์ด ๋ฐ์ํ๋ ๊ณผ์ ์ ์ดํดํ ์ ์๊ณ , ์ด ๊ณผ์ ์ ์ต์ํํจ์ผ๋ก์จ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ URL๋ฅผ ์ ๋ ฅ ํ, ๋ธ๋ผ์ฐ์ ๊ฐ ๊ฒ์์ด์ธ์ง URL์ธ์ง ํ๋จํ ํ, URL๋ผ๋ฉด ๋คํธ์ํฌ ํธ์ถ์ ์์ํฉ๋๋ค. ์๋ต์ผ๋ก html, css, javascript, static (img์ ๊ฐ์) ํ์ผ์ ๋ฐ์์ค๊ฒ ๋๋๋ฐ, ๋ฐ์์จ ํ์ผ์ ํ๋ฉด์ ๋ ๋๋ง ํด์ฃผ๊ธฐ ์ํด html ํ์ผ์ ๋ ๋๋ง ์์ง์๊ฒ ์ ๋ฌํด ๋ค์ ๊ณผ์ ์ ์งํํฉ๋๋ค.
(๋ธ๋ผ์ฐ์ ๋ฅผ ๊ตฌ์ฑํ๋ ์์ง: ๋ฐฐ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ๋ ํฐ Event Loop ์ดํด)
1. DOM ํธ๋ฆฌ ์์ฑ๋ ๋๋ง ์์ง์ ๋ฉ์ธ ์ค๋ ๋๋ ์ ๋ฌ๋ฐ์ HTMLํ์ผ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋ DOM ํธ๋ฆฌ ํํ๋ก ๋ฐํํฉ๋๋ค.
2. CSSOM ํธ๋ฆฌ ์์ฑ
๋ฐ๋ก ์ ์ฉ๋ ์คํ์ผ๋ง + ์คํ์ผ๋ง์ด ์ ์ฉ๋์ง ์์ ์์์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ์ ๋ํดํธ ์คํ์ผ๋ง์ ์ ์ฉํ์ฌ CSSOM์ด๋ผ๋ ํธ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
3. ์ ๋ ํธ๋ฆฌ๋ฅผ ๊ฒฐํฉํ์ฌ Render ํธ๋ฆฌ ์์ฑ
DOM ํธ๋ฆฌ & CSSOM ํธ๋ฆฌ๋ฅผ ๊ฒฐํฉํ์ฌ ⇒ Render ํธ๋ฆฌ ํํฉ๋๋ค.
display:none; ์์ฑ์ด ์ค์ ๋ ๋ ธ๋๋ Render ํธ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ณผ์ ์์ ์ ์ธ๋ฉ๋๋ค. visibility: invisible;์ ์ ์ฌํ ๊ธฐ๋ฅ์ ํ์ง๋ง, ๊ณต๊ฐ์ ์ฐจ์งํ๋ ์์๊ฐ ๋ณด์ด์ง ์๊ฒ๋ง ํ๊ธฐ ๋๋ฌธ์ Render ํธ๋ฆฌ์ ํฌํจ๋ฉ๋๋ค.
4. Attachment
๋ชจ๋ ๋ ธ๋๋ attach ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ด ๊ณผ์ ์์ attach ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด์ ๋ชจ๋ ์คํ์ผ ์ ๋ณด๊ฐ ๋๊ธฐ์ ์ผ๋ก ๊ณ์ฐ๋๊ณ ๊ฐ์ฒด ํํ๋ก ๋ฐํํฉ๋๋ค.
5. ๋ ์ด์์ Layout
ํธ๋ฆฌ ๋ด ๋ ธ๋๋ค์ ์์น/ํฌ๊ธฐ/์์ ์ ๋ณด(์ต์์ ์์ ๋งจ ๋ฐ์ ๋ฐฐ์นํ๋ ๋ฑ 3์ฐจ์)๋ฅผ ๊ณ์ฐํ์ฌ ๊ฐ ๋ ธ๋์ ์ขํ๋ฅผ ๋ถ์ฌํ๊ณ ํ๋ฉด์ ๋ฐฐ์นํฉ๋๋ค.
6. ํ์ธํธ Paint
๋ ์ด์์ ๋จ๊ณ์์ ๋ฐฐ์น๋ ์์๋ค์ ์์ ์ ํ๊ณ ํ๋ฉด์ ๊ทธ๋ ค์ค๋๋ค.
๐ Reflow & Repaint
ํ๋ฉด์ ํ์๋ ํ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋์ ์กฐ์ํ๊ฒ ๋๋ฉด, ๊ฐ ๋ ธ๋์ ์ขํ๋ฅผ ๊ณ์ฐํ๊ณ ๋ถ์ฌํ๋ ๋ ์ด์์ ๊ณผ์ (reflow)๊ณผ ์์์ ์ ํ๋ ํ์ธํ ๊ณผ์ (repaint) ์ด ๋ค์ ์งํ๋ฉ๋๋ค.
reflow๋ position, width, height, margin, display, overflow ๋ฑ ์ ์ค์ ํ ๋ (์ฆ ์์ฑ๋ DOM ๋ ธ๋์ ๋ ์ด์์์ด ๋ณ๊ฒฝ๋ ๋) ์ํฅ๋ฐ์ ๋ชจ๋ ๋ ธ๋์ ์์น๋ฅผ ๋ค์ ๊ณ์ฐํ์ฌ ๋ ๋ ํธ๋ฆฌ๋ฅผ ์ฌ์์ฑํ๋ ๊ณผ์ ์ ๋๋ค.
- ์ธ์ ๋ฐ์ํ๋์?
- ํ์ด์ง ์ด๊ธฐ ๋ ๋๋ง (์ต์ด Layout ๊ณผ์ )
- ์๋์ฐ ๋ฆฌ์ฌ์ด์ง (Viewport ํฌ๊ธฐ ๋ณ๊ฒฝ์)
- DOM ๋ ธ๋์ ์ถ๊ฐ, ์ ๊ฑฐ
- DOM ๋ ธ๋์ ์์น, ํฌ๊ธฐ ๋ณ๊ฒฝ (margin, padding, border, width, height ๋ฑ..)
- ์ด๋ฏธ์ง ํฌ๊ธฐ ๋ณ๊ฒฝ
- ํฐํธ ๋ณ๊ฒฝ, ํ ์คํธ ๋ด์ฉ ๋ณ๊ฒฝ
- CSS3 ์ ๋๋ฉ์ด์ ๊ณผ ํธ๋์ง์
- offset, scrollTop, scrollLeft๊ณผ ๊ฐ์ ๊ณ์ฐ๋ ์คํ์ผ ์ ๋ณด ์์ฒญ
- ์ต์ ํ ๋ฐฉ๋ฒ๋ก
- ๊ฐ์ฅ ํ์ ๋ ธ๋์ ์คํ์ผ๋ง ๋ณ๊ฒฝ์ ์ฐ์ ์ ๋ณ๊ฒฝํ์ฌ, ๊ฐ์ธ๋ ์์ ๋ ธ๋์ reflow๋ฅผ ์ต์ํ.
- ์ ๋๋ฉ์ด์
์ด ์๋ ์๋ฆฌ๋จผํธ
- ์์น๊ฐ ๊ณ์ ๋ฐ๋๊ธฐ ๋๋ฌธ์ position ์์ฑ์ fixed, absolute๋ก ์ง์ ํ์ฌ ์ง์ ๋ ๋ ธ๋๋ฅผ ์ ์ฒด ๋ ธ๋์์ ๋ถ๋ฆฌ์์ผ ํด๋น ๋ ธ๋์๋ง Reflow๊ฐ ๋ฐ์ํ๋๋ก ์ ํ
- cssText๋ก ํ๋ฒ์ ์คํ์ผ๋งํ๋ ๋ฐฉ๋ฒ์ต์ ํ ๋ฐฉ๋ฒ?
// bad const body = document.body; body.style.width = '50px'; body.style.height = '100px'; // good const body = document.body; body.style.cssText = 'width: 50px; heigh: 100px;';
- ์คํ์ผ๋ง ํ๊ทธ
- left, right, width, height < transform
- visibility/display < opacity์คํ์ผ๋ง ํ๊ทธ
repaint๋ background, background-image, color, outline, text-decoration ๋ฑ์ ์ค์ ํ ๋, ์ฌ์์ฑ๋ ๋ ๋ํธ๋ฆฌ์ ๋ค์ ์์ ์ ํ๊ณ ํ๋ฉด์ ๊ทธ๋ ค์ฃผ๋ ๊ณผ์ ์ ๋๋ค.
background-color, visibility์ ๊ฐ์ด ๋ ์ด์์์ ์ํฅ์ ์ฃผ์ง ์๋ ์คํ์ผ ์์ฑ๋ง ๋ณ๊ฒฝ๋์์ ๊ฒฝ์ฐ์๋ Reflow๊ฐ ์ํ๋์ง ์์ Repaint๋ง ์ํ๋ฉ๋๋ค
์ฐธ์กฐ์๋ฃ:
์ค๋ฌด๋ ํ ์ ๋ง์๋ฉฐ ๋๋ด๋ ๋ฆฌ์กํธ+TDD ์์
Reflow or Repaint(or ReDraw) ๊ณผ์ ์ค๋ช ๋ฐ ์ต์ ํ ๋ฐฉ๋ฒ
'๐ Browser' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- ์ธ์ ๋ฐ์ํ๋์?