Virtual DOM
1. ๊ฐ์
๋ฆฌ์กํธ์ ํน์ง ์ค ํ๋๋ VirtualDOM(๊ฐ์๋)์ด๋ค. VirtrualDOM๋ฅผ ์ดํด๋ณด๊ธฐ ์์ DOM์ ๊ฐ๋ ์ ๋ํด ๋จผ์ ์์๋ณด๊ณ VirtualDOM์ ํน์ง์ ๋ํด ์ดํด๋ณด์.
2. DOM์ ๊ฐ๋
DOM(Document Object Model, ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ)์ XML์ด๋ HTML๋ฌธ์์ ์ ๊ทผํ๊ธฐ ์ํ ์ผ์ข ์ ์ธํฐํ์ด์ค์ด๋ค. ์ด ๊ฐ์ฒด ๋ชจ๋ธ์ ๋ฌธ์ ๋ด์ ๋ชจ๋ ์์๋ฅผ ์ ์ํ๊ณ , ๊ฐ๊ฐ์ ์์์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. ์ฆ DOM์ด๋ ์น ๋ฌธ์์ ๋ชจ๋ ์์๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํ์ฌ ์กฐ์ํ ์ ์๋๋ก ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ํด์ํ๋ ๋ฐฉ๋ฒ์ ๋งํ๋ค.
์น ๋ฌธ์์ ๋ชจ๋ Element์ Attribute, Text๋ค์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋๋ก ๊ฐ๊ฐ ๊ฐ์ฒด๋ก ๋ง๋ค๊ณ ์ด ๊ฐ์ฒด๋ค์ ๊ด๊ณ๋ฅผ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๊ตฌ์ ํ ๊ฒ์ด DOM์ด๋ค.
์ฝ์ ์ฐฝ์ DOM์ ์์ ์ค ํ๋์ธ documnet๋ฅผ ์ ๋ ฅํ๋ฉด ์๋์ ๊ฐ์ ๋ด์ฉ์ ๋ณผ ์ ์๋ค.

์ฝ์์ ์ถ๋ ฅ๋๋ ๊ฐ์ ํผ์ณ๋ณด๋ฉด ์น ๋ฌธ์์ ๊ตฌ์กฐ๊ฐ ๋ค์ด์๋ค. ์ด๊ฒ์ด ๋ฐ๋ก DOM์ด๊ณ , ์ฐ๋ฆฌ๋ DOM๋ฅผ ์ด์ฉํ์ฌ ์น ๋ฌธ์๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
3. DOM์ ํธ๋ฆฌ ๊ตฌ์กฐ
<!DOCTYPE html>
<html>
<head>
<title>DOM์ด๋?</title>
</head>
<body>
<h1 class="title">์ ๋ชฉ</h1>
<p class="content">๋ณธ๋ฌธ ์์ญ์
๋๋ค.</p>
</body>
</html>์์ ์น๋ฌธ์๋ฅผ DOM์ ํธ๋ฆฌ๊ตฌ์กฐ๋ก ๋ํ๋ด๋ณด๋ฉด ์๋์ ๊ฐ์ ๊ณ์ธต ๊ตฌ์กฐ๋ก ํํ๋๋ค.

