2024-03-07.md

๐Ÿก

DIL: ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ ๋‹ค์ด๋ธŒ, 1์ฃผ์ฐจ-4

์Šคํ„ฐ๋””: ์›”๊ฐ„ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์˜ค๋Š˜ ์ง„ํ–‰: ๊ฐœ์ธ๊ณต๋ถ€


DIL-week1-4_2024-03-07

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ------ | ------------------------------ | ----------- | | 1์ฃผ์ฐจ | 1, 2์žฅ | ๋ฆฌ์•กํŠธ ํ•ต์‹ฌ์š”์†Œ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ | 124p~143p |

์˜ค๋Š˜ ์ฝ์€ ๋‚ด์šฉ์„ markdown์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ฉ”๋ชจ
์ฝ์€ ์‹œ๊ฐ„: ์ ์‹ฌ ์‹œ๊ฐ„ใ…  12์‹œ๋ฐ˜~1์‹œ๋ฐ˜
์ €๋… ์•ฝ์† ์ด์Šˆ


JSX => JS

  • ํ”Œ๋Ÿฌ๊ทธ์ธ: @babel/plugin-transform-react-jsx
const ComponentA = <A required={true}>Hello</A>;

// @babel/plugin-transform-react-jsx
const ComponentA = React.createElement(A, { required: true }, "Hello");

// automatic runtime: React 17, ๋ฐ”๋ฒจ 7.9.0 ์ดํ›„
const ComponentA = (0, _jsxRuntime.jsx)(A, { required: true, children: "Hello" });
  • JSXElement๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์„ ์–ธํ•ด ์š”์†Œ๋ฅผ ์ •์˜ํ•œ๋‹ค
  • ์˜ต์…”๋„์ธ JSXAttribute, JSXChildren, JSXString์„ ์ดํ›„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค
function TextOrHeading({
  isHeading,
  children,
}: PropsWithChildren<{ isHeading: boolean }>) {
  return createElement(
    isHeading ? "h1" : "p", // JSXElement
    { className: "text" }, // JSXAttribute (optional)
    children, // JSXChildren (optional)
  );
}

JSXNamespaceName, JSXMemberExpression์€ React์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค

๊ฐ€์ƒ DOM๊ณผ ๋ฆฌ์•กํŠธ ํŒŒ์ด๋ฒ„

๋ฆฌ์•กํŠธ์˜ ํŠน์ง•: ์‹ค์ œ DOM์ด ์•„๋‹Œ ๊ฐ€์ƒ DOM์„ ์‚ฌ์šฉํ•ด ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•œ๋‹ค.
์™œ ๋งŒ๋“ค์—ˆ์Œ? ์–ด๋–ป๊ฒŒ ๋น ๋ฆ„? ๊ฐœ๋…์€? ์ฃผ์˜์ ์€?

Document Object Model๊ณผ ๋ธŒ๋ผ์šฐ์ € ๋žœ๋”๋ง

  • DOM: ์›น ํŽ˜์ด์ง€์˜ ๊ตฌ์กฐํ™”๋œ ํ‘œํ˜„์„ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
  1. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ์ฃผ์†Œ๋ฅผ ๋ฐฉ๋ฌธํ•ด HTML์„ ๋ฐ›์•„์˜จ๋‹ค
  2. ๋ธŒ๋ผ์šฐ์ € ๋žœ๋”๋ง ์—”์ง„์ด HTML์„ ํŒŒ์‹ฑํ•ด DOM ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค (DOM ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋จ)
  3. 2๋ฒˆ ๊ณผ์ •์—์„œ CSS ํŒŒ์ผ์„ ๋ฐ›์•„์˜จ๋‹ค
  4. ๋ธŒ๋ผ์šฐ์ € ๋žœ๋”๋ง ์—”์ง„์ด CSS๋ฅผ ํŒŒ์‹ฑํ•ด CSSOM ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
  5. 2๋ฒˆ์—์„œ ๋งŒ๋“  DOM ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•œ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๋ˆˆ์— ๋ณด์ด๋Š” ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค.
  6. 5๋ฒˆ์˜ ๋…ธ๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ, ํ•ด๋‹น ๋…ธ๋“œ์˜ CSSOM ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ์ ์šฉํ•œ๋‹ค.
  • ๋ ˆ์ด์•„์›ƒ Layout/reflow: ๋…ธ๋“œ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
  • ํŽ˜์ธํŒ… Painting: ๋…ธ๋“œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฐ๋‹ค.
    (๋ ˆ์ด์•„์›ƒ์ด ๋ฐœ์ƒํ•˜๋ฉด ํŽ˜์ธํŒ…๋„ ๋ฐœ์ƒํ•œ๋‹ค)

