๐Ÿ’ป ์žฌ์กฐ์ •(feat. ๋ฆฌ์•กํŠธ ๊ณต์‹๋ฌธ์„œ)

waterglassesยท2022๋…„ 12์›” 11์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
49/50
post-thumbnail

โš ๏ธ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์€ ์˜คํƒ€๋‚˜ ์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋™๊ธฐ

React์—์„œ state๋‚˜ props๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉด render() ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด React ์—˜๋ฆฌ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๋•Œ React๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐ€์ •์„ ๊ธฐ๋ฐ˜ํ•˜์—ฌ O(n) ๋ณต์žก๋„์˜ ํœด๋ฆฌ์Šคํ‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋น„๊ต ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  1. ์„œ๋กœ ๋‹ค๋ฅดํƒ€์ž…์˜ ๋‘ ์—˜๋ฆฌ๋จผํŠธ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.
  2. ๊ฐœ๋ฐœ์ž๊ฐ€ key prop์„ ํ†ตํ•ด, ์—ฌ๋Ÿฌ ๋ Œ๋”๋ง ์‚ฌ์ด์—์„œ ์–ด๋–ค ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ• ์ง€ ํ‘œ์‹œํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

๋น„๊ต ์•Œ๊ณ ๋ฆฌ์ฆ˜(Diffing Algorithm)

๋‘ ๊ฐœ์˜ ํŠธ๋ฆฌ๋ฅผ ๋น„๊ตํ•  ๋•Œ React๋Š” ๋‘ ์—˜๋ฆฌ๋จผํŠธ์˜ ๋ฃจํŠธ ์—˜๋ฆฌ๋จผํŠธ๋ถ€ํ„ฐ ๋น„๊ตํ•œ๋‹ค.

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

๋‘ ๋ฃจํŠธ ์—˜๋ฆฌ๋จผํŠธ์˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด, React๋Š” ์ด์ „ ํŠธ๋ฆฌ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค.

// ๋ฐ”๋€Œ๊ธฐ ์ „
<div>
  <Counter />
</div>

// ๋ฐ”๋€ ํ›„
<span>
  <Counter />
</span>

๋ฐ”๋€Œ๊ธฐ ์ „, ํ›„์— div์—์„œ span์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋˜๋ฉด ํŠธ๋ฆฌ ์ „์ฒด๋ฅผ ์žฌ๊ตฌ์ถ•ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด์ „ Counter ์ปดํฌ๋„ŒํŠธ๋Š” ์‚ฌ๋ผ์ง€๊ณ  ์ƒˆ๋กœ ๋‹ค์‹œ ๋งˆ์šดํŠธ๋œ๋‹ค. ํŠธ๋ฆฌ๋ฅผ ๋ฒ„๋ฆฌ๊ฒŒ ๋˜๋ฉด ์ด์ „ DOM ๋…ธ๋“œ๋“ค์€ ๋ชจ๋‘ ํŒŒ๊ดด๋œ๋‹ค.

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

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

// classNmae๋งŒ ์ˆ˜์ •
<div className="before" title="stuff" />
<div className="after" title="stuff" />

// color ์†์„ฑ style๋งŒ ๊ฐฑ์‹ 
<div style={{color: 'red', fontWeight: 'bold'}} />
<div style={{color: 'green', fontWeight: 'bold'}} />

๊ฐ™์€ ํƒ€์ž…์˜ ์ปดํฌ๋„ŒํŠธ ์—˜๋ฆฌ๋จผํŠธ

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉด ์ธ์Šคํ„ด์Šค๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜์–ด ๋ Œ๋”๋ง ๊ฐ„ state๊ฐ€ ์œ ์ง€๋œ๋‹ค.

์ž์‹์— ๋Œ€ํ•œ ์žฌ๊ท€์  ์ฒ˜๋ฆฌ

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

<ul>
  <li>first</li>
  <li>second</li>
</ul>

// ๋งจ ์•ž์— <li>third</li>๋ฅผ ํŠธ๋ฆฌ์— ์ถ”๊ฐ€๋˜๋ฉด ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š๋‹ค.
<ul>
  <li>third</li>
  <li>first</li>
  <li>second</li>
</ul>

Keys

React๋Š” key๋ฅผ ํ†ตํ•ด ๊ธฐ์กด ํŠธ๋ฆฌ์™€ ์ดํ›„ ํŠธ๋ฆฌ์˜ ์ž์‹๋“ค์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

<ul>
  <li key="1">first</li>
  <li key="2">second</li>
</ul>

// "3" key๋ฅผ ๊ฐ€์ง„ ์—˜๋ฆฌ๋จผํŠธ๋Š” ์ด๋™๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.
<ul>
  <li key="3">third</li>
  <li key="1">first</li>
  <li key="2">second</li>
</ul>

์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค๋Š” key๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐฑ์‹ ๋˜๊ณ  ์žฌ์‚ฌ์šฉ๋œ๋‹ค.

๊ณ ๋ ค์‚ฌํ•ญ

React๋Š” ํ•ญ์ƒ ์ „์ฒด ์•ฑ์„ ์žฌ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ถœ๋ ฅ๋˜๋Š” ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ ๊ฐ™๋‹ค. ์žฌ๋ Œ๋”๋ง์€ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์˜ render()์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด์ง€ React๊ฐ€ ์–ธ๋งˆ์šดํŠธ์‹œํ‚ค๊ณ  ๋‹ค์‹œ ๋งˆ์šดํŠธ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์ฆ‰, ๋ Œ๋”๋ง ์ „ํ›„์— ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

React๋Š” ํœด๋ฆฌ์Šคํ‹ฑ์— ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํœด๋ฆฌ์Šคํ‹ฑ์ด ๊ธฐ๋ฐ˜ํ•˜๊ณ  ์žˆ๋Š” ๊ฐ€์ •์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค.

  1. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ ํƒ€์ž…์„ ๊ฐ–๋Š” ์ข…์† ํŠธ๋ฆฌ๋“ค์˜ ์ผ์น˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š๋Š”๋‹ค.
  2. key๋Š” ๋ฐ˜๋“œ์‹œ ๋ณ€ํ•˜์ง€ ์•Š๊ณ , ์˜ˆ์ƒ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์œ ์ผํ•ด์•ผํ•œ๋‹ค.

๐Ÿ”ฅ ๋Š๋‚€์ 

"์žฌ๋ Œ๋”๋ง์€ React๊ฐ€ ์–ธ๋งˆ์šดํŠธ ์‹œํ‚ค๊ณ  ๋‹ค์‹œ ์–ธ๋งˆ์šดํŠธ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค." ๋ Œ๋”๋ง ์ „ํ›„์— ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค!
์ด ๊ฐœ๋…์ด ์ž ๊น ํ๋ ค์กŒ๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ ํ™•์‹คํžˆ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.

Refer

profile
๋งค ์ˆœ๊ฐ„ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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