๐Ÿคฟ ๋”ฅ๋‹ค์ด๋ธŒ - ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ Element๋ฅผ ์ถ”๊ฐ€ํ• ๊นŒ? innerHTML?

์ •ํ˜œ์ธยท2024๋…„ 9์›” 23์ผ
0

๋”ฅ๋‹ค์ด๋ธŒ

๋ชฉ๋ก ๋ณด๊ธฐ
2/4

๐Ÿค” vanillajs์—์„œ Element๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ณ ๋ฏผ

๋ฐ”๋‹๋ผ JS๋กœ SSR๊ณผ CSR์„ ๊ตฌํ˜„ํ•ด๋ณด๋ฉด์„œ innerHTML์„ ์“ฐ์ง€ ์•Š๊ธฐ ์œ„ํ•ด react์—์„œ Element๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ํ•™์Šตํ–ˆ๋˜ ๊ณผ์ •์„ ์ž‘์„ฑํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์ €๋ฒˆ ํฌ์ŠคํŒ…์—์„œ์™€ ์œ ์‚ฌํ•˜๊ฒŒ, ๋ฐ”๋‹๋ผ js๋กœ์˜ ์›น ํŽ˜์ด์ง€ ๊ตฌํ˜„์€ ์ฒ˜์Œ์ด๋ผ ๋งŽ์ด ๋‚ฏ์„ค๊ธฐ๋„ ํ•˜๊ณ , ์–ด๋ ต๊ธฐ๋„ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.


๐Ÿ˜ฃ 1. ๋ฐ”๋‹๋ผ js์—์„œ innerHTML

์ €๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ์ž‘์„ฑํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, CSR๊ณผ SSR์— ๋Œ€ํ•ด ๊นŠ์ด ๊ณ ๋ฏผํ•˜๊ณ  ํ•™์Šตํ•ด๋ณด์•˜๊ณ , ๋ฐ”๋‹๋ผ JS๋กœ CSR๊ณผ SSR์„ ๊ตฌํ˜„ํ•ด๋ณด๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ CSR๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ํ™”๋ฉด์— ๊ทธ๋ ค์ฃผ๋Š” ๊ณผ์ •์—์„œ ์–ด์ฉ” ์ˆ˜ ์—†์ด innerHTML๋กœ ๋”์— ์ ‘๊ทผํ•ด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ•ญ์ƒ react๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ์‚ฌ๋žŒ์œผ๋กœ์„œ, โ€˜innerHTML ์€ ์“ฐ์ง€ ๋ง์•„์•ผ ํ•œ๋‹คโ€™๋Š” ์ƒ๊ฐ์ด ์ง€๋ฐฐ์ ์ด๋ผ ์“ฐ๋ฉด์„œ๋„ ์ฐ์ฐํ•จ์„ ๊ฐ์ถœ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ˜– 2. innerHTML์„ ์‚ฌ์šฉํ•œ CSR, ๊ทธ๋ฆฌ๊ณ  ๋ณด์•ˆ ๋ฌธ์ œ

โ€˜innerHTML ์€ ์“ฐ์ง€ ๋ง์•„์•ผ ํ•œ๋‹คโ€™๋Š” ์ƒ๊ฐ ๋•Œ๋ฌธ์— ๊ณ ๋ฏผ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ์ฃผ์ž…๋œ ๊ฐ’์ด ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•  ๊ฒฝ์šฐ ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋Š” ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— innerHTML ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ƒ๊ฐํ•ด๋ณด๋‹ˆ React๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ๋Š” innerHTML์„ ์ „ํ˜€ ์‚ฌ์šฉํ•œ ์ ์ด ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ React์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋”์— ์ ‘๊ทผํ•ด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

React ๋‚ด๋ถ€์—์„œ๋Š” innerHTML์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ๊นŒ? ๋งŒ์•ฝ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

์ด ๊ถ๊ธˆ์ฆ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด React์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์กฐ๊ธˆ ๋” ๊นŠ์ด ์‚ดํŽด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ” 3. React๋Š” innerHTML์„ ์“ธ๊นŒ?

๋งŒ์•ฝ React๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ innerHTML์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ €๋„ ๋ฐ”๋‹๋ผ JS์—์„œ innerHTML์„ ์จ๋„ ๋˜์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ , ๋งŒ์•ฝ React๊ฐ€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๊ทธ ๋ฐฉ์‹์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋‚ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์šฐ์„  ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด React ๋‚ด๋ถ€์— ๋Œ€ํ•œ ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด๋‹ˆ, React๋Š” innerHTML์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด React๋Š” ์–ด๋–ป๊ฒŒ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•ด์กŒ๊ณ , ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค .

โš™๏ธ 4. JSX, Babel๊ณผ createElement()

