React Diffing Algorithm

1. Diffing Algorithm์˜ ํ•„์š”์„ฑ

  • React๊ฐ€ ๊ธฐ์กด ๊ฐ€์ƒ DOM๊ณผ ๋ณ€๊ฒฝ๋œ ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM์„ ๋น„๊ต ์‹œ

  • ๋ณ€๊ฒฝ๋œ ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM ํŠธ๋ฆฌ์— ๋ถ€ํ•ฉํ•˜๋„๋ก ๊ธฐ์กด์˜ UI๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ผ ํ•„์š”

  • ์ฆ‰ ํ•˜๋‚˜์˜ ํŠธ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋ฆฌ๋กœ ๋ณ€ํ˜•์„ ์‹œํ‚ค๋Š” ๊ฐ€์žฅ ์ž‘์€ ์กฐ์ž‘ ๋ฐฉ์‹์„ ์•Œ์•„๋‚ด์•ผ๋งŒ ํ–ˆ์Œ

  • ๊ธฐ์กด์— ์•Œ์•„๋‚ธ ์กฐ์ž‘ ๋ฐฉ์‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ O(n^3)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Œ.

  • ์ด๋Š” ๋„ˆ๋ฌด ๋น„์‹ผ ์—ฐ์‚ฐ์œผ๋กœ ๋‘ ๊ฐ€์ง€ ๊ฐ€์ •์œผ๋กœ ์ƒˆ๋กœ์šด ํœด๋ฆฌ์Šคํ‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•จ.

  • ์ด ๋‘ ๊ฐ€์ •์€ ๊ฑฐ์˜ ๋ชจ๋“  ์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋“ค์–ด๋งž๊ณ , React๋Š” ๋น„๊ต ์•Œ๊ณ ๋ฆฌ์ฆ˜(Diffing Algorithm)์„ ์‚ฌ์šฉ

    • ๊ฐ๊ธฐ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์š”์†Œ๋Š” ๋‹ค๋ฅธ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•  ๊ฒƒ์ด๋‹ค.

    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” key ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ , ์—ฌ๋Ÿฌ ๋ฒˆ ๋ Œ๋”๋ง์„ ๊ฑฐ์ณ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š” ์ž์‹ ์š”์†Œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

2. React๊ฐ€ DOM ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ํŠธ๋ฆฌ์˜ ๋ ˆ๋ฒจ ์ˆœ์„œ๋Œ€๋กœ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํƒ์ƒ‰

  • ์ฆ‰ ๊ฐ™์€ ๋ ˆ๋ฒจ(์œ„์น˜)๋ผ๋ฆฌ ๋น„๊ต

  • ์ด๋Š” ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS)์˜ ์ผ์ข…

1) ๋‹ค๋ฅธ ํƒ€์ž…์˜ DOM ์—˜๋ฆฌ๋จผํŠธ์ธ ๊ฒฝ์šฐ

  • DOM ํŠธ๋ฆฌ๋Š” ๊ฐ HTML ํƒœ๊ทธ๋งˆ๋‹ค ๊ฐ๊ฐ์˜ ๊ทœ์น™์ด ์žˆ์–ด ๊ทธ ์•„๋ž˜ ๋“ค์–ด๊ฐ€๋Š” ์ž์‹ ํƒœ๊ทธ๊ฐ€ ํ•œ์ •์ ์ด๋ผ๋Š” ํŠน์ง•์ด ์žˆ์Œ

  • ์ž์‹ ํƒœ๊ทธ์˜ ๋ถ€๋ชจ ํƒœ๊ทธ ๋˜ํ•œ ์ •ํ•ด์ ธ ์žˆ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ถ€๋ชจ ํƒœ๊ทธ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค๋ฉด React๋Š” ์ด์ „ ํŠธ๋ฆฌ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , ์ด์ „์˜ DOM ๋…ธ๋“œ๋“ค์€ ์ „๋ถ€ ํŒŒ๊ดด๋จ

    <div>
    <Counter />
    </div>
    
    // ๋ถ€๋ชจ ํƒœ๊ทธ๊ฐ€ div์—์„œ span์œผ๋กœ ๋ฐ”๋€Œ๋ฉด ์ž์‹ ๋…ธ๋“œ <Counter/>๋Š” ์™„์ „ํžˆ ํ•ด์ œ
    <span>
    <Counter />
    </span>

