React Virtual Dom ๊ณผ Vue Virtual Dom ๋น๊ต
๐ React Virtual Dom ์ด๋ Vue Virtual Dom ์ฐจ์ด๊ฐ ๋ญ์์ ?
๊ฐ์ด ๊ณต๋ถํ๋ ์น๊ตฌ์ ์ง๋ฌธ์ ๋ง๋ฌธ์ด ๋งํ๋ค.
๊ฐ์๋์ด ์ด์๋๋ ๋ฐฉ์์ด ๊ฑฐ๊ธฐ์ ๊ฑฐ๊ธฐ ์๋๊น..?
๋ผ๋ ์ ๋งค๋ชจํธํ ๋ต๋ณ์ ํ๊ธฐ ์ซ์ด์ ๊ณต๋ถํ๊ฒ ๋์๋ค.
๐ Vue / Compiler-Informed Virtual Dom
๋๋ ๋ง์ฐํ๊ฒ,
์ด๊ธฐ ๋ ๋๋ง ๊ณผ์ ์ด Vue ๊ฐ React ๋ณด๋ค ๋ ๋น ๋ฅด๋ค๊ณ ๋ ์๊ณ ์์๋ค.
์ ? ์ ๋ํ ๋ต๋ณ์ผ๋ก,
Vue ๋ <template> ๋ฌธ๋ฒ์ ์ฌ์ฉํ๊ณ
React ๋ .jsx ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋๊น
๋ณํ๋๋ ๊ณผ์ ์ด Vue ๊ฐ ์์์ ์ผ๋ก ๋ ๋น ๋ฅด์ง ์์๊น ? ๋ผ๊ณ ์๊ฐํ๋ค.
Vue ์ ๋ ๋๋ง ๋ฉ์ปค๋์ฆ
๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๋ฉด ์ ๋์์์ง๋ง ๋ด๊ฐ ์ดํดํ ๋๋ก ์ค๋ช ํด๋ณด๊ฒ ๋ค.
Vue ์ปดํฌ๋ํธ๊ฐ mount ๋ ๋, ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ด ๋ฐ์ํ๋ค.
1๏ธโฃ ์ปดํ์ผ
๊ธฐ๋ณธ ํ ํ๋ฆฟ ๋ฌธ๋ฒ์ด ์ปดํ์ผ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ ๋ ํจ์(์ฝ๋)๊ฐ ๋๋ค.
๋ ๋ ํจ์๋ ๊ฐ์ DOM ํธ๋ฆฌ๋ฅผ ๋ฐํํ๋ ํจ์๋ค.
๋น๋ ๊ณผ์ ์ ํตํด ๋ฏธ๋ฆฌ ์คํ๋๊ฑฐ๋,
๋ฐํ์ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํด ์ฆ์์์ ์คํํ ์๋ ์๋ค.
โป ์ฃผ์
์ปดํ์ผ ๊ณผ์ ์์ด ๋ ๋ ํจ์๋ฅผ ์ง์ ์์ฑํ ์๋ ์๋ค. ๋ ๋ ํจ์ & JSX
(๋๋ ์ฌ๊ธฐ์ React ์ ์ปดํฌ๋ํธ๊ฐ ์ ์ ๋ถ์์์ด ๋ณ๊ฒฝ์ ์ ๋ฐ๋ผ
๊ด๋ จ ์ปดํฌ๋ํธ์ ๋ชจ๋ ์์๊ฐ ์ฌ๋ ๋๋ง๋๊ฒ ๊ตฌ๋ ๋ผ๋ ๊ฑธ ์ด๋ ดํ์ด ์ง์ํ๋ค.)
JavaScript ๋ก ๋งค์ฐ ๋์ ์ธ ๋ก์ง์ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ฉํ์ง๋ง
Vue ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ
ํ๋ฆฟ ๋ฌธ๋ฒ์ ๊ถ์ฅํ๋ค.
๐ Vue ๋ ์ ํ ํ๋ฆฟ์ ๊ถ์ฅํ ๊น ?
1. ํ ํ๋ฆฟ ๋ฌธ๋ฒ์ ์ค์ HTML ์ ๋ ๊ฐ๊น๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์น ์ ๊ทผ์ฑ๋ฉด์์๋ ์ฐ์ํ๊ณ ๋์์ด๋๊ฐ ์ฝ๊ฒ ์ดํดํ๊ณ ์์ ํ ์ ์๋ค.
์์ ๋ถํฐ ๊ฐ์กฐํด์์ง๋ง ํผ๋ธ๋ฆฌ์ ์์ ํ์ ์ ์์ฃผ ์ฐ์ํ๋ค.
2. ํ ํ๋ฆฟ ๋ฌธ๋ฒ์ ์ ์ ์ผ๋ก ๋ถ์ํ๊ธฐ ๋ ์ฝ๋ค.
ํ ํ๋ฆฟ ์ปดํ์ผ๋ฌ๋ ์ปดํ์ผ ์๊ฐ ์ต์ ํ๋ฅผ ์ด๋ค๋ด๊ธฐ ์ฝ๋ค.
๊ฐ์ DOM ์ฑ๋ฅ ํฅ์์ ๋ค.
2๏ธโฃ ๋ง์ดํธ
๋ฐํ์ ๋ ๋๋ฌ๋ ๋ ๋ ํจ์๋ฅผ ํธ์ถํ๊ณ , ๋ฐํ๋ ๊ฐ์ DOM ํธ๋ฆฌ๋ฅผ ํ์ํ๋ค.
์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์ DOM ๋ ธ๋๋ฅผ ์์ฑํ๋ค.
3๏ธโฃ ํจ์น
๋ง์ดํธ ์ค์ ์ฌ์ฉ๋ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋๋ฉด ์ดํํธ๊ฐ ๋ค์ ์คํ๋๋ค.
๋ฐํ์ ๋ ๋๋ฌ๋ ์์กด์ฑ(์ข
์์ฑ)์ ์ถ์ ํ์ฌ
์
๋ฐ์ดํธ ๋ ์๋ก์ด ๊ฐ์ DOM ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
์ด์ ํธ๋ฆฌ์ ์ ํธ๋ฆฌ ๊ฐ ์ฐจ์ด๋ฅผ ๋น๊ตํ๊ณ ์ ๋ฐ์ดํธ๋ฅผ ์ค์ DOM ์ ์ ์ฉํ๋ค.
์ฆ, React ์ ์ปดํฌ๋ํธ mount ์ ํฐ ์ฐจ์ด์ ์
์ปดํ์ผ ๊ณผ์ ์ ํตํด ์ปดํฌ๋ํธ๋ฅผ ์ ์ ์ผ๋ก ๋ถ์ํ๋ ๋จ๊ณ๊ฐ ์กด์ฌํ๋ค๋ ์ ์ด๋ค.
React ์ ๋๋ถ๋ถ์ ๋ค๋ฅธ ๊ฐ์ DOM ๊ตฌํ์ ์์ ํ ๋ฐํ์์ด๋ค.
Reconciliation(์กฐ์ ) ์๊ณ ๋ฆฌ์ฆ์ ํ ๋น๋๋ ๊ฐ์ DOM tree ์ ๋ํ
์ ํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ํธ๋ฆฌ๋ฅผ ์์ ํ ํ์ํ๊ณ ๋ชจ๋ ๊ฐ์ ๋ ธ๋์ props ๋ฅผ ๋น๊ตํด์ผ ํ๋ค.
์ด๋ค ๋ถ๋ถ์ด ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋์๋์ง, ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ํฑ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ณ๊ฒฝ๋์๋ค๋ ์ฌ์ค๋ง ์ ๋ฟ์ด๋ค.
๋๋ฌธ์ ํธ๋ฆฌ์ ์ผ๋ถ๋ ์์ ๋ณ๊ฒฝ๋์ง ์์๋๋ฐ๋
๋ค์ ๋ ๋๋ง ํ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ ๋ ธ๋๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ์๊ธด๋ค.
Vue ๋ ์ปดํ์ผ๋ฌ์ ๋ฐํ์ ๋ชจ๋ ์ ์ดํ๋ค.
์ปดํ์ผ๋ฌ๋ ํ ํ๋ฆฟ์ ์ ์ ์ผ๋ก ๋ถ์ํ๊ณ ,
์์ฑ๋ ์ฝ๋(๋ ๋ ํจ์)์ ํํธ๋ฅผ ๋จ๊ฒจ ๋ฐํ์์ด ๊ฐ๋ฅํ ๋
์์ ์ด ํ์ํ ๋ถ๋ถ๋ง ์ฌ๋๋๋ง๋๊ฒ๋ "๋ฐ๋ก ๊ฐ๊ธฐ"๋ฅผ ์ง์ํ๋ค.
(์์งํ ์ฌ๊ธฐ์ ๋๋๋ค. Vue ๊ฐ ๋ ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ์ฃผ์ํ ์ด์ ..)
Vue ํ ํ๋ฆฟ ์ปดํ์ผ๋ฌ๊ฐ ์ํํ๋ ์ต์ ํ ๋ฐฉ๋ฒ
1. ์ ์ ํธ์ด์คํ
<div>
<div>foo</div> <!-- ํธ์ด์คํธ ๋จ -->
<div>bar</div> <!-- ํธ์ด์คํธ ๋จ -->
<div>{{ dynamic }}</div>
</div>
ํ ํ๋ฆฟ์๋ ๋์ ๋ฐ์ธ๋ฉ์ด ํฌํจ๋์ง ์์ ๋ถ๋ถ์ด ๊ฝค ๋ง๋ค.
foo ์ bar ์ฒ๋ผ ์ ์ ์ธ ์๋ฆฌ๋จผํธ๋ ๊ฐ์ ๋ ธ๋(vnode) ๋ฅผ ๋ค์ ์์ฑํ๊ณ ๋น๊ตํ ํ์๊ฐ ์๋ค.
Vue ์ปดํ์ผ๋ฌ๋ vnode ์์ฑ ํจ์(๋ ๋ ํจ์) ํธ์ถ ์
์๋์ผ๋ก ํธ์ด์คํธ(hoist)ํ์ฌ ๋ชจ๋ ๋ ๋์์ ๋์ผํ vnode ๋ฅผ ์ฌ์ฌ์ฉํ๋ค.
๋ ๋๋ฌ๋ ์ด์ vnode ์ ์ vnode ๊ฐ ๋์ผํ๋ฉด ๋น๊ต ๊ฑด๋๋ฐ๊ธฐ ๋๋ฌธ์ ์์ฃผ ๊ตฟ
๋ํ ์ ์ ์๋ฆฌ๋ฉํธ๊ฐ ์ถฉ๋ถํ ์ฐ์์ ์ผ๋ก ์กด์ฌํ๋ฉด
ํด๋น ๋ ธ๋๋ค์ ๋ํด ๋จ์ผ ์ ์ vnode ๋ก ์์ถ์์ผ๋ฒ๋ฆฐ๋ค๊ณ ํ๋ค.
์ด๋ฌํ ์ ์ vnode ๋ innerHTML ๋ก ๋ง์ดํธ ๋๋ค.
ํด๋น DOM ๋ ์ด๊ธฐ ๋ง์ดํธ ์ ์บ์ฑ๋์ด
๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฌ์ฉ๋ ๋ cloneNode() ์ฌ์ฉํด์ ์ DOM ๋ ธ๋๋ฅผ ์์ฑํ๋ค. (ํจ์จ ๊ตฟ)
2. ํจ์น ํ๋๊ทธ
<!-- class๋ง ๋ฐ์ธ๋ฉ -->
<div :class="{ active }"></div>
<!-- id์ value๋ง ๋ฐ์ธ๋ฉ -->
<input :id="id" :value="value">
<!-- text๋ง only -->
<div>{{ dynamic }}</div>
Vue ๋ vnode ์์ฑ ํธ์ถ์์ ๊ฐ ์๋ฆฌ๋จผํธ์ ํ์ํ ์ ๋ฐ์ดํธ ์ ํ๋ง ์ธ์ฝ๋ฉํ๋ค.
๋ํ ํ๋์ ์๋ฆฌ๋จผํธ๋ ์ฌ๋ฌ ํจ์น ํ๋๊ทธ๋ฅผ ๊ฐ์ง ์ ์๋ค.
๐ ํจ์น ํ๋๊ทธ ์ข ๋ฅ
- TEXT (1) : ํ ์คํธ(์ฝํ ์ธ ) ๋ณ๊ฒฝ ํ๋๊ทธ
- CLASS (2) : ๋ ธ๋ class ๋ณ๊ฒฝ ํ๋๊ทธ
- STYLE (4) : style ๋ณ๊ฒฝ ํ๋๊ทธ (์ธ๋ผ์ธ ์คํ์ผ๋ง ๊ฐฑ์ ๊ฐ๋ฅ)
- PROPS (8) : props ๋ณ๊ฒฝ ํ๋๊ทธ
- FULL_PROPS (16) : props ์ผ๊ด ๋ณ๊ฒฝ ํ๋๊ทธ
- HYDRATE_EVENTS (32) : ์ด๋ฒคํธ ํ์ ์ ์ฉ ํ๋๊ทธ (feat. SSR)
- STABLE_FRAGMENT (64) : ๋ด๋ถ ๋ ธ๋ ์์ ๊ณ ์ ํ๋๊ทธ
- KEYED_FRAGMENT (128) : ๋ด๋ถ ๋ ธ๋ ์์ ๊ณ ์ ํ๋๊ทธ (ํค ์์)
- UNKEYED_FRAGMENT (256) : ๋ด๋ถ ๋ ธ๋ ์์ ๋ฏธ๊ณ ์ ํ๋๊ทธ (ํค ์์)
- NEED_PATCH (512) : ์ฌํจ์น๊ฐ ํ์ํจ์ ์๋ฆฌ๋ ํ๋๊ทธ
- DYNAMIC_SLOTS (1024) : ์ฌ๋กฏ ํจ์น (๋์ ์ผ๋ก ๊ต์ฒด๋๋๊น)
ํจ์น ํ๋๊ทธ๋ ์์กด์ฑ ์์ ์ด ๋ฐ์ํ์ ๋
ํด๋น DOM ์ ์ ๋ฐ์ดํธ ์ ๋ฌด๋ฅผ ๊ฒฐ์ ํ ๋ ๋์์ ์ค๋ค.
3. ํธ๋ฆฌ ๋ณํฉ
๊ฐ๋ ์ ์ผ๋ก "๋ธ๋ก(block)" ์ด๋ ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ์์ ์ ์ธ ํ ํ๋ฆฟ์ ๋งํ๋ค.
์ฆ, ์ ์ฒด ํ ํ๋ฆฟ์ v-if ๋ฐ v-for ๊ณผ ๊ฐ์ ๊ตฌ์กฐ์ ๋๋ ํฐ๋ธ๋ฅผ ํฌํจํ์ง ์๋ ํํ๋ฅผ ๋งํ๋ค.
<div> <!-- ๋ฃจํธ ๋ธ๋ก -->
<div>...</div> <!-- ์ถ์ ํ์ง ์์ -->
<div :id="id"></div> <!-- ์ถ์ ํจ -->
<div> <!-- ์ถ์ ํ์ง ์์ -->
<div>{{ bar }}</div> <!-- ์ถ์ ํจ -->
</div>
</div>
์ ์ ์ธ ์๋ฆฌ๋จผํธ๋ ์ ์ธํ๊ณ ๋์ ์ธ ํ์ ๋ ธ๋๋ง ํฌํจ๋ ๋ณํฉ ๋ฐฐ์ด์ ์์ฑํ๋ค.
์ด ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํด์ผ ํ ๋ ์ ์ฒด ํธ๋ฆฌ ๋์ , ๋ณํฉ๋ ํธ๋ฆฌ๋ง ํ์ํ๋ฉด ๋๋ค. wow
๊ฐ์ DOM reconciliation ์ค์ ํต๊ณผํด์ผํ๋ ๋ ธ๋ ์๋ฅผ ํฌ๊ฒ ์ค์ธ๋ค.
<div> <!-- ๋ฃจํธ ๋ธ๋ก -->
<div>
<div v-if> <!-- if ๋ธ๋ก -->
...
<div>
</div>
</div>
v-if ๋ฐ v-for ๋๋ ํฐ๋ธ๋ ์ ๋ธ๋ก ๋ ธ๋๋ฅผ ์์ฑํ๋ค.
์์ ๋ธ๋ก์ ๋ถ๋ชจ ๋ธ๋ก์ ๋์ ์์ ๋ฐฐ์ด ๋ด์์ ์ถ์ ๋๋ค.
๐ React / Virtual Dom
๊ฐ์ DOM ์ด๋ ?
๋ฉ๋ชจ๋ฆฌ์ ๋ณด๊ด๋ UI ์ ๊ฐ์ ๊ตฌํ์ฒด๊ฐ
React DOM ๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์ค์ DOM ๊ณผ ๋๊ธฐํ๋๋ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋
In React world, the term “virtual DOM” is usually associated with "React elements" since they are the objects representing the user interface. React, however, also uses internal objects called “fibers” to hold additional information about the component tree. They may also be considered a part of “virtual DOM” implementation in React.
React Fiber ์ด๋ ?
Fiber ๋ React 16์ ์๋ก์ด Reconciliation ์์ง์ด๋ค.
๊ฐ์ DOM ์ ๋ ๋๋ง ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด ๋์ ๋์๋ค.