์šฐ์„  React์—์„œ๋Š” JSX๋ผ๋Š” ๋…ํŠนํ•œ(?) ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ๋งŒ ์–ธ๊ธ‰ํ•˜์ž๋ฉด JSX๋Š” HTML๊ณผ ๋งค์šฐ ๋น„์Šทํ•œ ๋ฌธ๋ฒ•์ด๊ณ , React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ JSX๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ”๋กœ ์ดํ•ด๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, Babel์ด๋ผ๋Š” ๋„๊ตฌ๊ฐ€ ์ด ์ฝ”๋“œ๋ฅผ transformํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด์ค๋‹ˆ๋‹ค. (JSX ๊ด€๋ จ ํ•™์Šต์€ ๋”ฐ๋กœ ์ •๋ฆฌํ•ด๋‘˜ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.)

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ JSX ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

<div id="app">
  <h1>Hello, World!</h1>
  <button onClick={() => alert('Clicked!')}>Click me</button>
</div>

์œ„ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ Babel์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

const element = createElement(
  'div',
  { id: 'app' },
  createElement('h1', null, 'Hello, World!'),
  createElement(
    'button',
    { onClick: () => alert('Clicked!') },
    'Click me'
  )
);

์œ„ ์ฝ”๋“œ์—์„œ React.createElement() ํ•จ์ˆ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” JSX ์ฝ”๋“œ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

react๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ณดํ†ต jsx ํ˜•ํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, createElement ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ผ์ด ๊ฑฐ์˜ ์—†์–ด ์ด๋ฒˆ ๊ธฐํšŒ์— ์ฒ˜์Œ ํ•™์Šตํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ›  5. createElement์˜ ๋‚ด๋ถ€์—์„œ React Element ์ƒ์„ฑ

React์˜ createElement ํ•จ์ˆ˜๋Š” JSX๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Element๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. createElement์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด props์™€ children(์ž์‹ ์š”์†Œ)์„ ์„ค์ •ํ•œ ํ›„, ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ReactElement๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

export function createElement(type, config, children) {
  let propName;
  
  props[propName] = config[propName];
  
  key = '' + config.key;
  
  props.children = children;
  
  return ReactElement(
    type,
    key,
    ref,
    self,
    source,
    ReactCurrentOwner.current,
    props,
  );
}

์ด createElement ํ•จ์ˆ˜์—์„œ ํŠน์ดํ•œ(?) ์ ์€ ReactElement๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ DOM ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, React๋งŒ์˜ ๋…ํŠนํ•œ ์—˜๋ฆฌ๋จผํŠธ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

function ReactElement(type, key, ref, self, source, owner, props) {
 const element = {
    $$typeof: REACT_ELEMENT_TYPE,
    type: type,
    key: key,
    ref: ref,
    props: props,
    _owner: owner,
  };
  
  return element;
}

์—ฌ๊ธฐ์„œ ReactElement๋Š” ์‹ค์ œ DOM ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์•„๋‹Œ, React์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์ƒ DOM์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

(๋ฌผ๋ก  ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ๊ฐ€์ƒ DOM์ด๋ผ๊ณ  ์ฝ• ์ง‘์–ด ์–ธ๊ธ‰ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.)

๐Ÿ™„ 6. ๊ทธ๋Ÿผ DOM์—๋Š” ์–ธ์ œ, ์–ด๋–ป๊ฒŒ ๋ฐ˜์˜๋˜์ง€?

createElement ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ReactElement๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ๊นŒ์ง€๋Š” ์•Œ๊ฒ ๋Š”๋ฐ ๊ทธ๋ ‡๋‹ค๋ฉด ์‹ค์ œ DOM์—๋Š” ์–ธ์ œ ์ž…ํžˆ๋Š” ๊ฒƒ์ธ์ง€ ๋˜ ๊ถ๊ธˆํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€์˜ ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด ์ƒ์„ฑ๋งŒ ํ•˜๊ณ  html์— ์ž…ํžˆ๋Š” ๊ณผ์ •์€ ์—†๋‹ค๊ณ  ๋Š๊ปด์กŒ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ๋Š” ์ด ReactElement ๊ฐ์ฒด๋Š” React์˜ ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ์ฒ˜๋ฆฌ๋˜์–ด ๋งˆ์ง€๋ง‰์— ์‹ค์ œ DOM์— ๋ฐ˜์˜๋˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ด ๋ฌธ์žฅ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด react-dom์„ ๊ณต๋ถ€ํ•ด๋ณด์•„์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ๋งŒ๋“ค์–ด์ง„ ReactElement ๊ฐ™์€ ๊ฒƒ๋“ค์„ html๊ณผ ์—ฐ๊ฒฐํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ react-dom ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋จผ์ € react๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœํ•˜๋ฉด, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๊ฒฐ๋ก ์ ์ธ ํ™”๋ฉด์€ index.html ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <link rel="icon" href="%PUBLIC_URL%/favicon.svg" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <meta name="theme-color" content="#000000" />
        <meta
            name="description"
            content="Web site created using create-react-app"
        />
        <title>App</title>
    </head>
    <body>
        <noscript>You need to enable JavaScript to run this app.</noscript>
        <div id="root"></div>
    </body>