๋ธŒ๋ผ์šฐ์ € ๋žœ๋”๋ง

๊ฐ€์ƒ DOM

๋ ˆ์ด์•„์›ƒ๊ณผ ํŽ˜์ธํŒ…์€ ๋น„์šฉ์ด ํฌ๋‹ค

  • ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์— ๋”ฐ๋ผ ๋ ˆ์ด์•„์›ƒ๊ณผ ํŽ˜์ธํŒ…์ด ๋ฐ˜๋ณต๋˜์–ด์•ผ ํ•œ๋‹ค
  • ๋ ˆ์ด์•„์›ƒ์ด ๋ฐœ์ƒํ•˜๋ฉด ํŽ˜์ธํŒ…๋„ ๋ฐœ์ƒํ•œ๋‹ค
  • ์ƒ์œ„ ๋…ธ๋“œ์˜ ๋ ˆ์ด์•„์›ƒ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ•˜์œ„ ๋…ธ๋“œ์˜ ๋ ˆ์ด์•„์›ƒ๋„ ๋ณ€๊ฒฝ๋œ๋‹ค

SPA์˜ ๊ฒฝ์šฐ

  • ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€์—์„œ ๊ณ„์†ํ•ด์„œ ๋ ˆ์ด์•„์›ƒ๊ณผ ํŽ˜์ธํŒ…์„ ๋ฐ˜๋ณตํ•œ๋‹ค
  • ๋ผ์šฐํŒ…์ด ๋ฐœ์ƒํ•˜๋ฉด, ํ—ค๋”, ํ‘ธํ„ฐ ๋“ฑ์„ ์ œ์™ธํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๋…ธ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค
  • DOM์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ , ๋ณ€๊ฒฝ๋œ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ๋ ˆ์ด์•„์›ƒ๊ณผ ํŽ˜์ธํŒ…์„ ๋ฐ˜๋ณตํ•œ๋‹ค

๊ฐ€์ƒ DOM์˜ ํƒ„์ƒ

  • react-dom์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ€์ƒ DOM์€ ์‹ค์ œ DOM๊ณผ ๋™์ผํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค
  • ์›น ํŽ˜์ด์ง€๊ฐ€ ํ‘œ์‹œํ•ด์•ผํ•  DOM์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•œ๋‹ค

๊ฐ€์ƒ DOM์˜ ์žฅ์ 

  • ๋Œ„ ์• ๋ธŒ๋ผ๋ชจํ”„(dan_abramov)-๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์ž: ์ผ๋ฐ˜ DOM์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฑฐ๋ณด๋‹ค ๋ฌด์กฐ๊ฑด ๋น ๋ฅธ ๊ฒƒ์ด ์•„๋‹˜. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ์˜ ํ•ฉ๋ฆฌ์ ์ด๊ณ  ๋น ๋ฅธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณต.

๋ฆฌ์•กํŠธ ํŒŒ์ด๋ฒ„ React Fiber

  • React Fiber: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด
  • Fiber Reconciler: ๊ฐ€์ƒ DOM์„ ๊ด€๋ฆฌ
  • reconcilation: ๊ฐ€์ƒ DOM๊ณผ ์‹ค์ œ DOM์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋น„๊ตํ•˜๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•œ๋‹ค

๋ฆฌ์•กํŠธ ํŒŒ์ด๋ฒ„์˜ ํŠน์ง•

๋ฆฌ์•กํŠธ ํŒŒ์ด๋ฒ„์˜ ๋™์ž‘ ๋ฐฉ์‹

  1. ์ž‘์—…์„ ์ž‘์€ ๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•˜๊ณ , ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•œ๋‹ค
  2. ๋ Œ๋”๋ง์„ ์ค‘๋‹จํ•˜๊ณ , ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค
  3. ์ด์ „ ์ž‘์—…์„ ๋‹ค์‹œ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ํ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค

๋™๊ธฐ & ๋น„๋™๊ธฐ

  • (๋™๊ธฐ) ๊ณผ๊ฑฐ ๋ฆฌ์•กํŠธ์˜ ์กฐ์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ stack์„ ์‚ฌ์šฉํ–ˆ๋‹ค (์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ด๋ฏ€๋กœ ๋ธ”๋กœํ‚น์ด ๋ฐœ์ƒํ•œ๋‹ค)
  • (๋น„๋™๊ธฐ) ๋ฆฌ์•กํŠธ ํŒŒ์ด๋ฒ„๋Š” linked list๋ฅผ ์‚ฌ์šฉํ•ด ์ž‘์—…์„ ๋ถ„ํ• ํ•˜๊ณ , ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•œ๋‹ค

