VirtualDOM
ํ์ต ํค์๋
Virtual Dom ๋?
DOM์ด๋?
์น ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ๊ณผ์
ํ์ฑ
,๋ ๋๋ง
,DOM
,CSSOM
,Render Tree
,๋ฆฌ๋ ๋๋ง
,์๋ฐ์คํฌ๋ฆฝํธ ํ์ฑ
,
์น ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ์ ๋ฐ์ดํธ ํ๋ ๊ณผ์
Reconciliation(์ฌ์กฐ์ ) ๊ณผ์ ์ ๋ฌด์์ธ๊ฐ?
React ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ
React Developer Tools
React StrictMode
Virtual Dom
๐ Virtual DOM์ ํ์ ๋ฐฐ๊ฒฝ
1.DOM์ด๋?
Document Object Model
๋ธ๋ผ์ฐ์ ๋ ๋ฌธ์์ด ํ์์ HTML์ ๊ณง๋ฐ๋ก ์ดํดํ ์ ์๊ธฐ ๋๋ฌธ์, ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ๊ณ ํ์ฉํ ์ ์๋ ๊ตฌ์กฐ๋ก์ ๋ณํ์ด ํ์ํ๋ค. DOM(Document Object Model)์ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ์์ง์ HTML parser์ ์ํด ์์ฑ๋ 'ํธ๋ฆฌ' ๊ตฌ์กฐ์ Node ๊ฐ์ฒด ๋ชจ๋ธ ์ด๋ค.

2. ์น ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ๊ณผ์
๋ ๋๋ง ์์ง ์ด URI๋ฅผ ํตํด ์์ฒญ์ ๋ฐ์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋ง ํ๋ ์ญํ์ ์ํ.
Critical Rendering path
๋ธ๋ผ์ฐ์ ๋ HTML,CSS, ์๋ฐ์คํฌ๋ฆฝํธ, ์ด๋ฏธ์ง, ํฐํธ ํ์ผ ๋ฑ ๋ ๋๋ง์ ํ์ํ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ณ ์๋ฒ๋ก ๋ถํฐ ์๋ต ๋ฐ๋๋ค.
๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ์์ง์ ์๋ฒ๋ก๋ถํฐ ์๋ต๋ HTML,CSS๋ฅผ ํ์ฑํ์ฌ DOM(Document Object Model)๊ณผ CSSOM(CSS Object Model)๋ฅผ ์์ฑํ๊ณ ์ด๋ค์ ๊ฒฐํฉํ์ฌ Render Tree๋ฅผ ์์ฑํ๋ค.
๋ธ๋ผ์ฐ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์๋ฒ๋ก ๋ถํฐ ์๋ต๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฑํ์ฌ AST(Abstract Syntax Tree)๋ฅผ ์์ฑํ๊ณ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ์ฌ ์คํํ๋ค. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ DOM API๋ฅผ ํตํด DOM์ด๋ CSSOM๋ฅผ ๋ณ๊ฒฝ ํ ์ ์๋ค. ๋ณ๊ฒฝ๋ DOM๊ณผ CSSOM์ ๋ค์ Render Tree๋ก ๊ฒฐํฉ๋๋ค.
Render Tree๋ฅผ ๊ธฐ๋ฐ์ผ๋ก HTML์์์ ๋ ์ด์์์ ๊ณ์ฐํ๊ณ ๋ธ๋ผ์ฐ์ ์ ํ๋ฉด์ ํ์ธํ ํ๋ค.
3๋ฒ ๊ณผ์ ์ ์ํด์ 4๋ฒ์์ ๋ค์ ๋ ์ด์์์ ์ฌ๊ณ์ฐ ํ๋ ์ํฉ์ Reflow๋ผ๊ณ ๋ถ๋ฅธ๋ค.
3. ์น ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ์
๋ฐ์ดํธ ํ๋ ๊ณผ์

DOM์ ์์ ํ ๋๋ง๋ค Render Tree์ ์์ฑ๋ถํฐ Layout(Reflow),Painting(Repaint)์ ๊ณผ์ ์ ๋ค์ ์ํํด์ผ ํ๋ค.