DOM์ ํธ๋ฆฌ๊ตฌ์กฐ๋ ๋ ธ๋์ ๊ฐ์ง๋ก ํํํ๋ค. ๋ค๋ชจ ์์๊ฐ ๋ ธ๋์ด๊ณ ๋ ธ๋์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ์ฌ ๊ด๊ณ๋ฅผ ํ์ํ๊ณ ์๋ ์ ์ด ๊ฐ์ง์ด๋ค. ๋ ธ๋๋ HTML์ ํ๊ทธ ์์๋ง ํํํ๋ ๊ฒ์ด ์๋๋ผ ๋ชจ๋ ํ ์คํธ, ์ด๋ฏธ์ง, ํ๊ทธ์ ์์ฑ๋ค๊น์ง ๊ฐ์ฒดํํ์ฌ DOMํธ๋ฆฌ์ ํํํ๋ค.
๋ฌธ์ ๋ ธ๋ (Document Node) ํธ๋ฆฌ์ ์ต์์์ ์กด์ฌํ๋ฉฐ, ํ์ ์์ ๋ ธ๋์ ์ ๊ทผํ๊ธฐ ์ํด์ Document Node๋ฅผ ํตํด์ผ๋ง ํ๋ค. DOMํธ๋ฆฌ์ ์ ๊ทผํ๊ธฐ ์ํ ์์์ ์ด๋ค.
์์ ๋ ธ๋ (Element Node) ์น ๋ฌธ์์ ํ๊ทธ๋ Element Node๋ก ํํ๋๋ค. ๋ชจ๋ Element Node๋ Attribute Node์ Text Node๋ฅผ ์์์ผ๋ก ๊ฐ์ง ์ ์๋๋ฐ, ์ด ์์ ๋ ธ๋๋ค์ ๋ณ๊ฒฝํ์ฌ ์น ํ์ด์ง๋ฅผ ๋์ ์ผ๋ก ์กฐ์ํ ์ ์๋ค.
์์ฑ ๋ ธ๋ (Attribute Node) ํ๊ทธ์ ๋ชจ๋ ์์ฑ์ Attribute Node๋ก ํํํ๋ฉฐ ํด๋น ํ๊ทธ์ ์์ ๋ ธ๋๋ก ์ธ์๋๋ค.
ํ ์คํธ ๋ ธ๋ (Text Node) ํ๊ทธ๊ฐ ๊ฐ์ง๊ณ ์๋ ํ ์คํธ๋ ํด๋น Element Node์ ์์ ๋ ธ๋์ธ Text Node๋ก ํํ๋๋ค. Text Node๋ DOMํธ๋ฆฌ์ ๊ฐ์ฅ ์๋์ชฝ์ ์์นํ์ฌ ์์ ์ ์์ ๋ ธ๋๋ ๊ฐ์ง ์ ์๋ค.
์ฃผ์ ๋ ธ๋ (Comment Node) ์ฃผ์์ Comment Node๋ก ํํํ๋ค.
DOM์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์๋๋ค. DOM์ ์น ๋ฌธ์์๋ง ์กด์ฌํ๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด์ ์น ํ์ด์ง๋ฅผ ์กฐ์ํ ์ ์๋๋ก ์ ๊ณตํด์ฃผ๋ ํ๋์ ์์์ผ ๋ฟ์ด๋ค. ์ฐ๋ฆฌ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ก DOM์ ์กฐ์ํ๋ ๊ฒ์ HTML์น ๋ฌธ์ ์์ฒด๋ฅผ ์์ ํ๋ ๊ฒ์ด DOM์ ์กฐ์ํ๋ ๊ฒ์ผ ๋ฟ์ด๋ค.
4. DOM์ ๋ฌธ์ ์ ๋ธ๋ผ์ฐ์ ์ ๋๋๋ง ๋ฐฉ๋ฒ
DOM์ ๋ฌธ์ ๋ผ๊ณ ํ๋ฉด ์๋์ ๊ฐ์ ๋ ๊ฐ์ ์ ์ ๋ฝ์ ์ ์๋ค.
DOM์กฐ์์ ์ํ ๋ ๋๋ง์ด ๋นํฐ์
SPAํน์ง์ผ๋ก DOM ๋ณต์ก๋ ์ฆ๊ฐ์ ๋ฐ๋ฅธ ์ต์ ํ ๋ฐ ์ ์ง ๋ณด์๊ฐ ๋ ์ด๋ ค์ ์ง
DOM์ ํตํด ๋์ ์ผ๋ก ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค.
document.getElementById("hello").innerHTML = "hello world!";
document.body.style.backgound = "blue";์ด๋ฌํ ๊ณผ์ ์ ํตํด ์น ๋ธ๋ผ์ฐ์ ๋ DOM์ด ๋ณ๊ฒฝ๋ ๊ฒ์ ์ธ์งํ๊ณ ๋ธ๋ผ์ฐ์ ์์ง์ ๋ค์ ๋๋๋ง ํ๋ค.
๋ธ๋ผ์ฐ์ ์์ง์ User Interface์ Rendering Engine ์ฌ์ด์ ๋์์ ์ ์ดํด์ฃผ๋ ์์ง์ด๋ค. ์ด์๊ด๋ จํด์๋ ๋ธ๋ผ์ฐ์ ์ ๋ํ ๊ณต๋ถ๋ฅผ ํ ๋ ๋ฐ๋ก ์ ๋ฆฌ๋ฅผ ํ๊ฒ ๋ค.
๋ธ๋ผ์ฐ์ ์ ๋๋๋ง ๋ฐฉ๋ฒ์ ๋ํด ๊ฐ๋จํ ์ดํด๋ณด๋ฉด์ ์์ DOM ๋ ๋๋ง ๋ฌธ์ ์ ๋ํด ์์๋ณด์. ์๋๋ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ ์ ๊ทธ๋ฆผ์ ๋ํ๋ธ ๊ฒ์ด๋ค.

๋ ๋๋ง ๊ณผ์
HTML์ ํ์ฑํ์ฌ DOM ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , css์ ํ์ฑํ์ฌ ์คํ์ผ ๊ท์น์ ๋ง๋ ๋ค.
์ด ๋๊ฐ๋ฅผ ํฉ์ณ ์ค์ ๋ก ์น ๋ธ๋ผ์ฐ์ ์ ๋ณด์ฌ์ ธ์ผํ ์์๋ฅผ ํํํ "๋ ๋ ํธ๋ฆฌ"๋ฅผ ๋ง๋ ๋ค.
์ด ๋ ๋ ํธ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ ์ด์์์ ๋ฐฐ์น๊ณ ์์ ์น ํ๋ ๋ฑ์ ์์ ์ ํ๋ค.
DOM์ ๋ณ๊ฒฝํ ๋ ๋ง๋ค ์์ ๋๋๋ง ๊ณผ์ ์ ์ฌ๋ฌ๋ฒ ํ๊ฒ ๋๋ค. DOM์ 100๋ฒ ๋ณ๊ฒฝํ ๋ 100๋ฒ์ ๊ฐ๊น์ด ๋ ๋๋ง์ ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ธ ๋ฌธ์ ๊ฐ ์๋ค.(100๋ฒ๋ณด๋ค ๋ฎ๋ค๊ณ ํ์ง๋ง ๋น ๋ฅธ ์ดํด๋ฅผ ๋๊ธฐ ์ํด ๊ทธ๋ฅ 100๋ฒ์ด๋ผ๊ณ ํ๊ฒ ๋ค.)
์๋์ ์์ ๋ด์ฉ์ ๋ณด๋ฉฐ ์ดํด๋ฅผ ํด๋ณด์
<!DOCTYPE html>
<html>
<head>
<title>DOM์ด๋?</title>
</head>
<body>
<ul>
<li>์์ญ์ด</li>
<li>์ฌ์</li>
<li>ํธ๋์ด</li>
</ul>
</body>
</html>์์ ๊ฐ์ ํ์ด์ง๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. DOM๋ฅผ ์ด์ฉํ์ฌ li๋ ธ๋๋ค์ ์ปจํ ์ธ ๋ฅผ ๋ฐ๊พธ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ ๊ณผ์ ์ด ํ์ํ๋ค.
const liTags = document.querySelectorAll("li");
// ํ๋ฉด ๋ ๋๋ง1 ๋ฐ์
liTags[0].textContents = "๊ฐ์์ง";
// ํ๋ฉด ๋ ๋๋ง2 ๋ฐ์
liTags[1].textContents = "๊ณ ์์ด";
// ํ๋ฉด ๋ ๋๋ง3 ๋ฐ์
liTags[2].textContents = "์ต๋ฌด์";์์ ๊ณผ์ ์ ๋ณด๋ฉด ํ๋์ ์ ๋ฐ์ดํธ๋ง๋ค ๋ทฐ์ ๋ณํ ์๊ธฐ๋ฉด ๊ทธ ๋ ๋ง๋ค ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค์ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๊ณผ์ ์ด ์์๋๊ณ ์ด ๋ถ๋ถ์ด ์ฆ์ ๋์์ผ๋ก ์๊ธฐ๋ ์ฑ๋ฅ์ ๋ณ๋ชฉ์ ์ด ๋๋ค.
5. VirtualDOM
VirtualDOM์ ์ฌ๋ฌ ์์ ์ฌํญ์ด ์๋๋ผ๋ ํ ๋ฒ๋ง ๋ ๋๋ง์ ์คํํ๋ค. ๋ํ DOM๋ฅผ ์๋กญ๊ฒ ์์ฑํ ํ ๋ ๋๋ง ํ์ง ์๊ณ ๋ฐ๋ ๋ถ๋ถ๋ง ์ฐพ์์ ํด๋น ๋ถ๋ถ๋ง ์์ ํ ์ ์๋๋ก ๋์์ค๋ค.

