1. JSX

1. JSX๋ž€?

React ๊ณต์‹๋ฌธ์„œ JSX ์†Œ๊ฐœ

JSX is an XML-like syntax extension to ECMAScript JSX๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์œ„ํ•œ XML๊ฐ™์€ ๋ฌธ๋ฒ• ํ™•์žฅ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ HTML์„ ํ•ฉ์ณ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•

๐Ÿงบ JSX๋Š” React์˜ ๋ถ€์‚ฐ๋ฌผ

JSX๋Š” React๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๋‚˜์˜จ ๋ถ€์‚ฐ๋ฌผ ๊ฐ™์€ ๊ฒƒ์ด์ง€๋งŒ, React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•„์ˆ˜๋Š” ์•„๋‹˜ ๋˜ํ•œ ๊ผญ ๋ฆฌ์•กํŠธ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋„ ์•„๋‹˜ (Ex. Vue.js ๋“ฑ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ) ์ฐธ๊ณ ๋กœ, ๊นƒํ—ˆ๋ธŒ์˜ ํ…์ŠคํŠธ ์—๋””ํ„ฐ ์•„ํ†ฐ์˜ ๋ถ€์‚ฐ๋ฌผ์ธ ์ผ๋ ‰ํŠธ๋ก ์œผ๋กœ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๋Š” VS code๋ฅผ ๋งŒ๋“ฆ

JSX ๋ฌธ๋ฒ•

ํƒœ๊ทธ ๋‹ซ๊ธฐ

์—ฌ๋Š” ํƒœ๊ทธ์™€ ๋‹ซ๋Š” ํƒœ๊ทธ๊ฐ€ ํ•„์š” ๋‹ซ๋Š” ํƒœ๊ทธ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ, self closing tag ์‚ฌ์šฉ : </>

์ตœ์ƒ์œ„ ํƒœ๊ทธ

Fragments ๊ฐ€์žฅ ๋ฐ”๊นฅ์— ์œ„์น˜ํ•˜๋Š” ํƒœ๊ทธ ํ˜•์ œ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฌถ์–ด์ค˜์•ผ ํ•จ : <>๋˜๋Š” <React.Fragment>๋กœ ๋ฌถ์–ด์คŒ

์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง

์‚ผํ•ญ ์—ฐ์‚ฐ์ž (์กฐ๊ฑด์‹) ? (์ฐธ ํ‘œํ˜„์‹) : (๊ฑฐ์ง“ ํ‘œํ˜„์‹)

์ค‘๊ด„ํ˜ธ {} ์ด์šฉ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ค‘๊ด„ํ˜ธ ์ด์šฉ

JavaScript ์ฝ”๋“œ์™€ 1:1 ๋งค์นญ

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

๐Ÿ—ผ Babel

๋ณ€ํ™˜๊ธฐ Babel ๋กœ ํ™•์ธ ๊ฐ€๋Šฅ

Presets์—์„œ react๋ฅผ ์ฒดํฌํ•˜๊ฑฐ๋‚˜, Plugins์—์„œ @babel/plugin-transform-react-jsx๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด JSX๋ฅผ ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ์Œ JSX ํŒŒ์ผ์— /* @jsx ์›ํ•˜๋Š” ๋‚ด์šฉ */ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋ฉด React.createElement ๋Œ€์‹  ์›ํ•˜๋Š” ๋‚ด์šฉ์„ ์“ธ ์ˆ˜ ์žˆ์Œ โ†’ ๋ฆฌ์•กํŠธ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ

Babel ๋ณ€ํ™˜ ์˜ˆ์‹œ (JSX โ†’ JavaScript)

Ex.1

// JSX ์ฝ”๋“œ
<p>Hello, world!</p>


// ๋ณ€ํ™˜๋œ JS ์ฝ”๋“œ
React.createElement("p", null, "Hello, world!");
  • <p> ํƒœ๊ทธ ์•ˆ์— ์†์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— null

Ex.2