์ฑ๋ฅ ์ ํ์ ์ฃผ์ ์์ธ์ DOM์ ์์ ํ ๋ ๋ฐ์ํ๋ Reflow, Repaint ๊ณผ์ ์ ์๋ค. Reflow๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ์์๋ ์ฑ๋ฅ์ ํ๊ฐ ๋ฐ์ํ๋ฉฐ, ์น ํ์ด์ง์ DOM์ด ๋ณต์กํ๊ฒ ๊ตฌ์ฑ๋์ด ์๊ณ CSS๊ฐ ๋ง์ด ์ ์ฉ๋ ์ฌ์ดํธ์ผ์๋ก ๋์ฑ ์ฌํด์ง๋ค.
Reflow ๋ ์ด์์ ๊ณ์ฐ์ ๋ค์ ํ๋ ๊ฒ์ผ๋ก, Reflow๊ฐ ๋ฐ์ํ๋ฉด Repaint๋ ํ์ฐ์ ์ผ๋ก ๋ฐ์ HTML ์์๋ค์ด ์์น์ ํฌ๊ธฐ๋ฅผ ๋ค์ ๊ณ์ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์, ๋ฆฌํ์ธํธ์ ๋นํด์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค. ์ฆ, ๋ณ๊ฒฝํ๋ ค๋ ํน์ ์์์ ์์น์ ํฌ๊ธฐ๋ฟ ์๋๋ผ, ์ฐ๊ด๋ ๋ค๋ฅธ ์์๋ค์ ์์น์ ํฌ๊ธฐ๊น์ง ์ฌ๊ณ์ฐ ํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
Repaint ์ฌ๊ฒฐํฉ๋ Render Tree๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ ํ๋ฉด์ ํ์ธํธ ํ๋ ๊ฒ์ ๋งํ๋ค.