2) ๊ฐ™์€ ํƒ€์ž…์˜ DOM ์—˜๋ฆฌ๋จผํŠธ์ธ ๊ฒฝ์šฐ

  • ํƒ€์ž…์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค๋ฉด React๋Š” ์ตœ๋Œ€ํ•œ ๋ Œ๋”๋ง์„ ํ•˜์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ์—…๋ฐ์ดํŠธ

  • ์—…๋ฐ์ดํŠธํ•  ๋‚ด์šฉ์ด ์ƒ๊ธฐ๋ฉด virtual DOM ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ๋งŒ ์ˆ˜์ •ํ•œ ๋’ค, ๋ชจ๋“  ๋…ธ๋“œ์— ๊ฑธ์นœ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋๋‚˜๋ฉด ๊ทธ๋•Œ ๋‹จ ํ•œ๋ฒˆ ์‹ค์ œ DOM์œผ๋กœ์˜ ๋ Œ๋”๋ง์„ ์‹œ๋„

    <div className="before" title="stuff" />
    
    // ๊ธฐ์กด์˜ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ํƒœ๊ทธ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์€ ์ฑ„ className๋งŒ ๋ณ€๊ฒฝ๋จ
    // React๋Š” ๋‘ ์š”์†Œ ๋น„๊ต ์‹œ className๋งŒ ์ˆ˜์ •๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋จ
    <div className="after" title="stuff" />
    // className์ด before์ธ ์ปดํฌ๋„ŒํŠธ
    <div style={{color: 'red', fontWeight: 'bold"}} title="stuff" />
    
    // className์ด after์ธ ์ปดํฌ๋„ŒํŠธ
    <div style={{color: 'green', fontWeight: 'bold"}} title="stuff" />
  • ๋‘ ์—˜๋ฆฌ๋จผํŠธ ๋น„๊ต ์‹œ, React๋Š” ์ •ํ™•ํžˆ color ์Šคํƒ€์ผ๋งŒ ๋ฐ”๋€Œ๊ณ  ์žˆ์Œ์„ ๋ˆˆ์น˜์ฑ”

  • ๋”ฐ๋ผ์„œ React๋Š” color ์Šคํƒ€์ผ๋งŒ ์ˆ˜์ •, ๋‹ค๋ฅธ ์š”์†Œ๋Š” ์ˆ˜์ •ํ•˜์ง€ ์•Š์Œ

  • ์ด๋ ‡๋“ฏ ํ•˜๋‚˜์˜ DOM ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋’ค React๋Š” ๋’ค์ด์–ด ํ•ด๋‹น ๋…ธ๋“œ๋“ค ๋ฐ‘์˜ ์ž์‹๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋™์‹œ์— ์ˆœํšŒํ•˜๋ฉด์„œ ์ฐจ์ด๊ฐ€ ๋ฐœ๊ฒฌ๋  ๋•Œ๋งˆ๋‹ค ๋ณ€๊ฒฝํ•จ

  • ์ด๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ํ‘œํ˜„

3) ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ์˜ ์žฌ๊ท€์  ์ฒ˜๋ฆฌ

  • ์•„๋ž˜์™€ ๊ฐ™์ด ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ ๋ณ€๊ฒฝ ์‹œ

    <ul>
    <li>first</li>
    <li>second</li>
    </ul>
    
    // ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ์˜ ๋์— ์ƒˆ๋กœ์šด ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€
    <ul>
    <li>first</li>
    <li>second</li>
    <li>third</li>
    </ul>
  • React๋Š” ๊ธฐ์กด <ul>๊ณผ ์ƒˆ๋กœ์šด <ul>์„ ๋น„๊ต ์‹œ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์œ„์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ๋น„๊ตํ•˜๋ฉด์„œ ๋ฐ”๋€ ์ ์„ ์ฐพ์Œ

  • ๋•Œ๋ฌธ์— ์ฒซ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ๋“ค๊ณผ ๋‘ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ๋“ค์ด ์ผ์น˜ํ•˜๋Š” ์  ํ™•์ธ ํ›„ ์„ธ ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€

  • ์ด๋ ‡๋“ฏ React๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ๋น„๊ตํ•˜๊ธฐ์— ๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ์— ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์‹œ ์ด์ „ ์ฝ”๋“œ์— ๋น„ํ•ด ํ›จ์”ฌ ๋‚˜์œ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ์Œ.

  • ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ ๋ณ€๊ฒฝ ์‹œ

    <ul>
    <li>Duke</li>
    <li>Villanova</li>
    </ul>
    
    // ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฒ˜์Œ์— ์ถ”๊ฐ€
    <ul>
    <li>Connecticut</li>
    <li>Duke</li>
    <li>Villanova</li>
    </ul>
  • React๋Š” ์šฐ๋ฆฌ์˜ ๊ธฐ๋Œ€๋Œ€๋กœ ์ตœ์†Œํ•œ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋จ. ๊ธฐ์กด์ฒ˜๋Ÿผ ์ฒ˜์Œ์˜ ๋…ธ๋“œ๋“ค์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ

  • <li>Duke</li>์™€ <li>Connecticut</li>์œผ๋กœ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๋‹ค๊ณ  ์ธ์ง€ํ•œ React๋Š” ๋ฆฌ์ŠคํŠธ ์ „์ฒด๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค๊ณ  ๋ฐ›์•„๋“ค์ž„

  • ์ฆ‰ ๊ทธ๋Œ€๋กœ์ธ ์ž์‹ ๋…ธ๋“œ๋Š” ์œ ์ง€์‹œ์ผœ๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ•˜๊ณ  ์ „๋ถ€ ๋ฒ„๋ฆฌ๊ณ  ์ƒˆ๋กญ๊ฒŒ ๋ Œ๋”๋ง ํ•ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Š” ๊ต‰์žฅํžˆ ๋น„ํšจ์œจ์ ์ธ ๋™์ž‘ ๋ฐฉ์‹

  • ๋”ฐ๋ผ์„œ React๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด key๋ผ๋Š” ์†์„ฑ์„ ์ง€์›

4) ํ‚ค(Key)

  • ๋งŒ์•ฝ ์ž์‹ ๋…ธ๋“œ๋“ค์ด key๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๋ฉด, React๋Š” key๋กœ ๊ธฐ์กด ํŠธ๋ฆฌ์˜ ์ž์‹๊ณผ ์ƒˆ๋กœ์šด ํŠธ๋ฆฌ์˜ ์ž์‹์˜ ์ผ์น˜ ์—ฌ๋ถ€ ํ™•์ธ ๊ฐ€๋Šฅ

    <ul>
    <li key="2015">Duke</li>
    <li key="2016">Villanova</li>
    </ul>
    
    // key๊ฐ€ 2014์ธ ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฒ˜์Œ์— ์ถ”๊ฐ€
    <ul>
    <li key="2014">Connecticut</li>
    <li key="2015">Duke</li>
    <li key="2016">Villanova</li>
    </ul>
  • React๋Š” key ์†์„ฑ์œผ๋กœ โ€˜2014โ€™๋ผ๋Š” ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์ƒ๊ฒผ๊ณ , โ€˜2015โ€™, โ€˜2016โ€™ ํ‚ค๋ฅผ ๊ฐ€์ง„ ์—˜๋ฆฌ๋จผํŠธ๋Š” ๊ทธ์ € ์œ„์น˜๋งŒ ์ด๋™ํ–ˆ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋จ.

  • ๋”ฐ๋ผ์„œ React๋Š” ๊ธฐ์กด์˜ ๋™์ž‘ ๋ฐฉ์‹๋Œ€๋กœ ๋‹ค๋ฅธ ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ถ”๊ฐ€๋œ ์—˜๋ฆฌ๋จผํŠธ๋งŒ ๋ณ€๊ฒฝ

  • ์ด key ์†์„ฑ์—๋Š” ๋ณดํ†ต ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ƒ์˜ ์œ ๋‹ˆํฌํ•œ ๊ฐ’(ex. Id)์„ ๋ถ€์—ฌํ•ด ์ฃผ๋ฉด ๋จ

  • ํ‚ค๋Š” ์ „์—ญ์ ์œผ๋กœ ์œ ์ผํ•  ํ•„์š”๋Š” ์—†๊ณ , ํ˜•์ œ ์—˜๋ฆฌ๋จผํŠธ ์‚ฌ์ด์—์„œ๋งŒ ์œ ์ผํ•˜๋ฉด ๋จ

  • ๋งŒ์•ฝ ์œ ๋‹ˆํฌํ•œ ๊ฐ’์ด ์—†๋‹ค๋ฉด ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ key๋กœ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • ๋‹ค๋งŒ ๋ฐฐ์—ด์ด ๋‹ค๋ฅด๊ฒŒ ์ •๋ ฌ๋  ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ key๋กœ ์„ ํƒํ–ˆ์„ ๊ฒฝ์šฐ๋Š” ๋น„ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์  ์ฐธ๊ณ 

  • ์ธ๋ฑ์Šค๋Š” ๊ทธ๋Œ€๋กœ์ง€๋งŒ ๊ทธ ์š”์†Œ๊ฐ€ ๋ฐ”๋€๋‹ค๋ฉด React๋Š” ๋ฐฐ์—ด์˜ ์ „์ฒด๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค๊ณ  ๋ฐ›์•„๋“ค์ผ ๊ฒƒ์ด๊ณ , ๊ธฐ์กด์˜ DOM ํŠธ๋ฆฌ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด DOM ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•ด ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž„.

Last updated