1. JSX

XML ๊ฐ™์€ ๋ฌธ๋ฒ• ํ™•์žฅ, JS๋ฅผ ํ™•์žฅํ•œ ๋ฌธ๋ฒ•.

React.createElement์„ ์“ฐ๋Š” JavaScript ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

์ค‘๊ด„ํ˜ธ๋ฅผ ์จ์„œ JavaScript ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์“ธ ์ˆ˜ ์žˆ๊ณ , ๊ฒฐ๊ตญ์€ JavaScript ์ฝ”๋“œ์™€ 1:1๋กœ ๋งค์นญ๋œ๋‹ค.

babel์„ ์ด์šฉํ•ด ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

โ†’ โ€œPresetsโ€์—์„œ โ€œreactโ€๋ฅผ ์ฒดํฌํ•˜๊ฑฐ๋‚˜, โ€œPluginsโ€์—์„œ โ€œ@babel/plugin-transform-react-jsxโ€๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด JSX๋ฅผ ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

JSX ํŒŒ์ผ์— /* @jsx ์–ด์ฉŒ๊ณ  */ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋ฉด React.createElement ๋Œ€์‹  โ€œ์–ด์ฉŒ๊ณ โ€๋ฅผ ์“ฐ๊ฒŒ ๋œ๋‹ค.
<p>Hello, world!</p>
// ๋ณ€ํ™˜
React.createElement("p", null, "Hello, world!");


<Greeting name="world" />
// ๋ณ€ํ™˜
React.createElement(Greeting, { name: "world" });


<Button type="submit">Send</Button>
// ๋ณ€ํ™˜
React.createElement(Button, { type: "submit" }, "Send");


<div className="test">
 <p>Hello, world!</p>
 <Button type="submit">Send</Button>
</div>
//๋ณ€ํ™˜
React.createElement(
 "div",
 { className: "test" },
 React.createElement("p", null, "Hello, world!"),
 React.createElement(Button, { type: "submit" }, "Send")
);


<div>
 <p>Count: {count}!</p>
 <button type="button" onClick={() => setCount(count + 1)}>Increase</button>
</div>
// ๋ณ€ํ™˜
React.createElement(
 "div",
 null,
 React.createElement("p", null, "Count: ", count, "!"),
 React.createElement("button", { type: "button", onClick: () => setCount(count + 1) }, "Increase")
);

React Element

JSX ์“ฐ์ง€์•Š๊ณ  React.createElement๋ฅผ ์จ์„œ React Element ํŠธ๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š”๋ฐ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ํ•„์ˆ˜ ์•„๋‹ˆ๋‹ค.

class Hello extends React.Component {
  render() {
    return <div>Hello {this.props.toWhat}</div>;
  }
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Hello toWhat="World" />);

์ด๊ฑฐ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์จ๋„ ๋œ๋‹ค.

class Hello extends React.Component {
  render() {
    return React.createElement('div', null, `Hello ${this.props.toWhat}`);
  }
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(React.createElement(Hello, {toWhat: 'World'}, null));

์ปดํŒŒ์ผ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ๋ณ€ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋‹ˆ.
JSX๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋ชจ๋‘ ์ˆœ์ˆ˜ JS๋กœ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

JSX Runtime์€ _jsx๋ž€ ํ•จ์ˆ˜๋ฅผ, Preact๋Š” h๋ž€ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ์ง€์›.

๋‚ด๋ถ€์ ์œผ๋กœ createElement ๋Œ€์‹  ๋ฆฌ์•กํŠธ 17๋ถ€ํ„ฐ ์ €๊ฑธ ์ด์šฉํ•ด ๋”์„ ๊ทธ๋ฆฐ๋‹ค๋Š”๊ฑฐ.

VDOM (Virtual DOM)

Virtual DOM (VDOM)์€ UI์˜ ์ด์ƒ์ ์ธ ๋˜๋Š” โ€œ๊ฐ€์ƒโ€์ ์ธ ํ‘œํ˜„์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ReactDOM๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด โ€œ์‹ค์ œโ€ DOM๊ณผ ๋™๊ธฐํ™”ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋….

์ด ๊ณผ์ •์„ ์žฌ์กฐ์ •์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์žฌ์กฐ์ •

๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค๋•Œ ์–ด๋”˜ ๋ฐ”๊ผˆ๋‹ค, ์•ˆ๋ฐ”๊ผˆ๋‹ค ์ด๋Ÿฐ๊ฑฐ ์•ˆํ•ด์ค€๋‹ค. ๋ฌด์กฐ๊ฑด ์•„๋ž˜ ์ฝ”๋“œ๊ฐ™์€๊ฑฐ ์žฌ์‹คํ–‰.

ํŠธ๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š”๊ฑฐ๊ณ  ๊ทธ๊ฒƒ๊ณผ ํ™”๋ฉด์„ ๊ณ„์† ๋น„๊ต.

์‚ฌ์‹ค์€ ์ผ์„ ๋‘ ๋ฒˆ ํ•˜๋Š”๊ฒƒ.

class Hello extends React.Component {
  render() {
    return React.createElement('div', null, `Hello ${this.props.toWhat}`);
  }
}

react developer tool์„ ์ด์šฉํ•ด์„œ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ •ํ™•ํžˆ VDOM์„ ๋ณด์—ฌ์ฃผ๋Š”๊ฑด ์•„๋‹ˆ๋‹ค.

์ƒํƒœ๋งˆ๋‹ค ๋ฆฌ๋ Œ๋”๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋””๋ฒ„๊น…์— ์œ ์šฉ.

VDOM์„ ์“ฐ๋Š” ์ด์œ 

๋ฌด์ž‘์ • VDOM์„ ์“ฐ๋Š”๊ฒŒ ๋น ๋ฅด๋‹ค๋Š” ์˜๊ฒฌ์€ ๋งž์ง€ ์•Š๋‹ค. (svelte์™ˆ "vdom์™œ์จ? ์—†์–ด๋„ ์ข‹์€๋Ž…?")

์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ. ์„ ์–ธํ˜• UI๋กœ ๋” ๋‚˜์€ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์“ด๋‹ค.

์ค‘์š”ํ•œ ๊ฒƒ์€, VDOM์ด ๋ฌด์—‡์ด๊ณ  ์™œ ์“ฐ๋Š”์ง€ ์•ˆ๋‹ค๋ฉด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ.

Last updated