</html>

์ด html ํŒŒ์ผ์—์„œ ์œ ์ผํ•˜๊ฒŒ div ํƒœ๊ทธ๊ฐ€ ํ•˜๋‚˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, (์‹ฌ์ง€์–ด ์•ˆ์—๋Š” ์•„๋ฌด ์ปจํ…์ธ ๋„ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค)

<div id="root"></div>

์ด div ๊ตฌ์กฐ ๋‚ด์— ์œ„์—์„œ ๋งŒ๋“ค์–ด๋‘์—ˆ๋˜ ReactElement ๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

react๋ฅผ ์‚ฌ์šฉํ•ด๋ดค๋‹ค๋ฉด ๋ชจ๋‘๊ฐ€ ์•Œ๋‹ค์‹œํ”ผ, ์•„๋ž˜์™€ ๊ฐ™์€ index.js ํŒŒ์ผ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './app';

ReactDOM.render(
  	<App />,
  	document.getElementById('root')
);

์ด index.js ํŒŒ์ผ์—์„œ document.getElementById('root') ์ฝ”๋“œ๋Š” ์œ„ index.html ํŒŒ์ผ์˜ ์œ ์ผํ•œ div ํƒœํฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ด๊ณ , root ๋ผ๋Š” id๋ฅผ ์ด์šฉํ•ด์„œ react-dom ์œผ๋กœ js ์ฝ”๋“œ์™€ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๊ณผ์ •์„ ์ ์–ด๋ณด์ž๋ฉด,

import ReactDOM from 'react-dom';

react-dom์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œย React๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ import ํ•ด์˜ค๊ณ ,

ReactDOM.render(
	<App />,
	document.getElementById('root')
 )

๊ฐ€์ ธ์˜จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ย ReactDOM์ด๋ผ๋Š” ํด๋ž˜์Šค์— ์žˆ๋Š”ย renderย ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ

์ฆ‰,ย index.html์— ์žˆ๋Š”ย <div id="root"></div> ์œ ์ผํ•œ div ํƒœ๊ทธ์— <App /> ์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ(js ํŒŒ์ผ)๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ™„ 7. jsx โ€”(babel)โ€”> createElement() โ†’ ReactElement โ€”(react-dom)โ€”> ๋ Œ๋”๋ง

์œ„์— ์ž‘์„ฑํ–ˆ๋˜ ์ „์ฒด ํ๋ฆ„์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•ด๋ณด์ž๋ฉด,

๐Ÿ’ก ๊ฐ„ํŽธํ•˜๊ฒŒ jsx๋กœ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋ฅผ babel ์ด createElement() ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๊ณ , ์ด createElement() ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์น˜๋ฉด ReactElement๋ผ๋Š” ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐ˜ํ™˜๋œ Element๋“ค์€ react-dom์„ ํ†ตํ•ด index.html์— ์žˆ๋Š” ํƒœ๊ทธ์— ์ ‘๊ทผํ•˜์—ฌ <App />๊ณผ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ์™€ ์—ฐ๊ฒฐํ•ด์ฃผ์–ด html ์ฝ”๋“œ์ธ ๊ฒƒ์ฒ˜๋Ÿผ CSR ๋ฐฉ์‹์œผ๋กœ ํ™”๋ฉด์— ๋ Œ๋”๋ง ํ•ด์ค๋‹ˆ๋‹ค.

์ฝ”๋“œ๋กœ ์ •๋ฆฌํ•ด๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

App.jsx ํŒŒ์ผ์ด ์•„๋ž˜์™€ ๊ฐ™๋‹ค๋ฉด,

// App.jsx
import React from 'react';
import from './app.css';

function App() {
  return (
  <div id="app">
	  <h1>Hello, World!</h1>
	  <button onClick={() => alert('Clicked!')}>Click me</button>
	</div>
  )
}  

export default App;

babel์„ ํ†ตํ•ด

const element = createElement(
  'div',
  { id: 'app' },
  createElement('h1', null, 'Hello, World!'),
  createElement(
    'button',
    { onClick: () => alert('Clicked!') },
    'Click me'
  )
);

์ด๋ ‡๊ฒŒ ๋ณ€ํ™˜๋˜๊ณ ,

react-dom ์„ ํ†ตํ•ด ์œ„์˜ index.js์—์„œ

<div id="root"></div> div ํƒœ๊ทธ์— <App /> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ์–ด

ํ™”๋ฉด์— ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿš€ 8. ๊ฒฐ๋ก 