// JSX ์ฝ”๋“œ
<Greeting name="world" />

    
// ๋ณ€ํ™˜๋œ JS ์ฝ”๋“œ
React.createElement(Greeting, { name: "world" });
  • <Greeting> ํƒœ๊ทธ ์•„๋ž˜์˜ ๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์„ธ๋ฒˆ์งธ ์ธ์ž๊ฐ€ ์—†์Œ

  • <Greeting>์€ ์‚ฌ์šฉ์ž ์ •์˜ ์ปดํฌ๋„ŒํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— "Greeting"์ด ์•„๋‹Œ Greeting ์œผ๋กœ ํ‘œ๊ธฐ

    • ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ–ˆ๊ฑฐ๋‚˜ importํ•œ ์ปดํฌ๋„ŒํŠธ

Ex.3

// JSX ์ฝ”๋“œ
<div className="test">
    <p>Hello, world!</p>
    <Button type="submit">Send</Button>
</div>


// ๋ณ€ํ™˜๋œ JS ์ฝ”๋“œ
React.createElement(
    "div", 
    { className: "test" }, 
    React.createElement("p", null, "Hello, world!"), 
    React.createElement(Button, { type: "submit" }, "Send")
);
  • ์ตœ์ƒ์œ„ ํƒœ๊ทธ fragment๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

    • add(1, 2) add(3, 4) ์™€ ๊ฐ™์€ ์ƒํ™ฉ

    • ; ๋˜๋Š” ,๋กœ ๊ตฌ๋ถ„ํ•ด์ค˜์•ผ ํ•จ

Ex.4

// JSX ์ฝ”๋“œ
<div>
    <p>Count: {count}!</p>  
    <button type="button" onClick={() => setCount(count + 1)}>Increase</button>
</div>


// ๋ณ€ํ™˜๋œ JS ์ฝ”๋“œ
React.createElement(
    "div", 
    null, 
    React.createElement("p", null, "Count: ", count, "!"), 
    React.createElement("button", { type: "button", onClick: () => setCount(count + 1) }, "Increase")
);
  • ๊ณต๋ฐฑ์„ ๋„ฃ์–ด์ฃผ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” {' '}๋ฅผ ๋„ฃ๊ธฐ๋„ ํ•จ

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

Babel, JSX, ๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ ๊ณผ์ •๋“ค JSX ์ดํ•ดํ•˜๊ธฐ

JSX๋Š” React.createElement๋ฅผ ์“ฐ๋„๋ก JS ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ ๋ณ€ํ™˜๋œ JS ์ฝ”๋“œ๋Š” Virtual DOM ํŠธ๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๊ณ , ๊ทธ๊ฒƒ๊ณผ ํ™”๋ฉด์„ ๋น„๊ตํ•ด์„œ ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธ(์žฌ์กฐ์ • ๊ณผ์ •) ๐Ÿ’ก ์ด ์ ‘๊ทผ๋ฐฉ์‹์„ ํ†ตํ•ด React์˜ ์„ ์–ธ์  API๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ฆ

3. Syntactic sugar

Syntactic_sugar

๊ฐ JSX ์—˜๋ฆฌ๋จผํŠธ๋Š” React.createElement(component, props, ...children)๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ๋ฒ• ์„คํƒ• ๊ทธ๋ž˜์„œ JSX๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ ์ˆœ์ˆ˜ JavaScript๋กœ๋„ ๊ฐ€๋Šฅ

์‚ฌ๋ฌผ์„ ๋” ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋‚ด์˜ ๊ตฌ๋ฌธ ๋” ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋Œ€์ฒดํ•˜์—ฌ ํ‘œํ˜„ํ•˜๋Š” ์Šคํƒ€์ผ ๋” ์งง๊ณ  ์ฝ๊ณ  ์“ฐ๊ธฐ๊ฐ€ ์‰ฌ์›€ ๐Ÿ’ก JSX๋ฅผ ์ˆœ์ˆ˜ JavaScript๋งŒ์œผ๋กœ๋„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋” ๊ธธ๊ณ  ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์— JSX๋ฅผ ์‚ฌ์šฉ

4. React.createElement

createElement JSX ์—†์ด ์‚ฌ์šฉํ•˜๋Š” React

