1. JSX

  • React์—์„œ JSX๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ 

  • Syntactic sugar

  • React.createElement

  • React Element

  • React StrictMode

  • VDOM(Virtual DOM)์ด๋ž€?

    • DOM์ด๋ž€?

    • DOM๊ณผ Virtual DOM์˜ ์ฐจ์ด

  • Reconciliation(์žฌ์กฐ์ •) ๊ณผ์ •์€ ๋ฌด์—‡์ธ๊ฐ€?

๊ฐ•์˜ ์ •๋ฆฌ

JSX

JSX is an XML-like syntax extension to ECMAScript XML์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ฌธ๋ฒ• ํ™•์žฅ์ด๋‹ค.

React๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ์— ๋งˆํฌ์—…๊ณผ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋Œ€์‹ , ๋‘˜ ๋‹ค ํฌํ•จํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋А์Šจํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋œ ์œ ๋‹›์œผ๋กœ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค.

๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๊ธฐ์ˆ  JSX๋Š” ์ž์ฃผ ์ ‘ํ•˜๊ฒŒ ๋œ๋‹ค.

JSX๋Š” ๋ฆฌ์•กํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๋‚˜์˜จ ๋ถ€์‚ฐ๋ฌผ์ด์ง€๋งŒ ๋‹ค๋ฅธ๊ณณ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์•กํŠธ๋งŒ์˜ ์ „์œ ๋ฌผ์€ ์•„๋‹ˆ์ง€๋งŒ ๋ฆฌ์•กํŠธ๊ฐ€ ์œ ๋ช…ํ•ด์ง€๋ฉด์„œ ์‚ฌ์‹ค์ƒ JSX๊ฐ€ ๋ฆฌ์•กํŠธ๊ฐ€ ๋๋‹ค.

JSX๋Š” XML์ฒ˜๋Ÿผ ์ž‘์„ฑ๋œ ๋ถ€๋ถ„์„ React.createElement๋ฅผ ์“ฐ๋Š” ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

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

Example 1

<p>Hello, world!</p>;

React.createElement('p', null, 'Hello, world!');

// @jsx๋ฅผ ์ฝ”๋“œ์˜ ์ƒ๋‹จ์— ์ž‘์„ฑํ•˜๋ฉด JSX๋ฅผ JS๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ์„ฑ๋œ๋‹ค.
// jsx๋ฅผ ๋ฆฌ์•กํŠธ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

/* @jsx r.createElement */
<p>Hello, world!</p>;

r.createElement('p', null, 'Hello, world!');

Example 2

<Greeting name="world" />;

React.createElement(Greeting, { name: 'world' });

Example 3

<Button type="submit">Send</Button>;

React.createElement(Button, { type: 'submit' }, 'Send');

Example 4

JSX์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋‹ค. React Element๋Š” React.createElement ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด 1๊ฐœ์˜ ๋ถ€๋ชจ๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. <div> ๊ฐ™์€ ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ฃผ๊ฑฐ๋‚˜ ๋ Œ๋”๋ง๋˜๊ณ  ๋‚˜์„œ ๋”์— ํƒœ๊ทธ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด, React.Fragment๋ฅผ ์ด์šฉํ•œ๋‹ค. <React.Fragment></React.Fragment>๋Š” ์•„์˜ˆ ์ƒ๋žตํ•ด์„œ <></> ์ด๋ ‡๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

  <p>Hello, world!</p>
  <Button type="submit">Send</Button>

  <>
    <p>Hello, world!</p>
    <Button type="submit">Send</Button>
  </>

  React.createELement(
    React.Fragment,
    null,
    React.createElement('p', null, 'Hello, world!'),
    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'),
);

Example 5

jsx๋Š” ํƒœ๊ทธ์•ˆ์—์„œ text์™€ JavaScript ๊ฐ’์œผ๋กœ๋งŒ ๊ตฌ๋ถ„์„ ํ•œ๋‹ค, ์ž„์˜๋กœ ๊ณต๊ฐ„์„ ์ฃผ๋ ค๋ฉด {' '}์„ ์ด์šฉํ•˜๋ฉด createElement์— ์ถ”๊ฐ€๋œ๋‹ค.

// prettier-ignore

<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๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ JSX์—†์ด๋„ React๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค, JSX๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ ์ˆœ์ˆ˜ JavaScript๋กœ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ JSX๋กœ ๋ฆฌ์•กํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋…์„ฑ, ์ƒ์‚ฐ์„ฑ ์ธก๋ฉด์—์„œ ๋ชจ๋‘ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

createElement๋Š” React Element๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค. Browser DOM์—์„œ๋„ element๋ฅผ ๋งŒ๋“œ๋Š” createElement๊ฐ€ ์žˆ๋‹ค.

// ๋ช…๋ นํ˜• ๋ฐฉ์‹์˜ ์ฝ”๋“œ

document.createElement('div');