๊ฒฐ๋ก ์ ์œผ๋กœ React๋Š” innerHTML์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์œ„์ฒ˜๋Ÿผ ReactElement๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด ๊ฐ€์ƒ DOM์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฐ€ ๊ฑฑ์ •ํ–ˆ๋˜ ๋ณด์•ˆ ๋ฌธ์ œ๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.


์šฐ์„  ์ด๋ ‡๊ฒŒ ๊นŠ์ด ๊ณต๋ถ€ํ•ด๋ณด๋ฉด์„œ React์˜ ์—˜๋ฆฌ๋จผํŠธ ์ƒ์„ฑ ๋ฐฉ์‹์€ ์ œ๊ฐ€ ๋ฐ”๋‹๋ผ JS์—์„œ ์‚ฌ์šฉํ•œ innerHTML๊ณผ๋Š” ๋งค์šฐ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ, react๋ฅผ ์ž์ฃผ ์“ฐ๋ฉด์„œ๋„ react-dom ๊ณผ react ์˜ ๊ด€๊ณ„๋‚˜, ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ Œ๋”๋ง ๋˜๋Š”์ง€ ์ „ํ˜€ ๋ชฐ๋ž์—ˆ๋Š”๋ฐ, ์ด๋Ÿฐ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ๋„ ๊ถ๊ธˆํ•ดํ•˜์ง€ ์•Š์•˜๋˜ ์ œ๊ฐ€ ๋ถ€๋„๋Ÿฝ๊ณ  ์ด์ œ์•ผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด ์ฐฝํ”ผํ–ˆ์Šต๋‹ˆ๋‹คโ€ฆ.

๊ทธ๋ž˜๋„ ์ด๋ฒˆ ๊ณต๋ถ€๋ฅผ ํ†ตํ•ด์„œ react๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ Œ๋”๋ง๋˜๋Š”์ง€ ๋‹จ์ˆœํžˆ โ€˜๊ฐ€์ƒ DOM ์‚ฌ์šฉโ€™, โ€˜SPA ๋ฐฉ์‹โ€™ ๋“ฑ ๊ฒ‰์˜ ๊ฐœ๋…๋งŒ ์•„๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๊ตฌ์ฒด์ ์ธ ํ๋ฆ„์„ ์•Œ ์ˆ˜ ์žˆ์–ด ๋„ˆ๋ฌด ์ข‹์•˜์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์›๋ฆฌ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ €๋„ ๋ฐ”๋‹๋ผ JS๋กœ ๋‹จ์ˆœํžˆ innerHTML์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , React์˜ ๊ตฌ์กฐ๋ฅผ ์ฐธ๊ณ ํ•ด ์ €๋งŒ์˜ ์—˜๋ฆฌ๋จผํŠธ ์ƒ์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐํšŒ๊ฐ€ ๋œ๋‹ค๋ฉด ๋‹ค์Œ ํฌ์ŠคํŒ…์— ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹คโ€ฆใ…Žใ…Ž,,,

๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ ๊ธฐํšŒ์— react ์˜คํ”ˆ์†Œ์Šค๋ฅผ ๋งŽ์ด ์‚ดํŽด๋ณด์•˜๋Š”๋ฐ, (๋ฌผ๋ก  ๋„ˆ๋ฌด ๋งŽ์•„์„œ ์•„์ง ๋ฐ˜๋„ ๋ชป ๋ณธ ๊ฒƒ ๊ฐ™์ง€๋งŒโ€ฆ.) ๋Œ€๊ทœ๋ชจ ์˜คํ”ˆ ์†Œ์Šค๋ฅผ ์ด๋ ‡๊ฒŒ ์ œ ์†์œผ๋กœ ์—ด์–ด๋ณด๊ณ  ๋ถ„์„ํ•ด๋ณธ ๊ฒฝํ—˜์ด ๋œป๊นŠ๊ฒŒ ๋Š๊ปด์กŒ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์‹œ๊ฐ„์ด ๋„ˆ~~๋ฌด ๋งŽ์ด ๊ฑธ๋ฆฌ๊ธด ํ•˜์ง€๋งŒโ€ฆ ์•ž์œผ๋กœ๋„ ์ข…์ข… ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ณต๋ถ€ํ•ด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ๐Ÿ˜…

์ฐธ๊ณ  ๋งํฌ

https://github.com/facebook/react

https://ko.legacy.reactjs.org/docs/introducing-jsx.html

https://ko.legacy.reactjs.org/docs/rendering-elements.html

https://velog.io/@sa02045/React-createElement-์•Œ์•„๋ณด๊ธฐ

https://velog.io/@suyeon9456/Babel

https://velog.io/@tngusglaso/React-react-dom์—-๋Œ€ํ•ด-์ดํ•ดํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด