๐ Diff Algorithm: ํบ์๋ณด๊ธฐ!
Diff Algorithm(๋ํ ์๊ณ ๋ฆฌ์ฆ)์ ๋ ๊ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋น๊ตํด์ ๋ณํ๋ ๋ถ๋ถ(์ฐจ์ด์ )์ ์ฐพ์๋ด๋ ์๊ณ ๋ฆฌ์ฆ์ด์์. ์ด ๊ธฐ์ ์ ํนํ React์ ๊ฐ์ ํ๋ ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ค์ํ ์ญํ ์ ํ๊ณ , ์์ค ์ฝ๋ ๊ด๋ฆฌ ์์คํ (์: Git)์์๋ ํต์ฌ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ค๋์ Diff Algorithm์ ์๋ฆฌ๋ถํฐ ์ค๋ฌด ํ์ฉ๊น์ง, ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ๊ฒ์ ๊น์ด ์๊ฒ ํํค์ณ ๋ณด๊ฒ ์ต๋๋ค. ๐ ๏ธ
๐ Diff Algorithm์ด๋?
Diff Algorithm์ ๋ ๋ฐ์ดํฐ์ ์ฐจ์ด์ ์ ์ฐพ์๋ด๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์ด๋ฅผ ํตํด ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ, ์ญ์ , ๋๋ ์์ ๋์๋์ง ๋น๊ตํ ์ ์์ด์.
์๋ฅผ ๋ค์ด, ๋ค์ ๋ ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ํด๋ด ์๋ค.
Original: "Hello, World!"
Modified: "Hello, React World!"
Diff Algorithm์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํฉ๋๋ค:
๐ “React”๋ผ๋ ๋ฌธ์์ด์ด ์ถ๊ฐ๋จ.
๐ค Diff Algorithm์ ์ด๋์ ์ฐ์ด๋์?
1. Git๊ณผ ๊ฐ์ ๋ฒ์ ๊ด๋ฆฌ ์์คํ
Git์ Diff Algorithm์ ์ฌ์ฉํ์ฌ ๋ ์ฝ๋ ์ํ์ ์ฐจ์ด๋ฅผ ๋ถ์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ณ๊ฒฝ๋ ์ค์ ํ์ํ๊ฑฐ๋, ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ณํฉํ ๋ ๋์์ ์ค๋๋ค.
2. React์ Virtual DOM
React๋ UI ์ ๋ฐ์ดํธ ์, ๊ธฐ์กด DOM๊ณผ ์๋กญ๊ฒ ์์ฑ๋ Virtual DOM ๊ฐ์ ์ฐจ์ด์ ์ ์ฐพ์๋ด์ด ํ์ํ ๋ถ๋ถ๋ง ์ค์ DOM์ ๋ฐ์ํฉ๋๋ค. ์ด ๊ณผ์ ์์ Diff Algorithm์ด ํต์ฌ ์ญํ ์ ํฉ๋๋ค.
3. ํ ์คํธ ๋น๊ต ๋๊ตฌ
Diff Algorithm์ ์ฝ๋ ๋ฆฌ๋ทฐ ๋๊ตฌ, ๋ฌธ์ ๋น๊ต ์ํํธ์จ์ด ๋ฑ์์๋ ์ฌ์ฉ๋ฉ๋๋ค.
๐ Diff Algorithm์ ๊ธฐ๋ณธ ๋์ ์๋ฆฌ
Diff Algorithm์ ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ(์ฃผ๋ก ํธ๋ฆฌ ๋๋ ๋ฌธ์์ด)๋ฅผ ๋น๊ตํ์ฌ ์ต์ํ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ฐพ์๋ด๋ ๋ฐ ์ด์ ์ ๋ง์ถฅ๋๋ค.
1. ๋ฌธ์์ด ๋น๊ต
- Longest Common Subsequence (LCS): ๋ฌธ์์ด ๋น๊ต์ ํต์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ๋ ๋ฌธ์์ด์์ ๊ฐ์ฅ ๊ธด ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด์ ์ฐพ์๋ด๊ณ , ๋๋จธ์ง ๋ถ๋ถ์ ์ฝ์ /์ญ์ /์์ ์ผ๋ก ๋ถ๋ฅํฉ๋๋ค.
Original: "abcd"
Modified: "acbd"
Result:
- ์ญ์ : "b"
- ์ถ๊ฐ: "b" (๋ค๋ฅธ ์์น)
2. ํธ๋ฆฌ ๊ตฌ์กฐ ๋น๊ต
React์ ๊ฐ์ ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ํธ๋ฆฌ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ Tree Diff Algorithm์ ์ฌ์ฉํฉ๋๋ค. ๋ ธ๋ ๊ฐ์ ์ฐจ์ด๋ฅผ ์ต์ํ์ผ๋ก ๊ณ์ฐํ์ฌ ํจ์จ์ ์ธ ์ ๋ฐ์ดํธ๋ฅผ ์ํํฉ๋๋ค.
๐ React์ Diff Algorithm
React๋ Virtual DOM์ ์ฌ์ฉํด ํจ์จ์ ์ธ UI ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๊ณผ์ ์์ Diff Algorithm์ด ์ค์ํ ์ญํ ์ ํด์.
- React์ Diff Algorithm ํน์ง
- O(n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ
- ์ ์ฒด DOM์ ๋น๊ตํ์ง ์๊ณ , ๋ ๊ฐ์ Virtual DOM ๊ฐ์ ์ฐจ์ด๋ง ์ฐพ์๋ ๋๋ค.
- React์ Tree Diff
- ๋์ผํ ๋ ๋ฒจ์ ๋ ธ๋๋ง ๋น๊ต: React๋ ํธ๋ฆฌ์ ๊น์ด๋ฅผ ๋ฐ๋ผ ๋ด๋ ค๊ฐ๋ฉฐ ๋์ผํ ๋ถ๋ชจ ์๋์ ์์ ๋ ธ๋๋ผ๋ฆฌ๋ง ๋น๊ตํฉ๋๋ค.
- ๋ ธ๋ ์ฌ์ฌ์ฉ: ๋์ผํ key๋ฅผ ๊ฐ์ง ๋ ธ๋๋ ์ฌ์ฌ์ฉํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ก ์์ฑํฉ๋๋ค.
์์ :
// ์ด์ Virtual DOM
<ul>
<li key="1">Apple</li>
<li key="2">Banana</li>
</ul>
// ์๋ก์ด Virtual DOM
<ul>
<li key="1">Apple</li>
<li key="3">Cherry</li>
</ul>
React์ Diff Algorithm ๊ฒฐ๊ณผ:
- key="1": ๋์ผ, ์ฌ์ฌ์ฉ
- key="2": ์ ๊ฑฐ
- key="3": ์ถ๊ฐ
๐ ๏ธ Diff Algorithm์ ๊ตฌํ
1. ๊ธฐ๋ณธ ๋ฌธ์์ด Diff
๋ฌธ์์ด ๊ฐ ์ฐจ์ด๋ฅผ ๋น๊ตํ๋ ๊ฐ๋จํ ์์ ์ ๋๋ค.
function diffStrings(original, modified) {
const originalArr = original.split('');
const modifiedArr = modified.split('');
const result = [];
for (let i = 0; i < modifiedArr.length; i++) {
if (originalArr[i] !== modifiedArr[i]) {
result.push({ index: i, original: originalArr[i], modified: modifiedArr[i] });
}
}
return result;
}
const original = "abcd";
const modified = "acbd";
console.log(diffStrings(original, modified));
/*
[
{ index: 1, original: 'b', modified: 'c' },
{ index: 2, original: 'c', modified: 'b' }
]
*/
2. React์ Virtual DOM Diff ์๋ฎฌ๋ ์ด์
React์ ๊ธฐ๋ณธ Diff Algorithm ๋์์ ๋จ์ํํ ์์ ์ ๋๋ค.
function diffTrees(oldTree, newTree) {
if (!oldTree && newTree) {
return "Node added";
}
if (oldTree && !newTree) {
return "Node removed";
}
if (oldTree.type !== newTree.type) {
return "Node replaced";
}
return "Node updated";
}
const oldTree = { type: "div", props: { className: "old" } };
const newTree = { type: "div", props: { className: "new" } };
console.log(diffTrees(oldTree, newTree)); // Node updated
๐ฉ Diff Algorithm์ ์ฃผ์ ๊ณผ์ ์ ํ๊ณ
1. ์ฑ๋ฅ
๋ณต์กํ ๊ตฌ์กฐ์์๋ Diff Algorithm์ด ๋ง์ ๊ณ์ฐ์ ์๊ตฌํฉ๋๋ค. ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด React๋ O(n) ๋ณต์ก๋์ ํธ๋ฆฌ ๋น๊ต๋ฅผ ์ฑํํ์ต๋๋ค.
2. Key ์์ฑ
React์ Diff Algorithm์์ key๋ ์ฑ๋ฅ๊ณผ ์ ํ์ฑ์ ๋์ด๋ ์ค์ํ ์์์ ๋๋ค. ๊ณ ์ ํ key๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฉด, ๋ถํ์ํ DOM ์ ๋ฐ์ดํธ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๐ฎ ์ค๋ฌด์์์ ํ์ฉ
- Git
- ๋ณ๊ฒฝ๋ ์ฝ๋๋ง ๋ณํฉ
- git diff ๋ช ๋ น์ด๋ก ๋ณ๊ฒฝ ์ฌํญ ํ์ธ
- React
- ํจ์จ์ ์ธ UI ์ ๋ฐ์ดํธ
- shouldComponentUpdate์ ๊ฐ์ ์ต์ ํ ๋๊ตฌ์ ํจ๊ป ์ฌ์ฉ
- ๋ฌธ์ ๋น๊ต
- Markdown ์๋ํฐ์์ ์ค์๊ฐ ๋น๊ต.
๐ ๋ง๋ฌด๋ฆฌ
Diff Algorithm์ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ์ํ ์ค์ํ ๋๊ตฌ์ ๋๋ค. ํนํ React์ ๊ฐ์ ํ๋์ ์ธ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์๋ ํ์์ ์ธ ๊ธฐ์ ๋ก ์๋ฆฌ ์ก๊ณ ์์ด์. ์ด๋ฅผ ์ดํดํ๋ฉด ์ฑ๋ฅ ์ต์ ํ์ ์ ์ฐํ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ํ ๊ฑธ์ ๋ ๊ฐ๊น์์ง ์ ์์ต๋๋ค.
๐ท์ ์ค์ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ด ์๋น! ๐ท