๋ฆฌ์•กํŠธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค

  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค : ๋‚ด๋ถ€ ์‹๋ณ„์ž(ํ˜•์‹, ํ•จ์ˆ˜, ๋ณ€์ˆ˜ ๋“ฑ์˜ ์ด๋ฆ„)์— ๋ฒ”์œ„๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„ ์–ธ์  ์˜์—ญ

createElement()๋Š” React ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ type ์ธ์ž๋กœ๋Š” 1๏ธโƒฃ ํƒœ๊ทธ ์ด๋ฆ„ ๋ฌธ์ž์—ด('div', 'span' ๋“ฑ), 2๏ธโƒฃ React ์ปดํฌ๋„ŒํŠธ ํƒ€์ž…, 3๏ธโƒฃ React Fragment ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ์Œ

JSX ์—†์ด JavaScript ์‚ฌ์šฉํ•˜๊ธฐ

๋นŒ๋“œ ํ™˜๊ฒฝ์—์„œ ์ปดํŒŒ์ผ ์„ค์ •์„ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ, JSX ์—†์ด React๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํŠนํžˆ ํŽธ๋ฆฌ JSX ํŒŒ์ผ์€ ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ€ํ™˜ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฉด ๊ทธ๋ƒฅ JavaScript ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ JSX๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋Š” React.createElement() ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ โ†’ JSX๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ ์ˆœ์ˆ˜ JavaScript๋กœ๋„ ๊ฐ€๋Šฅ

React.createElement๋ฅผ ์งง์€ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด JSX ์—†์ด React ์‚ฌ์šฉํ•˜๊ธฐ

const e = React.createElement;

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(e('div', null, 'Hello World'));

5. React Element

์—˜๋ฆฌ๋จผํŠธ ๋ Œ๋”๋ง

์—˜๋ฆฌ๋จผํŠธ๋Š” React ์•ฑ์˜ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ๋‚ด์šฉ์„ ๊ธฐ์ˆ 

createElement๋กœ React Element ํŠธ๋ฆฌ ๊ฐฑ์‹ ํ•˜๊ธฐ

JSX ๋Œ€์‹  React.createElement๋ฅผ ์‚ฌ์šฉํ•ด์„œ React Element ํŠธ๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์Œ React.createElement๋Š” DOM tree์—์„œ node๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋ฉฐ, ๋Œ€์‹  ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ƒ์„ฑ

๐Ÿ”Ž DOM ์—˜๋ฆฌ๋จผํŠธ์™€ React ์—˜๋ฆฌ๋จผํŠธ

๋ธŒ๋ผ์šฐ์ € DOM ์—˜๋ฆฌ๋จผํŠธ์™€ ๋‹ฌ๋ฆฌ, React ์—˜๋ฆฌ๋จผํŠธ๋Š” ์ผ๋ฐ˜ ๊ฐ์ฒด์ด๋ฉฐ(plain object) ์‰ฝ๊ฒŒ ์ƒ์„ฑ ๊ฐ€๋Šฅ React DOM์€ React ์—˜๋ฆฌ๋จผํŠธ์™€ ์ผ์น˜ํ•˜๋„๋ก DOM์„ ์—…๋ฐ์ดํŠธ

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

// Inserted by a compiler (don't import it yourself!)
import {jsx as _jsx} from 'react/jsx-runtime';

function App() {
  return _jsx('h1', { children: 'Hello world' });
}

6. React StrictMode

React StrictMode

StrictMode๋Š” ์ž์†๋“ค์— ๋Œ€ํ•œ ๋ถ€๊ฐ€์ ์ธ ๊ฒ€์‚ฌ์™€ ๊ฒฝ๊ณ ๋ฅผ ํ™œ์„ฑํ™” ๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ๋งŒ ํ™œ์„ฑํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—๋Š” ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š์Œ

  • ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋ฐœ๊ฒฌ

  • ๋ ˆ๊ฑฐ์‹œ ๋ฌธ์ž์—ด ref ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ 

  • ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š” findDOMNode ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ 

  • ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ถ€์ž‘์šฉ ๊ฒ€์‚ฌ

  • ๋ ˆ๊ฑฐ์‹œ context API ๊ฒ€์‚ฌ

  • Ensuring reusable state