์๋ฐ์คํฌ๋ฆฝํธ๋ก DOM์กฐ์์ ๋ณํ๋ ์ํ๋ฅผ ๋ฐ์ํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ๋ ๋ค์ ๋ ๋๋งํ๊ฒ ๋๋ค. ๋ ๋๋งํ๋ ๊ณผ์ ์์ Layout์ ์ฌ๊ณ์ฐํ๋ ๊ณผ์ ์ ๋น์ฉ์ด ์์๋๊ณ ์๊ฐ ์์๊ฐ ๋๋ ๊ณผ์ ์ด๋ค. ์ด๊ธฐ์ ์นํ์ด์ง์์๋ DOM์ ์กฐ์ํ๋ ๊ณผ์ ์ด ๋ง์ง ์์์ง๋ง ํ๋ ๋์ ์ธ ์น์ ์ฌ์ฉ์์์ ๊ต๋ฅ๊ฐ ํ๋ฐํ๊ฒ ์ผ์ด๋๊ธฐ์ DOM์ ์กฐ์ํด์ผํ๋ ์ํฉ์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ๊ฒ ๋๋ค. ์ฆ์ ๋ ๋๋ง์ผ๋ก Reflow ํ์ ๊ณ์ ๋ฐ์ํ๊ฒ ๋๋ค๋ฉด ์ฑ๋ฅ์ ํ์ ์์ธ์ด ๋๊ฒ ๋๋ค. ์ฑ๋ฅ์ ํ๋ฅผ ์ต์ํํ๊ธฐ ์ํด์๋ ๊ฒฐ๊ตญ DOM์ ์ต์ํ์ผ๋ก ์์ ํด์ผ ํ๋ค. ์ด๋ฌํ ๋ฌธ์ ์ ์ ๊ฐ์ ํ๊ธฐ ์ํด React๋ Virtual DOM์ ํ์ํ๊ฒ ํ๋ค.
๐ Virtual DOM๋?
์ค์ DOM์ ๊ตฌ์กฐ์ ๋น์ทํ, React ๊ฐ์ฒด์ ํธ๋ฆฌ
Virtual DOM์ ๋ณ๊ฒฝ ๋ด์ญ์ ํ ๋ฒ์ ๋ชจ์ผ๊ณ (๋ฒํผ๋ง) ์ค์ DOM๊ณผ ๋ณ๊ฒฝ๋ Virtual DOM์ ์ฐจ์ด๋ฅผ ํ๋จํ ํ, ๊ตฌ์ฑ์์์ ๋ณ๊ฒฝ์ด ๋ถ๋ถ๋ง ์ฐพ์ ๋ณ๊ฒฝํ๊ณ ๊ทธ์ ๋ฐ๋ฅธ ๋ ๋๋ง์ ํ ๋ฒ๋ง ํ๋ ๊ฒ์ผ๋ก ๋ ๋๋ง ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ๋ค.
Reconciliation(์ฌ์กฐ์ )๊ณผ์ ์ ๋ฌด์์ธ๊ฐ?
UI์ ๊ฐ์์ ์ธ ํํ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ React DOM๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์ค์ DOM๊ณผ ๋๊ธฐํํ๋ ํ๋ก๊ทธ๋์ ๊ฐ๋
Virtual DOM์ ์ฌ์ฉํ๋ฉด ์ค์ DOM์ ์ ๊ทผํ๋ฉฐ ์กฐ์ํ๋ ๋์ , ์ด๋ฅผ ์ถ์ํํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ์ฌ ์ฌ์ฉํ๋ค. DOM์ ์ํ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ , ๋ณ๊ฒฝ ์ ๊ณผ ๋ณ๊ฒฝ ํ์ ์ํ๋ฅผ ๋น๊ต ํ๋ค ์ต์ํ์ ๋ด์ฉ๋ง ๋ฐ์ํ์ฌ ์ฑ๋ฅ ํฅ์์ ์ด๋์ด๋ธ๋ค. DOM์ ์ํ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ณ์ ์ฌ๋ ค๋๊ณ , DOM์ ๋ณ๊ฒฝ ์์ ๊ฒฝ์ฐ ํด๋น ๋ณ๊ฒฝ ์ฌํญ๋ง ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
โ๐ป VirtualDOM์ ๋ํ ์ ๋ฆฌ
React์ VirtualDOM์ ์ค์ DOM ๋ ๋๋ง ๊ณผ์ ์ ์ต์ํ์ผ๋ก ์ฐ์ฐํ๊ฒ ํ์ฌ ๋ธ๋ผ์ฐ์ ์ ์ฑ๋ฅ์ ํฅ์ ํด์ค๋ค.
Virtual DOM์ ๋น๊ต(DIFF)๋ฅผ ํตํด ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์ผ๋ถ๋ถ์ ์ค์ DOM์ ๋ฐ์ํ์ฌ ๋ ๋๋งํ๊ฒ ํ๋ค.
VirtualDOM์ ์ถ์ํํ๊ธฐ ๋๋ฌธ์ ์ง๊ด์ ์ผ๋ก ํ์ธ ํ ์ ์์ง๋ง, DOM์ด ๋ณํ๋ ๋ถ๋ถ์ ๊ฐ์งํ๊ณ ์ค์ DOM์ ๋๊ธฐํ ํด์ค์ผ๋ก์ ์ ์ง๋ณด์๊ฐ ๊ฐ๋ฅํ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋๊ฒ์ ๋์์ฃผ๊ณ ์ถฉ๋ถํ ๋น ๋ฅด๊ฒ ํด์ค๋ค.
๋ฆฌ์กํธ์ ์์ฐ์ฑ(์๋ํ๋ฐ์ถ์ํ)์ ๊ทน๋ํ ํ๊ธฐ ์ํด์ ์ต์ ํ ํ๋ ์์ ์ด ํ์ํ๋.
๐ ์ฐธ๊ณ
๐ React ์ฑ๋ฅ ์ต์ ํ
React์ VirtualDOM์ด ๋ ๋๋ง์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํ ๋๊ตฌ์ด์ง๋ง, ๋๊ตฌ๋ฅผ ์๋ชป ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ์คํ๋ ค ์ญํจ๊ณผ๊ฐ ๋ ์ ์๋ค. ๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌ๊ธฐ๊ฐ ์ปค์ง ์๋ก ์ฑ๋ฅ๋ฌธ์ ๋ ๋ฐ์ ๋๋ค. ๊ทธ๋ ๊ธฐ์ ์ต์ ํ๋ฅผ ํ๊ธฐ ์ํ ์ ๋ต๋ค์ด ์กด์ฌํ๋ค.
๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ํผํ๊ธฐ
shouldComponentUpdate
๋ผ์ดํ ์ฌ์ดํด ๋ฉ์๋,React.memo
์ฌ์ฉํด์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ๋ฐฉ์ง
list ๋ ๋๋ง ์ key ์์ฑ ์ฌ์ฉ
key๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ๊ฒฝ๋ ํญ๋ชฉ, ์๋ก์ด ํญ๋ชฉ ๋๋ ์ญ์ ๋ ํญ๋ชฉ์ ๋น ๋ฅด๊ฒ ์๋ณ ํ ์ ์๋ค.
์ปดํฌ๋ํธ์ ์ง์ฐ ๋ก๋ฉ
ํ์ํ์ง ์์ ์ปดํฌ๋ํธ๊ฐ ์๋ ๊ฒฝ์ฐ React.lazy()๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ฐ ๋ก๋ฉ ์ด๊ธฐ๋ก๋ํด์ผ ํ๋ ์ฝ๋์์ ์ค์ด๋ค์ด ๋ ๋น ๋ฅธ ๋ก๋ ์๊ฐ์ ์ป์ ์ ์๋ค.
๋ฐฐํฌ ์ ํ๋ก๋์ ๋น๋ฑ ์ฌ์ฉ
๊ฐ๋ฐ์ฉ React ๋น๋์๋ ๊ฐ๋ฐ ์ค์ ๋์์ด ๋๋ ์ถ๊ฐ ๊ฒฝ๊ณ ๊ฐ ํฌํจ๋์ด ์์ง๋ง, ์ค์ ๋ก ์ฑ์ ์ฌ์ฉํ ๋๋ ๋ถํ์ํ๋ฉฐ ์ฑ ์ฑ๋ฅ์ ์ ํ์ํด
์ฑ์ ์ฑ๋ฅ ํ๋กํ์ผ๋ง
React DevTools์ Profiler ํญ์ ์ฌ์ฉํ์ฌ ์ฑ์ ๋ ๋๋ง "๋น์ฉ"์ ์ธก์ ํ๊ณ ์ต์ ํ๊ฐ ํ์ํ ๋ถ๋ถ์ ์๋ณ
๐ฅ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ์ ๋ต
๋ณ๋ชฉ ํ์ ์๋ณ ๋ฐ ์์
React Developer Tools์
Profiler
์ฌ์ฉํ์ฌ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฑ์ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ค.
๋ฉ๋ชจ์ด์ ์ด์
๋์ผํ props๋ฅผ ๊ฐ์ง ํจ์ ์ปดํฌ๋ํธ์ ๋ถํ์ํ ๋ค์ ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํด
React.memo
๋ฅผ ์ฌ์ฉํ๋ค.
useCallback
์์กด์ฑ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ๋ณ๊ฒฝ๋๋ ๋ฉ๋ชจ์ด์ ์ด์ ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐํํ๊ธฐ ์ํด
useCallback
์ ์ฌ์ฉํ๋ค.
useMemo
์์กด์ฑ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ๋ค์ ๊ณ์ฐ๋๋ ๋ฉ๋ชจ์ด์ ์ด์ ๋ ๊ฐ์ ๋ฐํํ๊ธฐ ์ํด
useMemo
์ ์ฌ์ฉํ๋ค.
์ง์ฐ ๋ก๋ฉ๊ณผ ์ฝ๋ ๋ถํ
React.lazy์ Suspense๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ถํ ๊ณผ ์ง์ฐ ๋ก๋ฉ์ ๊ตฌํํ์ฌ ์ด๊ธฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
๐ ์ฐธ๊ณ
React Developer Tools
๐ ๏ธ React Developer Tools
ํ์ฅํ๋ก๊ทธ๋จ์ ํตํด React ์ปดํฌ๋ํธ์ ๊ตฌ์กฐ๋ฅผ ํ์ธ ํ ์ ์๋ profiler๋ฅผ ํตํด ์ฑ๋ฅ ์ฒดํฌ๋ฅผ ํ ์ ์๋ ๋๊ตฌ์ด๋ค.