์ž‘์—… ๋‹จ์œ„

  • ํŒŒ์ด๋ฒ„๋Š” ์ž‘์—… ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ, ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ , finishWork()๋ผ๋Š” ์ž‘์—…์œผ๋กœ ๋งˆ๋ฌด๋ฆฌ
  • ์ž‘์—…์„ ์ปค๋ฐ‹ํ•ด ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•œ๋‹ค

๋ฆฌ์•กํŠธ ํŒŒ์ด๋ฒ„์˜ ๋‹จ๊ณ„

  1. ๋žœ๋” ๋‹จ๊ณ„: ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. (์˜ˆ: ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…, ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•˜๋Š” ์ž‘์—…)
  • ์ด ๋‹จ๊ณ„์—์„œ ํŒŒ์ด๋ฒ„: ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๊ฑฐ๋‚˜, ์ค‘๋‹จ ๋“ฑ
  1. ์ปค๋ฐ‹ ๋‹จ๊ณ„: ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•œ๋‹ค
  • commitWork()๋ฅผ ์‹คํ–‰, ๋™๊ธฐ์‹์œผ๋กœ ์ผ์–ด๋‚˜๊ณ  ์ค‘๋‹จ๋  ์ˆ˜ ์—†๋‹ค

ํŒŒ์ด๋ฒ„ ๊ฐ์ฒด

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ตœ์ดˆ๋กœ ๋งˆ์šดํŠธ ๋˜๋Š” ์‹œ์ ์— ์ƒ์„ฑ๋˜์–ด, ๊ฐ€๊ธ‰์  ์žฌ์‚ฌ์šฉ๋จ
function FiberNode(tag, pendingProps, key, mode) {
  // Instance
  this.tag = tag; // HostComponent(div๊ฐ™์€ ์š”์†Œ), FunctionComponent, ClassComponent
  this.key = key;
  this.elementType = null;
  this.type = null;
  this.stateNode = null; // ํŒŒ์ด๋ฒ„ ์ž์ฒด์— ๋Œ€ํ•œ reference ์ •๋ณด

  // Fiber (ํŠธ๋ฆฌ ๊ตฌ์กฐ)
  this.return = null;
  this.child = null; // ์ฒซ ๋ฒˆ์งธ ์ž์‹
  this.sibling = null; // ๋‹ค์Œ ํ˜•์ œ
  this.index = 0; // ํ˜„์žฌ ์ž์‹์˜ ์ธ๋ฑ์Šค
  this.ref = null;
  this.refCleanUp = null;

  this.pendingProps = pendingProps; // workInProgress์— ๋Œ€ํ•œ props
  this.memoizedProps = null; // pendingProps๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ Œ๋”๋ง๋œ ์ดํ›„์˜ props๋ฅผ ์ €์žฅ
  this.updateQueue = null; // ์ƒํƒœ ์—…๋ฐ์ดํŠธ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์ดํŽ™ํŠธ ๋“ฑ์„ ์ €์žฅ
  this.memoizedState = null;
  this.dependencies = null;

  this.mode = mode;

  // Effects
  this.flags = NoFlags;
  this.subtreeFlags = NoFlags;
  this.deletions = null;

  this.lanes = NoLanes;
  this.childLanes = NoLanes;

  this.alternate = null;

  // ์ดํ•˜ ํ”„๋กœํŒŒ์ผ๋Ÿฌ, __DEV__
}
  • state๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜, ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, ํŒŒ์ด๋ฒ„ ๊ฐ์ฒด๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ๋‹ค
  • ๋ฆฌ์•กํŠธ๊ฐ€ ํŒŒ์ด๋ฒ„๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ, ํŒŒ์ด๋ฒ„ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค
  • ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ ์œ ์—ฐํ•˜๊ฒŒ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค

Value UI

  • ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” UI๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • UI๋ฅผ ๋ฌธ์ž์—ด, ์ˆซ์ž, ๋ฐฐ์—ด ๊ฐ’์œผ๋กœ ๊ด€๋ฆฌ

