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

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • DOM์˜ createRoot ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„(์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ)
    • reconciliation(์ƒˆ๋กœ์šด Fiber์™€ ๊ธฐ์กด Fiber ์žฌ์กฐ์ •) ํ•จ์ˆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
      • diff ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•„์ง..
    • render ํ•จ์ˆ˜ ์ˆ˜์ •
      • ์ƒˆ๋กœ์šด ํŒŒ์ด๋ฒ„๋ฅผ ๋งŒ๋“ค๊ณ , ์žฌ์กฐ์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์žฌ์กฐ์ •ํ•œ ํ›„์— DOM์— ๋ Œ๋”๋งํ•˜๋Š” ๊ณผ์ •์œผ๋กœ ์ˆ˜์ •
      • ๊ธฐ์กด renderํ•จ์ˆ˜๋Š” createHTMLElementFromFiber ํ•จ์ˆ˜๋กœ, ์˜ค์ง HTML Element๋งŒ ๋งŒ๋“œ๋Š” ๊ณผ์ •๋งŒ ์ฑ…์ž„์งˆ ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌํŒฉํ† ๋ง
    • rootFiber ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
      • createRootFiber๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด rootFiber ์ƒ์„ฑ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
      • getRootFiber๋ฅผ ํ†ตํ•ด ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ๋œ rootfiber๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ
      • patchRootFiber๋ฅผ ํ†ตํ•ด ์žฌ์กฐ์ •์ด ์™„๋ฃŒ๋œ ํŒŒ์ด๋ฒ„๋ฅผ ๊ธฐ์กด์˜ rootFiber์—์„œ ์—…๋ฐ์ดํŠธ์‹œ์ผœ์ฃผ๋Š” ๋กœ์ง ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„

ํ•™์Šต ํ‚ค์›Œ๋“œ

  • ์˜ค๋Š˜๋„ Virtual DOM๊ณผ React Fiber..

๊ณ ๋ฏผ ๋ฐ ํ•ด๊ฒฐ๊ณผ์ •

๋ Œ๋”๋ง ๊ณผ์ •์— ๋”ฐ๋ฅธ ํ•จ์ˆ˜ ์„ค๊ณ„

jsx์—์„œ babel์„ ํ†ตํ•ด ํŠธ๋žœ์ŠคํŒŒ์ผ๋งํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐ๊ฐ์˜ element์— ๋Œ€ํ•ด์„œ createElement๊ฐ€ ์‹คํ–‰๋˜๊ณ , ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ๋ฌผ์€ ํ•œ ๊ฐ์ฒด๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

๋ฌธ์ œ๋Š” ์ด๋Ÿฌํ•œ element ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ ์–ธ์ œ ์–ด๋””๋ฅผ fiber๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๊ณ„์†ํ•ด์„œ ๋ Œ๋”๋ง ๋กœ์ง์„ ๊ด€๋ฆฌํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ๋’ค์ฃฝ๋ฐ•์ฃฝ์ด๋ผ ๋‹ค์‹œ๊ธˆ ๋ฆฌ์•กํŠธ์˜ ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด์•˜๋‹ค.

React์˜ ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๋ณด๋ฉด ๊ทผ๋ณธ์ ์ธ entry point๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ index.js์ด๋‹ค. index.js์™€ index.html์„ ํ†ตํ•ด ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ผˆ๋Œ€๋งŒ์„ index.html์— ๋งŒ๋“ค์–ด ๋†“๊ณ , index.js๊ฐ€ ํ•ด๋‹น root node๋ฅผ ๋ฐ›์•„ ์ด๋ฅผ DOM ์ž์ฒด์˜ root๋กœ ์ง€์ •ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” index.js์˜ root๋Š” ๋ธŒ๋ผ์šฐ์ € ์ž์ฒด์˜ root๊ฐ€ ๋˜๋ฉฐ Fiber์˜ root๊ฐ€ ๋˜๋Š” ๊ณณ์€ ํ•ด๋‹น root id๋ฅผ ๊ฐ€์ง„ element ์•ˆ์ชฝ์˜ ์š”์†Œ๊ฐ€ Fiber์˜ root๊ฐ€ ๋œ๋‹ค๊ณ  ์ดํ•ดํ–ˆ๋‹ค.

SPA(Single Page Application)์˜ ํ•ต์‹ฌ์€, ํŽ˜์ด์ง€์˜ ์ด๋™ ์—†์ด ๊น”๋”ํ•˜๊ฒŒ ๋งˆ์น˜ โ€˜์•ฑโ€™์ฒ˜๋Ÿผ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๊ทผ๋ณธ์ ์ธ html ์ „์ฒด์ ์ธ template ์ž์ฒด๋ฅผ ๊ฐˆ์•„๋ผ์šฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, html ๋ผˆ๋Œ€ ์ž์ฒด๋Š” ๊ณ ์ •์ ์œผ๋กœ ๋‘๋˜ html template ์•ˆ์—์„œ์˜ body ๋ถ€๋ถ„๋งŒ ๊ณ„์†ํ•ด์„œ DOM์„ ์žฌ๊ตฌ์„ฑํ•˜๊ณ  ๊ฐˆ์•„๋ผ์šฐ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ root์™€ FiberRoot๋ฅผ ๋”ฐ๋กœ ๋‘๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ์„ค๋“๋ ฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