๐ React StrictMode๋ ๋ฌด์์ธ๊ฐ?
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์๊ฒฉ ๋ชจ๋๊ฐ ์๋ค. ์ฝ๋ ํ์ผ ์๋จ์ "use strict"๋ฅผ ์จ ๋์ผ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๋ ์กฐ๊ธ ๋ ์๊ฒฉํ๊ฒ ์ฝ๋๋ฅผ ๊ฒ์ฌํ๋ค. ๋ฆฌ์กํธ์๋ ์ด์ ์ ์ฌํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋
<StrictMode />
๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ์๋ค.
์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์์๋ด๊ธฐ ์ํ ๋๊ตฌ
Fragment์ ๊ฐ์ด UI๋ฅผ ๋ ๋๋งํ์ง ์์ผ๋ฉฐ, ์์๋ค์ ๋ํ ๋ถ๊ฐ์ ์ธ ๊ฒ์ฌ์ ๊ฒฝ๊ณ ๋ฅผ ํ์ฑํํ๋ค.
Strict ๋ชจ๋๋ ๊ฐ๋ฐ ๋ชจ๋์์๋ง ํ์ฑํ๋๊ธฐ ๋๋ฌธ์, ํ๋ก๋์ ๋น๋์๋ ์ํฅ์ ๋ผ์น์ง ์๋๋ค.
StrictMode๋ ์๋์ ๊ฐ์ ๋ถ๋ถ์์ ๋์์ด ๋๋ค.
์์ ํ์ง ์์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ ๋ฐ๊ฒฌ
๋ ๊ฑฐ์ ๋ฌธ์์ด ref ์ฌ์ฉ์ ๋ํ ๊ฒฝ๊ณ
๊ถ์ฅ๋์ง ์๋ findDOMNode ์ฌ์ฉ์ ๋ํ ๊ฒฝ๊ณ
์์์น ๋ชปํ ๋ถ์์ฉ ๊ฒ์ฌ
๋ ๊ฑฐ์ context API ๊ฒ์ฌ
Ensuring reusable state
Strict ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฆฌ์กํธ๊ฐ ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ฒ์ฌํ๊ณ ์๋ชป ์ฌ์ฉ๋ ๋ถ๋ถ์ ์ฐ๋ฆฌ์๊ฒ ์๋ ค์ค๋ค. ์ด๋ฐ ๊ฒฝ๊ณ ๋ฉ์ธ์ง๋ค์ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ์ฌ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์๋๋ก ๋์์ค๋ค.
๐ ์ฐธ๊ณ
Last updated