๋ฆฌ์•กํŠธ ํŒŒ์ด๋ฒ„ ํŠธ๋ฆฌ

  • ํŒŒ์ด๋ฒ„ ํŠธ๋ฆฌ๋Š” ๋ฆฌ์•กํŠธ ๋‚ด๋ถ€์— 2๊ฐœ์˜ ํŠธ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค
  • ํ˜„์žฌ ํŠธ๋ฆฌ(Current)์™€ ๋Œ€์ฒด ํŠธ๋ฆฌ(WorkInProgress)๋กœ ๊ตฌ์„ฑ๋œ๋‹ค: ๋”๋ธ” ๋ฒ„ํผ๋ง
  • ๋”๋ธ” ๋ฒ„ํผ๋ง?
    • ํ˜„์žฌ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœํ•˜๊ณ , ๋Œ€์ฒด ํŠธ๋ฆฌ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•œ๋‹ค
    • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋˜๋ฉด, ํ˜„์žฌ ํŠธ๋ฆฌ์™€ ๋Œ€์ฒด ํŠธ๋ฆฌ๋ฅผ ๊ต์ฒดํ•œ๋‹ค
    • ๋ถˆ์™„์ „ํ•œ ํŠธ๋ฆฌ๋ฅผ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๊ธฐ ์œ„ํ•ด, ์ปค๋ฐ‹ ๋‹จ๊ณ„์—์„œ ๋”๋ธ” ๋ฒ„ํผ๋ง์„ ์‚ฌ์šฉํ•œ๋‹ค
  • ๋™์ž‘
    • current์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์—… ์‹œ์ž‘
    • ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ๋ฆฌ์•กํŠธ์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋กœ workInProgress ํŠธ๋ฆฌ ๋นŒ๋“œ
    • workInProgress ํŠธ๋ฆฌ ๋นŒ๋“œ๊ฐ€ ๋๋‚˜๋ฉด, ๋‹ค์Œ ๋žœ๋”๋ง์— ์‚ฌ์šฉ
    • current๊ฐ€ workInProgress๋กœ ๊ต์ฒด๋œ๋‹ค

ํŒŒ์ด๋ฒ„์˜ ์ž‘์—… ์ˆœ์„œ: Depth-First Search

  1. beginWork(): ํŒŒ์ด๋ฒ„ ์ž‘์—…์„ ์‹œ์ž‘ํ•œ๋‹ค, ์ž์‹์ด ์—†๋Š” ํŒŒ์ด๋ฒ„๋ฅผ ๋งŒ๋“ค ๋•Œ๊นŒ์ง€ ์ˆœํšŒํ•œ๋‹ค
  2. ๋งŒ์•ฝ ํ˜•์ œ๊ฐ€ ์—†๋‹ค๋ฉด, completeWork(): ํŒŒ์ด๋ฒ„ ์ž‘์—…์„ ์™„๋ฃŒํ•œ๋‹ค.
  3. ๋งŒ์•ฝ ํ˜•์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด, ํ˜•์ œ๋กœ ์ด๋™ํ•œ๋‹ค
  4. 2๋ฒˆ, 3๋ฒˆ์ด ๋๋‚˜๋ฉด return์„ ์ฐพ์•„ ์˜ฌ๋ผ๊ฐ€, ์ž‘์—…์„ ์™„๋ฃŒํ•œ๋‹ค
  • props๋ฅผ ๋ฐ›์•„ ํŒŒ์ด๋ฒ„ ๋‚ด๋ถ€์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค
  • ์žฌ๊ท€ ์ˆœํšŒ ํŠธ๋ฆฌ ์—…๋ฐ์ดํŠธ ๊ณผ์ • -> ๊ณผ๊ฑฐ ๋™๊ธฐ, ํ˜„์žฌ ๋น„๋™๊ธฐ

์šฐ์„  ์ˆœ์œ„: ์• ๋‹ˆ๋ฉ”์ด์…˜ > ์‚ฌ์šฉ์ž ์ž…๋ ฅ > ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ > ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ

ํŒŒ์ด๋ฒ„์™€ ๊ฐ€์ƒ DOM

  • Fiber: ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์™€ 1:1
  • ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์€ ๋™๊ธฐ์ ์œผ๋กœ ์ผ์–ด๋‚˜์•ผ ํ•˜๊ณ , ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋งŽ์•„ -> ํ™”๋ฉด์— ๋ถˆ์™„์ „ํ•˜๊ฒŒ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค
    • ์ž‘์—…์„ ๊ฐ€์ƒ/๋ฉ”๋ชจ๋ฆฌ์ƒ์—์„œ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ๋งŒ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์ƒ DOM
  • ๊ฐ€์ƒ DOM๊ณผ ๋ฆฌ์•กํŠธ์˜ ํ•ต์‹ฌ
    • ๋น ๋ฅด๊ฒŒ ๋žœ๋”๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ถˆ์™„์ „ํ•œ ํ™”๋ฉด์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๋Š” ๊ฒƒ / ๋ฐ”๋กœ ๊ฐ’์œผ๋กœ UI๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ
    • ์ด๋Ÿฐ ํ๋ฆ„์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋งค์ปค๋‹ˆ์ฆ˜