[10๋ถ ํ
์ฝํก] ๐ฅ ์ง๊ทธ์ Virtual DOM
DOM์ ๋ญ๊ณ ๊ฐ์ DOM์ ๋ญ๊ฐ์? (+ Svelte์ React์ ์ฐจ์ด)
DOM vs Virtual DOM
๋ฅผ ๋ณด๋ฉด์ ๋ด๊ฐ ๋ ์์์ผ ํ ๋ด์ฉ๊ณผ ๋ณต์ต์ผ๋ก ๊ฒ์๋ฌผ์ ์์ฑํด๋ณธ๋!
DOM์ Document Object Model๋ก HTML์ด๋ ์ฝ๋๋ก ์ค๊ณ๋ ์นํ์ด์ง๊ฐ ๋ธ๋ผ์ฐ์ ์์์ ํ๋ฉด์ ๋ํ๋๊ณ , ์ด๋ฒคํธ์ ๋ฐ์ํ๋ฉฐ ๊ฐ์ ์ ๋ ฅ๋ฐ๋ ๋ฑ ๊ธฐ๋ฅ๋ค์ ์ํํ ๊ฐ์ฒด๋ค๋ก ์ค์ฒดํ๋ ํํ๋ฅผ ์๋ฏธํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ ์ ๊ฐ ์ด๋ค ํฌ์คํธ์ ์ข์์๋ฅผ ๋๋ฅด๊ฑฐ๋ ๋ด์๋ ์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก์์ ์ํ์ ํ๋ ์ญ์ ํ๊ฑฐ๋ ์ด๋๊ฐ์ ๋๊ธ์ ๋จ๊ธฐ๋ฉด ์ ์ฒด ๋
ธ๋๋ค์ด ์ฒ์๋ถํฐ ๋ค์ ๊ทธ๋ ค์ง๊ฒ ๋๋ค!
๋ฑ ๋ด๋ ๋ถํ์ํ ๋ฐ๋ณต์ด ๋ฐ๋ณต๋์ด DOM์ ์กฐ์ํ๋ ์๋ชจ์ ์ธ ๋น์ฉ์ด ์ฆ๊ฐํ๊ฒ ๋๋ค...
์ต๊ทผ์๋ SPA, Single Page Application์ ๋ง์ด ์ฌ์ฉํ๋ฉด์ DOM tree๋ฅผ ์ฆ๊ฐ์ ์ผ๋ก ๋ณ๊ฒฝํ ์ผ์ด ์๊ฒผ๋ค. ์ ์ฒด ํ์ด์ง๋ฅผ ์๋ฒ์์ ๋งค๋ฒ ๋ณด๋ด์ฃผ๋ ๊ฒ์ด ์๋๋ผ, ๋ธ๋ผ์ฐ์ ๋จ์์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์, DOM์กฐ์์ ๋์ฑ ๋ ํจ์จ์ ์ผ๋ก ํ ์ ์๊ฒ ์ต์ ํ๊ฐ ํ์ํ๊ฒ ๋์ด์ง ๊ฒ์ด๋ค.
ํ๋์ HTML ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด ๋์ ์ผ๋ก ํ๋ฉด์ ์ปจํ
์ธ ๋ฐฉ์์ ๋ฐ๊พธ๋ ๋ฐฉ์์ ์น ์ดํ๋ฆฌ์ผ์ด์
์ด๋ค.
๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ์ด Virtual DOM์ด๋ค!!!! ๋๋ฅ!
Virtual DOM์ ์ค์ DOM์ ๋ชจ๋ฐฉํ๋ ํํ๋ก ๋ฉ๋ชจ๋ฆฌ ์์์๋ง ์กด์ฌํ๋ ๊ฐ์์ DOM์ ์๋ฏธํ๋ค. ๋ณํ๊ฐ ์ค์ DOM์ ์ ์ฉ๋๊ธฐ ์ ์ ๊ฐ์์ DOM์ ํ๋ฒ ๊ฑฐ์ณ ๋ฏธ๋ฆฌ ์ฒ๋ฆฌํ๊ณ ์ ์ฅํ ํ ์ค์ DOM์ ์ ๋ฐ์ดํธ ํ ์ ์๊ฒ ํด์ค๋ค.
์ฆ, ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ์ด ๋๋ฉด ์ ์ฒด UI๋ Virtual DOM์ ๋ ๋๋ง ๋์ด์ ธ ์ด์ virtual DOM์ ์๋ ๋ด์ฉ๊ณผ ์ ๋ฐ์ดํธ ํ์ ๋ด์ฉ์ ๋น๊ตํ์ฌ ๋ฐ๋ ๋ถ๋ถ๋ง ์ค์ DOM์ ์ ์ฉ์ํจ๋ค.
โ ์์๊ฐ 30๊ฐ๊ฐ ๋ฐ๋์๋ค๊ณ ๋ ์ด์์์ 30๊ฐ์ฉ ์๋ก ํ๋ ๊ฒ์ด ์๋๋ผ ๋ชจ๋ ๋ณํ๋ฅผ ํ๋๋ก ๋ฌถ์ด์ ๋ฑ ํ๋ฒ๋ง ์คํ์ํจ๋ค. ์ด๋ ๊ฒ ์ฐ์ฐ ํ์๋ฅผ ์ค์ผ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ DOM ๋ฆฌ๋ ๋๋ง์ ๋นํด์ ํจ์จ์ ์ด๋ค.
์ฌ์ค virtual DOM์ด ํ๋ ๊ฒ์ DOM Fragment์ ๋ณํ๋ฅผ ๋ฌถ์ด์ ์ ์ฉ์ํจ ๋ค์์ ๊ธฐ์กด DOM์ ๋์ ธ์ฃผ๋ ๊ณผ์
๐ virtual DOM์ ์ด ๊ณผ์ ์ ์๋ํ, ์ถ์ํํด๋์ ๊ฒ์ ๋ถ๊ณผํ๋ค.
Virtual DOM์ ์ด์ฉํ๋ ๋ํ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โก๏ธ UI์ ๊ฐ์์ ์ธ ํํ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ React DOM๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์ค์ DOM๊ณผ ๋๊ธฐํํ๋ ํ๋ก๊ทธ๋จ์ธ ๊ฐ๋
์ด๋ค.๋ผ๊ณ ์ค๋ช
ํ๊ณ ์์ผ๋ฉฐ, ์ด๋ฌํ ๊ณผ์ ์ ์ฌ์กฐ์ ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
React๋ JSX์ ๋ฌธ๋ฒ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๊ฐ ์ปดํฌ๋ํธ์์ ๋ฆฌํด๋๋ React elemenent๋ฅผ JSX๋ฌธ๋ฒ์ผ๋ก ์์ฑํ๋ ๊ฒ์ด๋ค. JSX๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ฅ ๋ฌธ๋ฒ์ด๋ค.
JSX๋ฅผ ์ปดํฌ๋ํธ์์ ๋ฆฌํด์ํค๋ฉด Babel์ React.createElement() ํธ์ถ๋ก ์ปดํ์ผํ๋ค. ๋ํ React element ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ค.
์ด React.createElement()๋ก ์์ฑ๋ React elements๋ ๋ด๋ถ์ ์ผ๋ก virtual DOM์ ๊ฐ์ฒด์ ์ ์ฌํ ํํ๋ก ํํ๋๋ค.
- DOM ์์์ ๊ฐ์๋ฒ์ ์ผ๋ก ๊ฐ๋ณ๋ค(Light)
- ์ํ๋ฅผ ๊ฐ์ง์ง ์๋๋ค(immutable)
- ๋ถ๋ณ์ฑ์ ์ ์งํ๋ค(stateless)
โก๏ธ ์ด ๋ถ๋ณ์ฑ ๋๋ถ์ ๋น๊ตํ๊ณ , ์ ๋ฐ์ดํธ ํ๋ ๊ฒ ์ฌ์์ง๋ค.
React elements๋ React DOM์ render์ ์ํด์ ์ค์ DOM์์๊ฐ ๋๋ค. React๋ ์ด ๊ฐ์ฒด๋ฅผ ์ฝ์ด๋ค์ด๊ณ , ์ด๋ฅผ ์ฌ์ฉํด์ DOM์ ๊ตฌ์ฑํ๊ณ , ํญ์ ์ต์ ์ํ๋ก ์ ์งํ๋ค. ํ์ง๋ง React elements๋ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ํ๋ฒ ์์๋ฅผ ๋ง๋ค์๋ค๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์๋ค๊ณ ํด์ ๊ทธ ์์์ด๋ ์์ฑ์ ๋ง๋๋ก ๋ณ๊ฒฝํ ์ ์๋ค. ๊ฐ element๋ ํด๋น ์๊ฐ์ ์ค๋ ์ท ํํ๋ก ๋ณด์ฌ์ฃผ๊ธฐ๋ง ํ ๋ฟ์ด๋ค.
์๋ก์ด ์์๋ฅผ ๋ง๋ค์ด์ ReactDOM.render()๋ก ์ ์กํ๋ ๊ฒ ๋ฟ์ด๋ค.
React DOM Object๋ ๊ทธ์ ๋์ํ๋ Virtual Object๊ฐ ์๋ค. ์ด Virtual Object๋ DOM Object์ ํ๋ํ๋ ๋งคํ์ด ๋์ด์ง๋ค.
๋ฐ์ดํฐ๊ฐ ์
๋ฐ์ดํธ ๋์ด์ง๋ฉด, ๋ฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก React.createElement()๋ฅผ ํตํด JSX element๋ฅผ ๋ ๋๋งํ๋ค. ์ด๋ ๊ฐ๊ฐ์ ๋ชจ๋ Virtual DOM Object๊ฐ ์
๋ฐ์ดํธ ๋์ด์ง๋ค. Virtual DOM์ ๋น ๋ฅด๊ฒ ์
๋ฐ์ดํธ ๋์ด์ง๊ธฐ ๋๋ฌธ์ ๋น์ฉ์ด ๋ง์ด ๋ค์ง ์๋๋ค. ์ด Virtual DOM์ด ์
๋ฐ์ดํธ ๋์ด์ง๊ฒ ๋๋ฉด, React๋ Virtual DOM์ ์
๋ฐ์ดํธ ์ด์ ์ Virtual DOM ์ค๋
์ท๊ณผ ๋น๊ตํ์ฌ ์ ํํ ์ด๋ค Virtual DOM์ด ๋ฐ๋์๋์ง ๊ฒ์ฌ๋ฅผ ํ๋ค.
Virtual DOM์ด ์ ๋ฐ์ดํธ๋๋ฉด, React๋ Virtual DOM์ ์ ๋ฐ์ดํธ ์ด์ ์ Virtual DOM ์ค๋ ์ท๊ณผ ๋น๊ตํ์ฌ ์ ํํ ์ด๋ค Virtual DOM์ด ๋ฐ๋์๋์ง ๊ฒ์ฌํ๋ค.
element ์์ฑ ๊ฐ๋ง ๋ณํ ๊ฒฝ์ฐ์๋ ์์ฑ ๊ฐ๋ง ์
๋ฐ์ดํธํ๊ณ , ํด๋น ์๋ฆฌ๋จผํธ์ ํ๊ทธ๋ ์ปดํฌ๋ํธ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ํด๋น ๋
ธ๋๋ฅผ ํฌํจํ ํ์์ ๋ชจ๋ ๋
ธ๋๋ค์ด ์ธ๋ง์ดํธ ์ฆ, ์ ๊ฑฐํ ๋ค์ ์๋ก์ด Virtual DOM์ผ๋ก ๋์ฒดํฉ๋๋ค. ์ด๋ฐ ๋ณ๊ฒฝ์ด๋ ์
๋ฐ์ดํธ๊ฐ ๋ชจ๋ ๋ง๋ฌด๋ฆฌ๋ ์ดํ์ ๋ฑ ํ๋ฒ์ ์ค์ DOM์ ์ด ๊ฒฐ๊ณผ๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค. ์ด๋ ๊ฒ ๋น๊ต๋ฅผ ํตํด์ ์์ธ ๋ถ๋ถ๋ค์ ์ฐพ์๋ด๋ ๊ฒ์ด๋ค!
์ผ์ ์ด๊ฒ ๋ฌด์จ ๋ง์ธ์ง! ์ง๊ทธ๋์ ์์๋ฅผ ๋ค๋ฉด์ ์์ธํ ์์๋ณด์!!!
ํ๋ฌ์ค(โ)๋ฒํผ์ ํตํด ์ด๋ฏธ์ง๊ฐ ์ถ๊ฐ๋๋ ์ฑ์ ๋ง๋ค๋ฉด ์ด๋ ์ด๋ฏธ์ง๊ฐ ์ถ๊ฐ ๋ ๋ ๋ง๋ค ๋ฆฌ์กํธ์์ Virtual DOM์ด ์ด๋ป๊ฒ ๋์ํ ๊น?
<img src="์ด๋ฏธ์ง ๊ฒฝ๋ก" alt="์ด๋ฏธ์ง ์ด๋ฆ"/>
const content = {
tagName: 'div',
attributes: { class: "content"},
children: [
{
tagName: "img",
attributes: { src: "imgsrc" },
}
]
}
์ ๋ต์ ์๋๋ค! ์ ๋ณด ์ ๊ณต๋ง ํ๋ ์น ํ์ด์ง๋ผ๋ฉด, ์๋ฌด๋ฐ ์ธํฐ๋ ์ ์ด ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ DOM tree์ ๋ณํ๊ฐ ๋ฐ์ํ์ง ์์์, ์ผ๋ฐ DOM์ ์ฑ๋ฅ์ด ๋ ์ข์ ์ ์๋ค! ๊ทธ๋ฆฌ๊ณ ์ค์ Virtual DOM์ diff ์๊ณ ๋ฆฌ์ฆ์ด ๋น ๋ฅด๊ธด ํ์ง๋ง ์ถ๊ฐ์ ์ธ ์์ ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ํ์์ ๋ง๊ฒ ๋์ ์ ํด์ผํ๋ค. ํ์ง๋ง SPA๋ก ์ ์๋ ๊ท๋ชจ๊ฐ ํฐ ์นํ์ด์ง์์๋ DOM ์กฐ์์ด ๋ง์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ Virtual DOM์ ์ฌ์ฉํด ๋ธ๋ผ์ฐ์ ์ ์ฐ์ฐ๋์ ์ค์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์๋ค!!!
๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ง๋ค DOM์ ๋งค๋ฒ ์ฒ์๋ถํฐ ๋ค์ ํ๋ฉด์ด ๊ทธ๋ ค์ง๋ ๋ถํ์ํ ๋ฐ๋ณต์ด ๋ฐ์๋๋ค. ๊ทธ๋์ DOM์ ์กฐ์ํ๋ Virtual DOM์ด ํ์ํ๊ฒ ๋์๋ค. Virtual Dom์ ๋ณํ๊ฐ ์ค์ DOM์์ ์ ์ฉ๋๊ธฐ ์ ์ ๊ฐ์์ DOM์ ๊ฑฐ์ณ์ ๊ณ์ฐ ๋จ๊ณ๋ฅผ ์ค์ด๊ณ ํจ์จ์ ์ธ DOM์กฐ์์ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด์ค๋ค. ๋ง์ฝ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ์น ํ์ด์ง๋ผ๋ฉด ์ผ๋ฐ DOM์ด ์ฑ๋ฅ์ด ์ข์ ์ ์๊ณ , ์ฅ๋ฐ๊ตฌ๋ ๋ฑ ์ฌ์ฉ์์ ๋ฐ๋ผ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ ์นํ์ด์ง๋ผ๋ฉด DOM ์กฐ์์ด ๋ง์ด ๋ฐ์ํ๊ธฐ์ ์ํฉ์ ๋ง๊ฒ virtual DOM์ ์ฌ์ฉํด์ผ ํ๋ค!!!!
+) React์ Virtual DOM์ ๋ ๊ณต๋ถ๋ฅผ ํด์ผ๊ฒ ๋ค... ์์ง๋ ์ด๋ ต๋ค...๐ข
์๋ ํ์ธ์! DOM๊ณผ ๊ฐ์ DOM์ ์ฐจ์ด๋ฅผ ์ ์ ๋ฆฌํด์ฃผ์ ์ ์ถ์ฒ ๋ฐํ๊ณ ๋ธ๋ก๊ทธ์ ์ผ๋ถ๋ง ๊ฐ์ ธ๋ค ์จ๋ ๊ด์ฐฎ์๊น์~??