createElement
createElement๋ฅผ ์ฌ์ฉํ๋ฉด React ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ  ์ ์์ต๋๋ค. JSX๋ฅผ ์์ฑํ๋ ๋์  ์ฌ์ฉํ  ์ ์์ต๋๋ค.
const element = createElement(type, props, ...children)๋ ํผ๋ฐ์ค
createElement(type, props, ...children) 
type, prop, children๋ฅผ ์ธ์๋ก ์ ๊ณตํ๊ณ  createElement์ ํธ์ถํ์ฌ React ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํฉ๋๋ค.
import { createElement } from 'react';
function Greeting({ name }) {
  return createElement(
    'h1',
    { className: 'greeting' },
    'Hello'
  );
}์๋์์ ๋ ๋ง์ ์์๋ฅผ ํ์ธํ์ธ์.
๋งค๊ฐ๋ณ์
- 
type:type์ธ์๋ ์ ํจํ React ์ปดํฌ๋ํธ์ฌ์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ํ๊ทธ ์ด๋ฆ ๋ฌธ์์ด (์: โdivโ, โspanโ) ๋๋ React ์ปดํฌ๋ํธ(ํจ์, ํด๋์ค,Fragment๊ฐ์ ํน์ ์ปดํฌ๋ํธ)๊ฐ ๋ ์ ์์ต๋๋ค. - 
props:props์ธ์๋ ๊ฐ์ฒด ๋๋null์ด์ด์ผ ํฉ๋๋ค. null์ ์ ๋ฌํ๋ฉด ๋น ๊ฐ์ฒด์ ๋์ผํ๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค. React๋ ์ ๋ฌํprops์ ์ผ์นํ๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ ๋ฌํprops๊ฐ์ฒด์ref์key๋ ํน์ํ๊ธฐ ๋๋ฌธ์ ์์ฑํ์๋ฆฌ๋จผํธ์์element.props.ref์element.props.key๋ ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ ์ ์ํ์ธ์.element.ref๋๋element.key๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. - 
์ ํ์ฌํญ
...children: 0๊ฐ ์ด์์ ์์ ๋ ธ๋. React ์๋ฆฌ๋จผํธ, ๋ฌธ์์ด, ์ซ์, ํฌํ, ๋น ๋ ธ๋(null,undefined,true,false) ๊ทธ๋ฆฌ๊ณ React ๋ ธ๋ ๋ฐฐ์ด์ ํฌํจํ ๋ชจ๋ React ๋ ธ๋๊ฐ ๋ ์ ์์ต๋๋ค. 
๋ฐํ๊ฐ
createElement๋ ์๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋ React ์๋ฆฌ๋จผํธ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
type: ์ ๋ฌ๋ฐ์type.props:ref์key๋ฅผ ์ ์ธํ ์ ๋ฌ๋ฐ์props.type์ด ๋ ๊ฑฐ์type.defaultProps๋ฅผ ๊ฐ์ง๋ ์ปดํฌ๋ํธ๋ผ๋ฉด, ๋๋ฝ๋๊ฑฐ๋ ์ ์๋์ง ์์props๋type.defaultProps๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.ref: ์ ๋ฌ๋ฐ์ref. ๋๋ฝ๋ ๊ฒฝ์ฐnull.key: ์ ๋ฌ๋ฐ์key๋ฅผ ๊ฐ์  ๋ณํํ ๋ฌธ์์ด. ๋๋ฝ๋ ๊ฒฝ์ฐnull.
์ผ๋ฐ์ ์ผ๋ก ์๋ฆฌ๋จผํธ๋ ์ปดํฌ๋ํธ์์ ๋ฐํ๋๊ฑฐ๋ ๋ค๋ฅธ ์๋ฆฌ๋จผํธ์ ์์์ผ๋ก ๋ง๋ญ๋๋ค. ์๋ฆฌ๋จผํธ์ ํ๋กํผํฐ์๋ ์ ๊ทผํ ์ ์์ง๋ง, ์๋ฆฌ๋จผํธ ์์ฑ ํ์๋ ๋ชจ๋ ์๋ฆฌ๋จผํธ์ ์ ๊ทผํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ํ๊ณ ๋ ๋๋ง๋ง ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฃผ์ ์ฌํญ
- 
๋ฐ๋์ React ์๋ฆฌ๋จผํธ์ ๊ทธ ํ๋กํผํฐ๋ ๋ถ๋ณํ๊ฒ ์ทจ๊ธํด์ผํ๋ฉฐ ์๋ฆฌ๋จผํธ ์์ฑ ํ์๋ ๊ทธ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋์ด์ ์ ๋ฉ๋๋ค. ๊ฐ๋ฐํ๊ฒฝ์์ React๋ ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฐํ๋ ์๋ฆฌ๋จผํธ์ ๊ทธ ํ๋กํผํฐ๋ฅผ ์๊ฒ freezeํฉ๋๋ค.
 - 