import { render } from "./DomRender";
 
let instance = null;
 
export function Root(rootNode) {
  if (instance) return instance;
  this.rootNode = rootNode;
  instance = this;
}
 
Root.prototype.render = (element) => {
  render(element);
};
 
export function createRoot(domNode) {
  return new Root(domNode);
}

๋”ฐ๋ผ์„œ ๋‚˜๋Š” html ๋ผˆ๋Œ€๊ฐ€ ๋˜๋Š” root์˜ ๊ฒฝ์šฐ๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์ด์šฉํ•ด ํ•ญ์ƒ ๊ฐ™์€ html template์„ ์œ ์ง€ํ•˜๋„๋ก ํ–ˆ์œผ๋ฉฐ, renderํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด App, ์ฆ‰ ๋ฆฌ์•กํŠธ ์ƒ์˜ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ๋ฅผ ๋ Œ๋”๋ง์‹œํ‚ค๋Š” renderํ•จ์ˆ˜๋ฅผ Root instance์˜ prototype์œผ๋กœ ๋“ฑ๋กํ•ด๋†“์•˜๋‹ค.

let rootFiber = null;
 
export function createRootFiber(rootFiber) {
  if (rootFiber) return rootFiber;
  return new RootFiber(rootFiber);
}
 
export function patchRootFiber(patchedRootFiber) {
  if (rootFiber) return rootFiber;
  rootFiber.patch(patchedRootFiber);
  return rootFiber;
}
 
export function RootFiber(rootFiberInstance) {
  if (rootFiber) return rootFiber;
  this.rootFiberInstance = rootFiberInstance;
  rootFiber = this;
}
 
RootFiber.prototype.patch = (patchedRootFiber) => {
  this.rootFiberInstance = patchedRootFiber;
  rootFiber = this;
};

rootFiber์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ์•กํŠธ ์ƒ์—์„œ ์‹ค์งˆ์ ์œผ๋กœ ๋ Œ๋”๋ง์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” body ์•ˆ์˜ ์š”์†Œ๋“ค์„ Fiber ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด๋†“์€ ์ธ์Šคํ„ด์Šค์ด๋‹ค. ์žฌ์กฐ์ •์ด ์ผ์–ด๋‚  ๊ฒฝ์šฐ patch๋ฅผ ํ†ตํ•ด RootFiber๊ฐ์ฒด๋ฅผ ๊ฐˆ์•„๋ผ์šด๋‹ค.

์ด๋ ‡๊ฒŒ root๋ฅผ DOMRoot์™€ FiberRoot๋ฅผ ๋‘๊ฐœ ๋ชจ๋‘ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ, ์ด๋ฅผ ์‹ค์งˆ์ ์œผ๋กœ ์ ์šฉํ•ด๋ณด์•˜๋‹ค.

//index.js
import * as mhReact from "mhreact";
import App from "./app.jsx";
 
const root = mhReact.createRoot(document.getElementById("root"));
root.render(<App />);

index.js๋Š” ๊ฐ€์žฅ ๊ทผ๋ณธ์ ์ธ ๋ผˆ๋Œ€๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. react ๊ณต์‹๋ฌธ์„œ์— ๋‚˜์™”๋˜ Index์˜ ์—ญํ• ์ฒ˜๋Ÿผ, root๋ผ๋Š” id๋ฅผ ๊ฐ€์ง„ element๋ฅผ ๋ฐ›์•„์™€ ํ•ด๋‹น element๋ฅผ root๋กœ ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น element ์•ˆ์—์„œ ๊ณ„์†ํ•ด์„œ DOM์„ ๊ฐˆ์•„๋ผ์šธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๊ณ , ์‹ค์งˆ์ ์ธ ์•ˆ์ชฝ ์š”์†Œ์˜ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋Š” app.jsx๋กœ ์„ค์ •ํ•˜์˜€๋‹ค.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body id="root"></body>
  <script type="module" src="./bundle.js"></script>
</html>

index.html์€ ์ •๋ง ๊ธฐ๋ณธ์ ์ธ ๋ผˆ๋Œ€๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด์„œ bodyํƒœ๊ทธ๋ฅผ fiberRoot๊ฐ€ ๋“ค์–ด๊ฐˆ ๋ฆฌ์•กํŠธ์˜ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋กœ ์„ค์ •ํ•ด๋‘์—ˆ๋‹ค. ์ด ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋Š” script์—์„œ ๋ฒˆ๋“ค๋ง๋œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด index.js๋ฅผ ์‹คํ–‰์‹œ์ผœ body ์•ˆ์ชฝ์—์„œ <App/> ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ๋ฅผ ๋ Œ๋”๋ง ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.