StrictMode ํ™œ์„ฑํ™”

root.render((
    <React.StrictMode>
      <App />
    </React.StrictMode>
));
  • <App /> ์ปดํฌ๋„ŒํŠธ ๊ฐ๊ฐ์˜ ์ž์†๊นŒ์ง€ ๊ฒ€์‚ฌ๊ฐ€ ์ด๋ฃจ์–ด์ง

โš ๏ธ Ex. useEffect ๋“ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฝ˜์†”์— ๋‘ ๋ฒˆ์”ฉ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ๋‘ ๋ฒˆ ์ฒดํฌํ•ด์„œ ๋‘ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ ํ•จ์ˆ˜์˜ ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ๊ฐ€ ํฌ๋‹ค๊ณ  ๊ฒฝ๊ณ 

React Developer Tools

React Developer Tools

  1. ์ปดํฌ๋„ŒํŠธ๊ฐ€ StrictMode ํ™œ์„ฑํ™” ๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฉด ๊ฒฝ๊ณ 

  2. ๋‚ด๋ถ€์ ์œผ๋กœ VDOM ํŠธ๋ฆฌ๋ฅผ ๋น„์Šทํ•˜๊ฒŒ ๋ณด์—ฌ์คŒ

7. VDOM(Virtual DOM)

๐ŸŒณ ํŠธ๋ฆฌ๋Š” ํ”„๋ž™ํƒˆ๊ณผ ๊ฐ™์Œ(์žฌ๊ท€์ ), ํŠธ๋ฆฌ์˜ ๊ตฌ์„ฑ์š”์†Œ๋Š” ํŠธ๋ฆฌ ๋งค๋ฒˆ ์ž‘์€ React Element ํŠธ๋ฆฌ, VDOM ํŠธ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋จ

VDOM์€ UI์˜ ์ด์ƒ์ , ๊ฐ€์ƒ์ ์ธ ํ‘œํ˜„์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ , ReactDOM๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด ์‹ค์ œ DOM๊ณผ ๋™๊ธฐํ™”ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋… ํŠน์ • ๊ธฐ์ˆ ์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š” ํŒจํ„ด์— ๊ฐ€๊นŒ์›€ React์—์„œ virtual DOM์ด๋ผ๋Š” ์šฉ์–ด๋Š” ๋ณดํ†ต ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— React elements์™€ ์—ฐ๊ด€๋จ

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

  1. ์ถฉ๋ถ„ํžˆ ๋น ๋ฆ„ - ์†๋„๋ฅผ ๋‚ด์„ธ์šธ ์ •๋„๋กœ ๋งค์šฐ ๋น ๋ฅธ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ถฉ๋ถ„ํžˆ ๋น ๋ฆ„

  2. ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด (ํ•ต์‹ฌโœจ) - ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ด

Virtual DOM

Virtual DOM

Virtual DOM์€ ๋ธŒ๋ผ์šฐ์ € API ์œ„์— ์žˆ๋Š” JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ตฌํ˜„๋˜๋Š” ๊ฐœ๋… ์ด์ „์˜ DOM Tree์™€ ๋น„๊ตํ•ด์„œ ์‹ค์งˆ์ ์œผ๋กœ ์–ด๋–ค ๋ถ€๋ถ„์ด ์—…๋ฐ์ดํŠธ ๋ผ์•ผ ํ•˜๋Š”์ง€ ๊ณ„์‚ฐํ•ด์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ DOM Tree์— ์—…๋ฐ์ดํŠธ ( = ์žฌ์กฐ์ •) ๋ Œ๋”๋ง ์ „ํ›„์— ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ์„ ์ ์šฉ ๋ณ€ํ™˜๋œ JS ์ฝ”๋“œ๋Š” Virtual DOM ํŠธ๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๊ณ , ๊ทธ๊ฒƒ๊ณผ ํ™”๋ฉด์„ ๋น„๊ตํ•ด์„œ ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธ โ‡’ render ํ•จ์ˆ˜๊ฐ€ ๋งŽ์ด ํ˜ธ์ถœ๋˜์–ด๋„ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ๊ฑฑ์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ด์œ 

  • ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ๋ณด๊ด€

  • 60fps๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด์žฅ