JSX๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ํ๊ทธ๋ฅผ ๋๋ฌธ์๋ก ์์ํด์ผ๋ง ์ฌ์ฉ์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ฆ,
<Something />์createElement(Something)๊ณผ ๋์ผํ์ง๋ง<something />(์๋ฌธ์) ์createElement('something')์ ๋์ผํฉ๋๋ค. (๋ฌธ์์ด์์ ์ฃผ์ํ์ธ์. ๋ด์ฅ๋ HTML ํ๊ทธ๋ก ์ทจ๊ธ๋ฉ๋๋ค.) - 
createElement('h1', {}, child1, child2, child3)์ ๊ฐ์ด children์ด ๋ชจ๋ ์ ์ ์ธ ๊ฒฝ์ฐ์๋งcreateElement์ ์ฌ๋ฌ ์ธ์๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค. children์ด ๋์ ์ด๋ผ๋ฉด ์ ์ฒด ๋ฐฐ์ด์ ์ธ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด React๋ ๋๋ฝ๋ํค์ ๋ํ ๊ฒฝ๊ณ ๋ฅผ ํ์ํฉ๋๋ค. ์ ์  ๋ชฉ๋ก์ธ ๊ฒฝ์ฐ ์ฌ์ ๋ ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์์ ์ด ํ์ํ์ง ์์ต๋๋ค. 
์ฌ์ฉ๋ฒ
JSX ์์ด ์๋ฆฌ๋จผํธ ์์ฑํ๊ธฐ
JSX๊ฐ ๋ง์์ ๋ค์ง ์๊ฑฐ๋ ํ๋ก์ ํธ์์ ์ฌ์ฉํ  ์ ์๋ ๊ฒฝ์ฐ, createElement๋ฅผ ๋์์ผ๋ก ์ฌ์ฉํ  ์ ์์ต๋๋ค.
JSX ์์ด ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ๋ ค๋ฉด type, props, children์ ํจ๊ป createElement๋ฅผ ํธ์ถํฉ๋๋ค
import { createElement } from 'react';
function Greeting({ name }) {
  return createElement(
    'h1',
    { className: 'greeting' },
    'Hello ',
    createElement('i', null, name),
    '. Welcome!'
  );
}children์ ์ ํ ์ฌํญ์ด๋ฉฐ ํ์ํ ๋งํผ ์ ๋ฌํ  ์ ์์ต๋๋ค. (์ ์์์๋ 3๊ฐ์ children์ด ์์ต๋๋ค.) ์ ์ฝ๋๋ ์ธ์ฌ๋ง์ด ํฌํจ๋ <h1>๋ฅผ ํ์ํฉ๋๋ค. ๋น๊ต๋ฅผ ์ํด ๋์ผํ ์์๋ฅผ JSX๋ก ์ฌ์์ฑํ์ต๋๋ค.
function Greeting({ name }) {
  return (
    <h1 className="greeting">
      Hello <i>{name}</i>. Welcome!
    </h1>
  );
}์์ ๋ง์ React ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ค๋ฉด 'h1' ๊ฐ์ ๋ฌธ์์ด ๋์  Greeting ๊ฐ์ ํจ์๋ฅผ type์ ์ ๋ฌํ์ธ์.
export default function App() {
  return createElement(Greeting, { name: 'Taylor' });
}JSX๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
export default function App() {
  return <Greeting name="Taylor" />;
}createElement๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ์ ์ฒด ์์์
๋๋ค.
import { createElement } from 'react'; function Greeting({ name }) { return createElement( 'h1', { className: 'greeting' }, 'Hello ', createElement('i', null, name), '. Welcome!' ); } export default function App() { return createElement( Greeting, { name: 'Taylor' } ); }
JSX๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ์ ์ฒด ์์์ ๋๋ค.
function Greeting({ name }) { return ( <h1 className="greeting"> Hello <i>{name}</i>. Welcome! </h1> ); } export default function App() { return <Greeting name="Taylor" />; }
๋ ์ฝ๋ฉ ์คํ์ผ ๋ชจ๋ ํ์ฉ๋๋ฏ๋ก ํ๋ก์ ํธ์ ๋ง๋ ์คํ์ผ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. createElement์ ๋น๊ตํ์ฌ JSX๋ฅผ ์ฌ์ฉํ  ๋์ ์ฅ์ ์ ์ด๋ค ๋ซ๋ ํ๊ทธ๊ฐ ์ด๋ค ์ฌ๋ ํ๊ทธ์ ๋์๋๋์ง ์ฝ๊ฒ ํ์ธํ  ์ ์๋ค๋ ๊ฒ์
๋๋ค.
Deep Dive
์๋ฆฌ๋จผํธ๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ์ผ๋ถ์ ๋ํ ํํ์
๋๋ค. ์๋ฅผ ๋ค์ด <Greeting name="Taylor" />์ createElement(Greeting, { name: 'Taylor' })๋ ๋ชจ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
// ์ฝ๊ฐ ๋จ์ํ๋จ
{
  type: Greeting,
  props: {
    name: 'Taylor'
  },
  key: null,
  ref: null,
}์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด๋ Greeting ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋๊ฑฐ๋ DOM ์๋ฆฌ๋จผํธ๊ฐ ์์ฑ๋์ง๋ ์๋๋ค๋ ์ ์ ์ฃผ์ํ์ธ์.
React ์๋ฆฌ๋จผํธ๋ ๋์ค์ React๊ฐ Greeting ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋๋ก ์ง์ํ๋ ์ค๋ช
์์ ๋น์ทํฉ๋๋ค. App ์ปดํฌ๋ํธ์์ ์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํจ์ผ๋ก์จ React์๊ฒ ๋ค์ ํ  ์ผ์ ์ง์ํ  ์ ์์ต๋๋ค.
์๋ฆฌ๋จผํธ ์์ฑ ๋น์ฉ์ ๋งค์ฐ ์ ๋ ดํ๋ฏ๋ก ์๋ฆฌ๋จผํธ ์์ฑ์ ์ต์ ํํ๊ฑฐ๋ ํผํ๋ ค๊ณ ๋ ธ๋ ฅํ ํ์๊ฐ ์์ต๋๋ค.