์์ ๊ทธ๋ฆผ์ฒ๋ผ VirtualDOM์ DOM์ด ์์ฑํ๊ธฐ ์ , ์ด์ ์ํ ๊ฐ๊ณผ ์์ ์ฌํญ์ ๋น๊ตํ์ฌ ๋ฌ๋ผ์ง ๋ถ๋ถ๋ง DOM์๊ฒ ํ ๋ฒ๋ง ์ ๋ฌํ์ฌ ๋ฑ ํ ๋ฒ์ ๋ ๋๋ง์ ํ ์ ์๋๋ก ํ๋ค.

์์ ๊ทธ๋ฆผ์ ์ฒซ๋ฒ์งธ DOM์ ์ํ๋ฅผ ๋ณด์. ๋นจ๊ฐ์ ๋ถ๋ถ์ด ๋ฐ๋ก ์์ ๋ ๋ถ๋ถ์ด๋ค. VirtualDOM์ ์ค์ค๋ก ๋ฌ๋ผ์ง ๋ถ๋ถ์ ๊ฐ์ ํ์งํ๊ณ ์์ ํ์ฌ ์ค์ DOM์๊ฒ ์ ๋ฌํ๋ค. ๋ง์ฝ VirtaulDOM์ด ์์๋ค๋ฉด ๋ชจ๋ ๋ถ๋ถ์ด ๋ ๋๋ง ํด์ผํ๊ธฐ ๋๋ฌธ์ ์ ๋ถ๋ค ๋นจ๊ฐ์์ผ๋ก ๋ฐ๋์์ ๊ฒ์ด๋ค.
6. Diffing Algorithm
์๋๋ React doc์์ ์ค๋ช ํ๋ VirtualDOM์ ๊ฐ๋ ์ด๋ค.
The virtual DOM (VDOM) is a programming concept where an ideal, or โvirtualโ, representation of a UI is kept in memory and synced with the โrealโ DOM by a library such as ReactDOM. This process is called reconciliation.
๋ฆฌ์กํธ์์๋ VirtaulDOM์ด ReactDOM๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ค์ DOM๊ณผ ์ฐ๋์์ผ์ค๋ค๊ณ ํ๋ค. ์ด๋ฌํ ๊ณผ์ ์ "reconciliation"์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด๋ diffing ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด ๋ ๋๋ง์ ํ๋ค.
์ง์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด์ ๋ฆฌ์กํธ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง, ์ด๋ค ๊ท์น์ด ์๋์ง ์์๋ณด์.
6-1. Elements Of Different Types
์์ root element๊ฐ ๋ฐ๋๋ฉด ํ์ element๋ ํจ๊ป ๋ฐ๋๋ค.
import React from "react";
import Hedaer from "./Header";
function App() {
return (
<div>
<Header />
</div>
);
}
// ์์ํ๊ทธ div๊ฐ span์ผ๋ก ๋ฐ๋๋ค.
function App() {
return (
<span>
<Header />
</span>
);
}์์ ์ฝ๋๋ฅผ ์ค๋ช
ํ์๋ฉด ์์์ ์๋ divํ๊ทธ๊ฐ span์ผ๋ก ๋ฐ๋์๋ค. ์ด๋ด ๊ฒฝ์ฐ Header์ปดํฌ๋ํธ๊ฐ ๋ฐ๋์ง ์๋๋ผ๊ณ ๋ฆฌ์กํธ๋ ์๋ก์ด DOM๋ฅผ ์์ฑํ๋ค.
6-2. DOM Elements Of The Same Type
์ด๋ฒ์๋ element(์์)๋ ๊ฐ์ง๋ง attribute(์์ฑ)์ด ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ์ด๋ค. ์๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ
import React from "react";
import Hedaer from "./Header";
function App() {
return (
<div className="after">
<Header />
</div>
);
}
// ์์ํ๊ทธ div์ className์ด ๋ฐ๋๋ค.
function App() {
return (
<div className="before">
<Header />
</div>
);
}์ด์ ๊ฐ์ ์ํฉ์์ ๋ฆฌ์กํธ๋ ๋ attribute(์์ฑ)์ ๋น๊ตํ์ฌ ๋ฐ๋ ๋ถ๋ถ๋ง ๋ณํ์ํจ๋ค.
6-3. Recursing On Children
ํ์(์์) ์์๊ฐ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
import React from "react";
function App() {
return (
<ul>
<li>๊ฐ์์ง</li>
<li>๊ณ ์์ด</li>
</ul>
);
}
// ์ธ๋ฒ์งธ ๋ฆฌ์คํธ๋ง ์ถ๊ฐ
function App() {
return (
<ul>
<li>๊ฐ์์ง</li>
<li>๊ณ ์์ด</li>
<li>๊ฑฐ๋ถ์ด</li>
</ul>
);
}๋ฆฌ์กํธ๋ diffing ์๊ณ ๋ฆฌ์ฆ์ ์ฒซ๋ฒ์งธ, ๋๋ฒ์งธ ๋ฆฌ์คํธ๊ฐ ๊ฐ์ ๊ฒ์ ํ์ธํ์๊ณ ์ธ๋ฒ์งธ ๋ฆฌ์คํธ๋ง ๋ค๋ฅด๋ค๋ ๊ฒ์ ํ์ธํ๊ธฐ ๋๋ฌธ์ ์ธ๋ฒ์งธ element(์ฌ์์๋ <li>๊ฑฐ๋ถ์ด</li>)๋ง ์ถ๊ฐํ๋ค. ๋ง์ฝ ๊ธฐ์กด DOM๋ฐฉ์์ด์๋ค๋ฉด ๋ชจ๋ ๋ค์ ๋๋๋ง์ด ๋์์ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ฒซ๋ฒ์ฌ ๋ฆฌ์คํธ๊ฐ ๋๋ฒ์งธ๊ฐ ๋๊ณ ์๋ก์ด ์ฒซ๋ฒ์งธ ๋ฆฌ์คํธ๊ฐ ์๊ธฐ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?(์๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ )
import React from "react";
function App() {
return (
<ul>
<li>๊ฐ์์ง</li>
<li>๊ณ ์์ด</li>
</ul>
);
}
// ๊ฑฐ๋ถ์ด ๋ฆฌ์คํธ๊ฐ ์ฒซ๋ฒ์งธ ๋ฆฌ์คํธ๋ก ์ถ๊ฐ
function App() {
return (
<ul>
<li>๊ฑฐ๋ถ์ด</li>
<li>๊ฐ์์ง</li>
<li>๊ณ ์์ด</li>
</ul>
);
}์ด๋ฐ ๊ฒฝ์ฐ๋ ๋ฆฌ์กํธ๋ ์ฒซ ๋ฒ์งธ ๋ฆฌ์คํธ๊ฐ ๊ฐ์์ง์์ ๊ฑฐ๋ถ์ด๋ก ๋ฐ๋ ๊ฒ์ ์์์ฑ๊ณ li์ ๋ชจ๋ ์์๋ฅผ ์๋ก ๋๋๋ง ํ๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด key props๋ฅผ ํตํด ํด๊ฒฐํ ์ ์๋ค.
6-4. key
๋ฆฌ์กํธ์์ ์ฐ๋ฆฌ๊ฐ Array.map()๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ key ์์ฑ์ ์ฌ์ฉํด์ผ ํ๋ค. ๊ทธ ์ด์ ๊ฐ ๋ฐ๋๋ ๊ฐ์ด ์๊ณ ์์๋ ๋ฐ๋์์ ๊ฒฝ์ฐ DOM์ด ์ฒ์๋ถํฐ ์๋กญ๊ฒ ๋ ๋๋ง์ ํ์ง ์๊ฒ ์ํด์๋ค.
'6-3. Recursing On Children'์์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด์.
import React from "react";
function App() {
return (
<ul>
<li key="1">๊ฐ์์ง</li>
<li key="2">๊ณ ์์ด</li>
</ul>
);
}
// ๊ฑฐ๋ถ์ด ๋ฆฌ์คํธ๊ฐ ์ฒซ๋ฒ์งธ ๋ฆฌ์คํธ๋ก ์ถ๊ฐ
function App() {
return (
<ul>
<li key="3">๊ฑฐ๋ถ์ด</li>
<li key="1">๊ฐ์์ง</li>
<li key="2">๊ณ ์์ด</li>
</ul>
);
}์์ ๊ฐ์ด ๊ฐ ์์์ key๋ฅผ ์ง์ ํด์ฃผ๋ฉด ์๋ก์ด ์์๊ฐ ์ถ๊ฐ๋๊ณ ์์๊ฐ ๋ฌ๋ผ์ง๋๋ผ๋ ์ฒ์๋ถํฐ ๋ ๋๋ง์ ํ์ง ์๊ณ ๋ณํ๊ฐ ์๊ธด ๋ถ๋ถ๋ง ๋ ๋๋ง ํด์ค๋ค. ๋จ key์์ฑ์ ๊ฐ์ ๊ณ ์ ๊ฐ์ด์ฌ์ผ ํ๋ค. ์ฆ ์ค๋ณต๋์๋ ์๋๋ค.
key๋ฅผ ๊ตณ์ด ์ง์ ํ์ง ์์๋ ์ค๋ฅ๊ฐ ๋์ง ์๊ณ ๋ฐ๋ ๋ถ๋ถ์ด ํ๋ฉด์ ์ ๋ํ๋๋ค. ํ์ง๋ง ๋ฆฌ์กํธ์์ warning ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด์ค๋ค. ์ด๋ DOM ๋ ๋๋ง์์ ์ฑ๋ฅ์ด ์ ํ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ์ด๋ฆฌ๊ธฐ ์ํด key๋ฅผ ์ง์ ํด ๋๋๋ก ํ์.
์๋๋ ๋ฆฌ์กํธ๋ก ๊ฐ๋ฐ์ ํ ๊ฒฝ์ฐ ์์ฃผ ๋ณด๊ฒ ๋๋ array์ Array.map()๋ฉ์๋ ๊ทธ๋ฆฌ๊ณ key props์ด๋ค.
import React from "react";
function App() {
const colors = ["black", "red", "blue", "white"];
return (
<ul>
{colors.map((color, index) => (
<li key={index}>{color}</li>
))}
</ul>
);
}7. React Fiber
Fiber์ React16์ ์๋ก์ด reconciliation์์ง์ด๋ค. Fiber์ ์ฃผ์ ๋ชฉํ๋ VirtualDOM์ incremental rendering๋ฅผ ํ์ฑํํ๋ ๊ฒ์ด๋ค. React Fiber Architecture
React Fiber์ ๋ํด์๋ ํ ์ฑํฐ๋ก ๋ฐ๋ก ์ ๋ฆฌ๋ฅผ ํ๋๋ก ํ์.
8. Conclusion
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐฐ์ธ ๋ ๊ณต๋ถํ๋ DOM์ ๋ด์ฉ์ด ์ด๋ ดํ์ด ๊ธฐ์ต์ด ๋ฌ๋ค. ๋๋ DOM์ ์ฌ์ฉํด์ HTML์ ์กฐ์ํ์ ๋ ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ ๋ณต์กํด์ง๋ค๋ผ๋ ๋๋์ด ๋ค์์ง๋ง DOM์ ์ฌ์ฉํด์ HTML์ ์์๋ฅผ ๋ฐ๋๋ ๊ฒ์ ์ฌ๋ฏธ๋ฅผ ๋๊ผ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ ๋ฆฌ์กํธ๋ฅผ ๋ฐฐ์ฐ๋ ๋ฐฐ์ ๋ DOM๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ธฐ์ต ์์ ์ ์ ๋ฌป์ด๋์๋ค.(์์ฃผ ๊ฐํน ์ฌ์ฉํ์๋ค. NextJS ๋ฐฐ์ธ๋) ๋ฆฌ์กํธ์์์ VirtualDOM์ด DOM์ ๋นํจ์จ์ ์ธ(๊ทธ๋ ๋ค๊ณ ์์ฒญ ๋นํจ์จ์ ์ด์ง ์์ ๊ฑฐ ๊ฐ๋ค.) ๋ ๋๋ง ๋ฐฉ์์ ๋ณด์ํด์ฃผ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ด๋ฒ ๊ณต๋ถ๋ฅผ ํตํด ์๊ฒ ๋์๊ณ ๋ด๊ฐ ์๋ฌด๋ฐ ์๊ฐ์์ด ์งฐ๋ ์ฝ๋๋ค์ด VirtualDOM๋ฅผ ํ์ฉํ ๋ฐฉ์์ด๋ผ๋ ๊ฒ์ ๋๋ผ์ ๋ค. ์ญ์ ๊ณต๋ถ๋ฅผ ํ๊ณ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ณต๋ถํ์ง ์๊ณ ์ฌ์ฉํ๋ ๊ฒ์ ํฐ ์ฐจ์ด๊ฐ ์๋ ๋ฏ ํ๋ค.๐ง ๊ทธ๋ฆฌ๊ณ ์ด์ ์ ํ์๊ณผ ์ฝ๋๋ฅผ ํจ๊ป ๋ณด๋ฉฐ ๊ณต๋ถ๋ฅผ ํ๋ค๊ฐ ํ ํ์์ด
key props๋ฅผ ์ฌ์ฉํ์ง ์์ warning ๋ฉ์ธ์ง๊ฐ ๋ํ๋๋ ๊ฒ์ ๋ณด์๋ค. ๋๋key props๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์ด์ผ๊ธฐ ํ๊ณ ์ด๋ ํ ์ด์ ์ธ์ง๊น์ง๋ ์ค๋ช ์ ๋ชปํ๋ค. ํ์ง๋ง ์ง๊ธ์ ์์ ์๊ฒ ์ค๋ช ํ ์ ์์ ๊ฑฐ ๊ฐ๋ค.๐ ๋์ผ๋ก ๊ณต๋ถ๋ฅผ ํ๋ฉด์ ์ ๋ฆฌ๋ฅผ ํ๊ณ ์๋๋ฐ ๋ด๊ฐ ์ฉ์ด๋ฅผ ์ ์ฌ์ฉํ๊ณ ์๋์ง ์๋ชป๋ ์ ๋ณด๊ฐ ์๋์ง ๊ฑฑ์ ์ด ๋๋ค. ์ด๋ฅผ ๋ณด์ ๋ถ๋ค ์ค ์๋ชป๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ๊ผญ ๊นํ๋ธ์ด์๋ฅผ ํตํด ์๋ ค์ฃผ์๊ธธ ๋ฐ๋๋ค.
์ฐธ๊ณ
[JS/DOM] ์๋ฐ์คํฌ๋ฆฝํธ, ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ(Document Object Model)์ ๋ํ์ฌ DOM์ ๊ฐ๋ Virtual DOM ๋์ ์๋ฆฌ์ ์ดํด (with ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ๊ณผ์ ) ์ Virtual DOM์ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์๋ฅผ ์ค์ฌ์ฃผ๋๊ฐ? DOM๊ณผ Virtual Dom์ด๋? ๋ฆฌ์กํธ: Virtual DOM(๊ฐ์๋, ๋ฒ์ถ์ผ๋)์ด๋? React, diffing ์๊ณ ๋ฆฌ์ฆ
๐ 2022-07-16
Last updated