์ฃผ์š” ์ž‘์—…

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • 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๋“ฑ ์‚ฌ์‹ค์ƒ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋“ค์€ ๋ฆฌ์•กํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด์„œ ๋งŒ๋“  ๊ธฐ๋Šฅ์ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ์— ๋งž๊ฒŒ ์ž„์˜๋กœ ์ถ•์†Œํ•œ ๋ฒ„์ „์ด๊ธฐ์— ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ์˜ ๋กœ์ง์„ ๋งŽ์ด ๋ณ€ํ˜•ํ•˜๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด๋Ÿฌํ•œ ๋ฆฌ์•กํŠธ์˜ ๊ธฐ๋ณธ ๋กœ์ง์— ๋Œ€ํ•ด์„œ ํ•™์Šต์„ ํ•˜๊ณ  ๋‚˜๋ฆ„๋Œ€๋กœ ๋ณ€ํ˜•ํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค ํ•˜๋”๋ผ๋„ ์‚ฌ์‹ค์ƒ ๋ณ€ํ˜•ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ณผ์—ฐ ๋ฆฌ์•กํŠธ์˜ ๊ธฐ๋ณธ ๋กœ์ง ํ•™์Šต์ด๋ผ๋Š” ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ๊ดœ์ฐฎ์€ ๋ฐฉ๋ฒ•์ด ๋งž์„๊นŒ? ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์›๋ฆฌ๋Š” ํ•™์Šต์„ ํ•˜๊ณ  ๊ตฌํ˜„์„ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ•œ๋‹ค ์ณ๋„, ์ด๋ ‡๊ฒŒ ๋ณ€ํ˜•ํ•˜๋ฉด์„œ ํ•™์Šตํ•˜๋Š” ๋ฐฉ์‹์ด ์˜คํžˆ๋ ค ๊ตฌ์ƒํ•˜๋Š” ๋กœ์ง๊ณผ ํ•™์Šตํ–ˆ๋˜ ์ง€์‹์ด ํ˜ผ๋™๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ข…์ข… ์ƒ๊ฒจ ๊ฑฑ์ •๋„ ๋˜์–ด ์—ฌ์ญค๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ ๋ฉ˜ํ† ๋‹˜์˜ ๊ณ ๊ฒฌ์„ ์—ฌ์ญˆ์–ด ๋ด๋„ ๋ ๊นŒ์š”?

๋ฆฌ๋ทฐํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!๐Ÿ˜Š