์ฃผ์ ์์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- diff ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
- useState
ํ์ต ํค์๋
- ์ค๋๋ Virtual DOM๊ณผ React Fiber..
๊ณ ๋ฏผ ๋ฐ ํด๊ฒฐ๊ณผ์
useState์ ์ฌ์ฉ
useState์ ๊ฒฝ์ฐ ํด๋น ์ํ๋ฅผ ๊ธฐ์กด์ Root Fiber์ ๊ตฌ๋ ํ๊ณ ์ํ ์ ๋ฐ์ดํธ๊ฐ ์ผ์ด๋ ๊ฒฝ์ฐ Root๋ถํฐ Fiber๋ฅผ ๊ตฌ์ฑํ์ฌ(์๋์ ๋ฆฌ์กํธ๋ ๊ธฐ์กด์ fiber๋ฅผ ์ฌ์ฌ์ฉํ๋ค. ๋์ ๊ฒฝ์ฐ๋ ์๋กญ๊ฒ Fiber๋ฅผ ๋ง๋๋ ๊ฒ์ผ๋ก ๊ตฌ์ํ๋ค) ์ฌ๊ตฌ์ฑ ๊ณผ์ ์ ๊ฑฐ์น ๋ค์์ ์๋กญ๊ฒ ๋ณ๊ฒฝ๋ DOM tree๋ก ๊ต์ฒดํ ์ ์๋๋ก ์ค๊ณ๋ฅผ ํ์๋ค.
๋๋ ๋ฐ๋ ์ํ๋ฅผ ๋ค์๊ธ createElement๋ฅผ ํตํด ๊ตฌ์ฑ ์์๋ค์ ๋ฃจํธ๋ถํฐ fiber๋ก ๋ง๋ค๊ณ reRenderํจ์๋ฅผ ์คํ์ํด์ผ๋ก์จ ์๋กญ๊ฒ ๋ฐ๋ ๊ฒ๋ค์ด ๋ฐ์๋์ด ๋ ๋๋ง๋๋๋ก ํ๊ณ ์ถ์๋ค. ํ์ง๋ง ์๋กญ๊ฒ createElementํ๋ ๋ถ๋ถ์ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ? ์ ๋ํด์ ๊ณ ๋ฏผ์ด ๋ง์์ง ๊ฒ ๊ฐ๋ค.
import { Root } from "../dom/DomRoot";
import { RootFiber } from "../dom/rootFiber";
/**
*
* @param {RootFiber} initialState
* @returns {[any, function]}
*/
export function useState(initialState) {
let state = initialState;
const hostRoot = Root();
function setState(newState) {
state = newState;
hostRoot.reRender();
}
idx++
return [state, setState];
}ํ์ฌ๋ ์ฑ๊ธํค์ผ๋ก ๊ตฌํํด๋์ Root์ ์์ชฝ ์์๋ฅผ ๋งจ ์ฒ์ createElementํ๋ ๊ณผ์ ์์ ํด๋น Element๊ฐ์ฒด๋ค์ elements๋ผ๋ ํ๋กํผํฐ์ ๋ฃ์ด๋๊ณ ํ๋กํ ํ์
ํจ์ reRender๋ฅผ ์ถ๊ฐํ์ฌ ํด๋น Element์๊ฒ ๋ค์๊ธ ๋ ๋๋ง์ ์ํฌ ์ ์๋๋ก ํ๋ค.
์ฒ์ ๋ ๋๋ง ๋์ ๋๋ ์๋์ ์ผ๋ก renderํจ์ ์์ createElement ํจ์์ ๊ฒฐ๊ณผ๋ฌผ์ด ์ธ์๋ก ๋ค์ด๊ฐ์ง๋ง, ์ด๋ฅผ ๋ค์๊ธ ๋ ๋๋ง ํ๋ ๊ณผ์ ์์๋ createElement์ ์ธ์๋ก ๋ค์ด๊ฐ state์ ๊ฐ์ด ์์๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ณต์ฌํ์ฌ ๋ฃ์ด์ ธ ์๋ ์ํ์ด๋ค. ๋ฐ๋ผ์, ํด๋น ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค๊ณ ํด์ createElement ์์ ์๋ ๋ด state์ ๊ฐ์ด ๋ณํ์ง ์๋๋ค.
์ผ๋จ ๋ฆฌ์กํธ ์์ฒด๊ฐ ๋ด๊ฐ ์ค๊ณํ ๋ฐฉ์๋ณด๋ค ํจ์ฌ ๋ณต์กํ๊ฒ ๊ตฌ์ฑ๋์ด ์๊ธฐ๋๋ฌธ์ ์์ ํ ๋๊ฐ์ด ๋ง๋ค๊ธฐ๋ ์ด๋ ต๋ค. ์ด์ ๊ธฐ๋ฅ์ ์ต๋ํ ์ค์ด๋ฉด์ ๋ด๊ฐ ์ํ๋ ๋ฐฉ์๋๋ก ๋์ํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ๋ชฉํ์ธ๋ฐ useState๊ฐ ๊ฐ์ฅ ๋๊ด์ธ ๊ฒ ๊ฐ๋ค. ์์ง์ ํด๊ฒฐ ๋ฐฉ์์ด ๋ช ํํ๊ฒ ๋ ์ค๋ฅด์ง ์์ ์ด useState๋ฐฉ์์ ๋ํด์ ๋ณด๋ค ๊ณ ๋ฏผ์ ํด์ผ ํ ๊ฒ ๊ฐ๋ค.
๋ฆฌ๋ทฐ ์์ฒญ
์๋ ํ์ธ์ ๋ฉํ ๋! ๊ณ ์ ๋ง์ผ์ญ๋๋ค. ์ค๋ ๋ฆฌ๋ทฐ์์๋ ๋ฐ๋ก ๊ธฐ์ ์ ์ง๋ฌธ์ฌํญ์ ์์ต๋๋ค. ์์ ๋ณด์๋ค์ํผ ํ์ฌ useState์ ์ค๊ณ ๋ฐฉ์์ ๋ํด์ ๊ณ ๋ฏผํ๊ณ ์๋๋ฐ, ์ด๋ฌํ ๋ถ๋ถ์ ์์ง๊น์ง ์ฌ๋ฌ ๊ฒฝ์ฐ์ ์๋ฅผ ์๊ฐํ๊ณ ์๋ํ๋ ์ค์ด๋ผ ์ด์ ๋ํด์ ๋ฌดํฑ๋๋ก ์ง๋ฌธ์ ํ๊ธฐ๋ณด๋ค๋ ์ฌ๋ฌ๊ฐ์ง ๋์ ์ ํด๋ณด๊ณ ์ถ์ต๋๋ค.
ํ์ง๋ง ์ด ๊ณผ์ ์์ ์ ๊ฐ ๊ฒช๋ ํ์ต ๋ฐฉ์์ ๋ฌธ์ ์ ๋ํด ์กฐ๊ธ ์ฌ์ญค๋ณด๊ณ ์ถ์ต๋๋ค.
ํ์ฌ ์ ๊ฐ ๊ตฌํํ๋ fiber์ ์ด fiber๋ฅผ ๋น๊ตํ๋ diff ์๊ณ ๋ฆฌ์ฆ, dom์ createRoot๋ฑ ์ฌ์ค์ ์ฌ์ฉํ๋ ๋ชจ๋ ํจ์๋ค์ ๋ฆฌ์กํธ๋ฅผ ์ฐธ๊ณ ํ๋ฉด์ ๋ง๋ ๊ธฐ๋ฅ์ด๊ธฐ๋ ํ์ง๋ง ํ๋ก์ ํธ์ ๊ท๋ชจ์ ๋ง๊ฒ ์์๋ก ์ถ์ํ ๋ฒ์ ์ด๊ธฐ์ ๋ถ์กฑํ ๋ถ๋ถ์ด ๋ง์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ์ ๋ก์ง์ ๋ง์ด ๋ณํํ๊ธฐ๋ ํ์ต๋๋ค.
๋ฌธ์ ๋ ์ด๋ฌํ ๋ฆฌ์กํธ์ ๊ธฐ๋ณธ ๋ก์ง์ ๋ํด์ ํ์ต์ ํ๊ณ ๋๋ฆ๋๋ก ๋ณํํด์ ๊ตฌํํ๋ ๊ณผ์ ์ด๋ค ํ๋๋ผ๋ ์ฌ์ค์ ๋ณํํ์ฌ ๊ตฌํํ๋ ๊ฒ์ด ๊ณผ์ฐ ๋ฆฌ์กํธ์ ๊ธฐ๋ณธ ๋ก์ง ํ์ต์ด๋ผ๋ ๊ด์ ์์ ๋ณผ ๋ ๊ด์ฐฎ์ ๋ฐฉ๋ฒ์ด ๋ง์๊น? ํ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
์๋ฆฌ๋ ํ์ต์ ํ๊ณ ๊ตฌํ์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํ๋ค ์ณ๋, ์ด๋ ๊ฒ ๋ณํํ๋ฉด์ ํ์ตํ๋ ๋ฐฉ์์ด ์คํ๋ ค ๊ตฌ์ํ๋ ๋ก์ง๊ณผ ํ์ตํ๋ ์ง์์ด ํผ๋๋๋ ๋ฌธ์ ๊ฐ ์ข
์ข
์๊ฒจ ๊ฑฑ์ ๋ ๋์ด ์ฌ์ญค๋ณด๊ฒ ๋์์ต๋๋ค. ์ด์ ๋ํด์ ๋ฉํ ๋์ ๊ณ ๊ฒฌ์ ์ฌ์ญ์ด ๋ด๋ ๋ ๊น์?
๋ฆฌ๋ทฐํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!๐