const element = document.createElement('div');

// ํƒœ๊ทธ์— ๋‹จ์ผ ํด๋ž˜์Šค๋ช…์„ ์ง€์ •ํ•  ๋•Œ
element.className = 'test';

// ํƒœ๊ทธ์— ๋ณต์ˆ˜์˜ ํด๋ž˜์Šค๋ช…์„ ์ง€์ •ํ•  ๋•Œ
element.classList = 'test, good';
element.classList = ['test', 'good'].join(' ');

element.appendChild(document.createElement('p'));

JSX๋Š” React Element ํŠธ๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š”๋ฐ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

React.createElement๋ฅผ ์ง์ ‘ ์“ฐ๋ฉด ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— jsx-runtime์—์„œ๋Š” _jsx, Preact๋Š” h๋ž€ ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•œ๋‹ค.

React Developer Tools

chrome์˜ extension์ด๋‹ค. ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๋‚˜ state์˜ ๋ณ€ํ™”๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

VDOM (Virtual DOM)

DOM๊ฐ™์€ ๊ฐ€์ƒ์˜ DOM์„ ๋งŒ๋“ค์–ด์„œ ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค. React์—์„œ๋Š” ๋ฐ”๋กœ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Virtual DOM Tree๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. ์‹ค์ œ DOM๊ณผ ๋™๊ธฐํ™”๋ฅผ ํ•ด์ค€๋‹ค, ์ด ๊ณผ์ •์„ ์žฌ์กฐ์ •(Reconciliation)์ด๋ผ๊ณ  ํ•œ๋‹ค. VDOM๊ณผ Real DOM์„ ๋น„๊ตํ•˜๋ฉด์„œ ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝ์‹œ์ผœ์ค€๋‹ค.

VDOM์„ ์“ฐ๋ฉด ์ผ์„ 2๋ฒˆ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค, ๋ฐ”๋กœ DOM์— ๋ฐ˜์˜ํ•ด์ฃผ๋ฉด ๋ ํƒ ๋ฐ ์™œ VDOM์„ ์“ธ๊นŒ?

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

๋ฏธ์‹ : React๋Š” DOM๋ณด๋‹ค ๋น ๋ฅด๋‹ค. ํ˜„์‹ค: VDOM์€ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด๋‹ค.

VDOM์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด React์˜ ์„ ์–ธ์  API๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. ๋ช…๋ นํ˜•์œผ๋กœ DOM์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์€ ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ, ๊ฐ€๋…์„ฑ, ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ์ฝ”๋“œ๋“ฑ ๋‹ค์–‘ํ•œ ์ ์—์„œ ์ข‹์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

์„ ์–ต์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์˜๋„๋ฅผ ๋”์šฑ ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚ด๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. JSX๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฆฌ์•กํŠธ๊ฐ€ ๊ทธ๋Œ€๋กœ DOM์— ๋ฐ˜์˜ํ•ด์ค€๋‹ค, ๋ฐ˜์˜ํ•˜๋Š” ํ–‰์œ„์— ๋Œ€ํ•ด์„œ๋Š” ์‹ ๊ฒฝ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.

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

์„ฑ๋Šฅ ์ตœ์ ํ™”

๋ฆฌ์•กํŠธ์—์„œ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ๋ฐฉ์‹์ด ๋‹ค์–‘ํ•˜๋‹ค. ์ œ๋Œ€๋กœ๋œ ์ดํ•ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒํ™ฉ์— ๋งž๋Š” ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. useMemo, useCallback ๋“ฑ์˜ ์บ์‹ฑ ์—†์ด๋„ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ์˜ ๋ถ„๋ฆฌ๋งŒ์œผ๋กœ๋„ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ณต์‹ ๋ฌธ์„œ

์•ฑ์„ ๋ฐฐํฌํ•  ๋•Œ๋Š” ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•ฑ์„ ์ตœ์†Œํ™”ํ•ด์•ผํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆฌ์•กํŠธ๋Š” ๋„์›€์ด ๋˜๋Š” ๊ฒฝ๊ณ ๋“ค์„ ๋งŽ์ด ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ ๋“ค์€ ๊ฐœ๋ฐœ์—์„œ๋Š” ๋งค์šฐ ์šฉํ•˜์ง€๋งŒ ๋ฆฌ์•กํŠธ๋ฅผ ํฌ๊ณ  ๋А๋ฆฌ๊ฒŒ ๋งŒ๋“ ๋‹ค. ๋”ฐ๋ผ์„œ ์•ฑ์„ ๋ฐฐํฌํ• ๋•Œ๋Š” ํ”„๋กœ๋•์…˜ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐฐํฌํ•ด์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ ํ”„๋กœ๋•์…˜ ๋ฒ„์ „์œผ๋กœ ์ œ๋Œ€๋กœ ๋ฐฐํฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด React Developer Tools for Chrome์„ ์„ค์น˜ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Last updated