DOM

DOM(Document Object Model) DOM์€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ผ๊นŒ?

์›น ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๋ทฐ ํฌํŠธ์— ๋ฌด์—‡์„ ๋ Œ๋”๋ง ํ• ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ํŽ˜์ด์ง€์˜ ์ฝ˜ํ…์ธ  ๋ฐ ๊ตฌ์กฐ, ์Šคํƒ€์ผ์„ ์ฝ๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก API๋ฅผ ์ œ๊ณต ๐ŸŒณ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ํŒŒ์ผ์„ ์ฝ์œผ๋ฉด์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ ํŠธ๋ฆฌ(DOM ํŠธ๋ฆฌ)๋กœ ๋ณ€ํ™˜

DOM vs HTML

DOM์€ ์›๋ณธ HTML ๋ฌธ์„œ์˜ ๊ฐ์ฒด ๊ธฐ๋ฐ˜ ํ‘œํ˜„ ๋ฐฉ์‹ ๋‘˜์€ ์„œ๋กœ ๋น„์Šทํ•˜์ง€๋งŒ, ์ฐจ์ด ์กด์žฌ

  • HTML ๋ฌธ์„œ : ๋‚ด์šฉ๊ณผ ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœ ํ…์ŠคํŠธ๋กœ ๊ตฌ์„ฑ

  • DOM : HTML ๋ฌธ์„œ์˜ ๋‚ด์šฉ๊ณผ ๊ตฌ์กฐ๊ฐ€ ๊ฐ์ฒด ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜๋˜์–ด, ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ

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

fragment๋Š” DOM์— ์—†์Œ (DOM tree์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Œ) Vue์˜ template์ด ๊ทธ๋‚˜๋งˆ ๋น„์Šทํ•˜๊ณ , Vue์—์„œ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉ๋จ

๐Ÿ”— ์Šค๋ฒจํŠธ์˜ ๊ฒฝ์šฐ Virtual DOM ์—†์–ด๋„ ๋œ๋‹ค, Virtual DOM์„ ์“ด๋‹ค๊ณ  ๋นจ๋ผ์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

8. Reconciliation(์žฌ์กฐ์ •) ๊ณผ์ •

์žฌ์กฐ์ • (Reconciliation)

๐Ÿ“ข ์ƒˆ๋กœ ๋ฐ”๋€ ๋ฐ์ดํ„ฐ๋กœ ๋ฆฌ์•กํŠธ ์—˜๋ฆฌ๋จผํŠธ ๋งŒ๋“ค์–ด์ค˜! ๋ณ€ํ™˜๋œ JS ์ฝ”๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์€ Virtual DOM์œผ๋กœ ๊ฐ€๋Šฅ ์ด ์ ‘๊ทผ๋ฐฉ์‹์ด React์˜ ์„ ์–ธ์  API๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ฆ

React๋Š” ์„ ์–ธ์  API๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐฑ์‹ ์ด ๋  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ๋ฌด์—‡์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€๋ฅผ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Œ React ๋‚ด๋ถ€์—์„œ๋Š” ๋น„๊ต (diffing) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ๋ฌด์—‡์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๊ณ„์‚ฐ์ด ์ผ์–ด๋‚จ โ‡’ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐฑ์‹ ์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•ด์ง€๊ณ , ๋น ๋ฅธ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

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

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

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

๐Ÿ“ƒ Ex. ๊ธด ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค„ ๋•Œ [1, 2, 3, 4, 5]๊ฐ€ [2, 3, 4, 5, 6]์œผ๋กœ ๋ฐ”๋€ ์ƒํ™ฉ์—์„œ 1์ด ์‚ฌ๋ผ์ง€๊ณ  6์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด key๋ฅผ ์žก์•„์คŒ

Last updated