Skip to content

Latest commit

ย 

History

History
196 lines (153 loc) ยท 10.7 KB

StateManagement.md

File metadata and controls

196 lines (153 loc) ยท 10.7 KB

React์—์„œ ์ƒํƒœ๋ž€?

  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ์ด๋™๋˜๋Š” props์™€ ๋‹ฌ๋ฆฌ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด
  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™”๋ฉด ๋ Œ๋”๋ง์— ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค
  • ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐ๋ž™์…˜์„ ํ†ตํ•ด ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ

๊ด€๋ฆฌ ํ•ด์•ผ ํ•˜๋Š” ์ƒํƒœ์˜ ๊ธฐ์ค€์€?

  • ์„œ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ!

๊ทธ๋Ÿผ ์ด๋Ÿด ๋• ์ƒํƒœ๋ฅผ ์™œ ๊ด€๋ฆฌํ•ด์ค˜์•ผ ํ•˜๋‚˜์š”

  • ์„œ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•, ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ์ถœ์ฒ˜๊ฐ€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ์„œ๋กœ์˜ ๋ณ€ํ™”์— ๋™์ ์œผ๋กœ ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ฆ‰ ์ƒํƒœ์˜ ์ผ๊ด€์„ฑ (=โ€๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑโ€)์„ ์ž˜ ์ง€์ผœ์•ผํ•œ๋‹ค.
  • โ€œSingle Source of Truthโ€์ด๋ผ๋Š” ๋ฐฉ๋ฒ•๋ก ์ด ์ด๋Ÿฌํ•œ ์ƒํƒœ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๋ฐฉ๋ฒ•๋ก ์ธ๋ฐ, ๋ง๊ทธ๋Œ€๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ์ถœ์ฒ˜๋ฅผ ๋งํ•œ๋‹ค. ์ด ๋ฐฉ๋ฒ•๋ก ์ด React๊ฐ€ ํƒํ•œ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ, ๊ฒฐ๊ตญ React์—์„œ ์ƒํƒœ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์œ„ํ•ด์„œ, ์„œ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ๋ถ„ํฌ๋˜์–ด์žˆ๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋กœ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ด€๋ฆฌํ•ด์ฃผ๊ธฐ ์œ„ํ•จ์ด๋‹ค.

์ƒํƒœ์˜ ์ข…๋ฅ˜

  • ์ง€์—ญ ์ƒํƒœ : ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ๋งŒ ๊ด€๋ฆฌ๋˜๋Š” ์ƒํƒœ
    • ex) Input์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒฝ์šฐ
  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ƒํƒœ : ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„˜๋‚˜๋“ค๋ฉฐ ๊ด€๋ฆฌ๋˜๋Š” ์ƒํƒœ
    • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ prop๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•œ๋‹ค โ†’ ์—ฐ์†๋  ๊ฒฝ์šฐ โ€œProp Drillingโ€
    • ex) Modal์ฐฝ
  • ์ „์—ญ ์ƒํƒœ : ํ”„๋กœ์ ํŠธ ์ „์ฒด์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ์ƒํƒœ

Prop Drilling?

  • props๋ฅผ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑฐ์น˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.
  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ โ†’ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ1 โ†’ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ 2โ†’ โ€ฆ โ†’ ์ตœ์ข… ์ปดํฌ๋„ŒํŠธ
  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ตœ์ข… ์ปดํฌ๋„ŒํŠธ๋กœ props๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฑฐ์นœ๋‹ค.
  • ์ด depth๊ฐ€ ๊นŠ์–ด์งˆ ์ˆ˜๋ก ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์กฐ๊ฑด Prop Drilling์œผ๋กœ props๋“ค์„ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฑฐ์น˜๋„๋ก ํ•˜์ง€ ์•Š๊ณ  ๋ณ„๋„์˜ ์ƒํƒœ๊ด€๋ฆฌ๊ฐ€ ๊ผญ ํ•„์š”ํ•˜๋‹ค.

์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„์„

1. Context API

  • ๋ฆฌ์•กํŠธ์˜ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋‚ด์—์„œ ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•
  • ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ props๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š๊ณ ๋„ ์ตœ์ข… ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค (prop drilling ๋ฐฉ์ง€)
  • ๊ตฌ์„ฑ์š”์†Œ
    • Context : ์ „์—ญ ์ƒํƒœ ์ €์žฅ์†Œ.
      • Context์— Provider์™€ Consumer๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ์Œ
      • Consumer์—๋Š” Context๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • Provider : ์ „์—ญ ์ƒํƒœ ์ œ๊ณต์ž.
      • ์ €์žฅ์†Œ์ธ Context์— ์ƒํƒœ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•จ
      • ์ƒํƒœ๋ฅผ ์ œ๊ณต๋ฐ›๊ณ ์ž ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” Provider ํ•˜์œ„์— ์žˆ์–ด์•ผํ•จ
      • ๋”ฐ๋ผ์„œ ์ „์—ญ ์ƒํƒœ๋กœ ์“ธ ๊ฒฝ์šฐ, Provider๋Š” App.jsx๊ฐ™์€ ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋œ๋‹ค.
    • Consumer : ์ „์—ญ ์ƒํƒœ ์‚ฌ์šฉ์ž
  • ๋‹จ์  :
    • ๋ฒ”์œ„๋ฅผ ์ž˜ ์ •์˜ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ์ผ์œผํ‚จ๋‹ค

2. Redux

  • ์ค‘์•™ ์ง‘์ค‘์‹ Storage์™€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ Reducer๋ฅผ ์‚ฌ์šฉํ•จ

  • ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋”ฐ๋ฅธ๋‹ค.

  • ์žฅ์  :

    • ์˜ค๋ž˜๋œ ๋งŒํผ ํƒ„ํƒ„ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๊ฐœ๋ฐœ์ž ํ’€ ์กด์žฌ
    • ๊ฐœ๋ฐœ์„ ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๊ต‰์žฅํžˆ ๋‹ค์–‘ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ฐœ๋ฐœ ์ค‘์— ์žˆ์–ด์„œ๋„ ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ธธ ๊ฒฝ์šฐ ํ•ด๊ฒฐํ•˜๊ธฐ๊ฐ€ ์‰ฌ์›€
    • ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ, ๋กœ๊ทธ ์ž‘์—… ๋“ฑ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด ๋•Œ Redux๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
    • ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋”ฐ๋ผ์„œ Reducer ๋“ฑ์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๋น„๊ต์  ์‰ฌ์›€
  • ๋‹จ์  :

    ๋Œ€๋ถ€๋ถ„ ๊ตฌ์กฐ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€

    • ๊ฐ„๋‹จํ•œ ์›น์•ฑ์„ ๋งŒ๋“ค ๋•Œ์—๋„ Action, Reducer, Action Creator ๋“ฑ์˜ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ž‘์„ฑํ•ด์•ผ ํ•จ.
    • Recoil, MobX์™€๋Š” ๋‹ฌ๋ฆฌ State๊ฐ€ ๋ณ€๊ฒฝ ๋  ๋•Œ Component๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋Š” ๋ฐ˜์‘ํ˜• ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํƒ‘์žฌ๋˜์ง€ ์•Š์•„์„œ React์˜ ์ž์ฒด ๋ฉ”์ปคํ‹ฐ์ฆ˜์„ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€์ ์ธ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

3. Recoil

  • ๋น„๊ต์  ์ตœ๊ทผ์— ๋‚˜์˜จ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • Facebook์‚ฌ์—์„œ ๊ฐœ๋ฐœ
  • ๊ฐ€์žฅ React์Šค๋Ÿฌ์šด ์ƒํƒœ๊ด€๋ฆฌ๋ผ๋Š” ์ฒ ํ•™์„ ๊ฐ–๊ณ ์žˆ์Œ
  • ์žฅ์  :
    • Redux, MobX์— ๋น„ํ•ด ๋” ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ ธ์„œ ์ดˆ์‹ฌ์ž๊ฐ€ ์‹œ์ž‘ํ•˜๊ธฐ์— ์ ๋‹นํ•˜๋ฉฐ, ์ž‘์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ๊ณผ๋„ํ•œ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ
    • component๊ฐ€ ๋ Œ๋”๋ง ๋˜๋Š” ์‹œ๊ธฐ, ์ƒํƒœ ๋“ฑ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ด ๊ฐ€๋Šฅ (์„ฑ๋Šฅ ์ตœ์ ํ™” ๋“ฑ์—๋„ ํ™œ์šฉ ๊ฐ€๋Šฅ)
    • Redux์™€๋Š” ๋‹ฌ๋ฆฌ Reactive ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํƒ‘์žฌํ•˜๊ณ  ์žˆ๊ธฐ์—, ๋™์ ์ธ ๊ธฐ๋Šฅ์„ ์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
  • ๋‹จ์  :
    • ์ตœ์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค ๋ณด๋‹ˆ, ์‚ฌ์šฉ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋น„๊ต์  ๋นˆ์•ฝํ•จ โ†’ ์ด์Šˆ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ, ํ™€๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธธ ์ˆ˜๋„.
    • Recoil์˜ ์ƒํƒœ๊ด€๋ฆฌ ์ž์ฒด๊ฐ€ ๊ต‰์žฅํžˆ ์„ธ๋ถ„ํ™” ๋˜์–ด ์žˆ๊ธฐ์— ์ดˆ์‹ฌ์ž๊ฐ€ ์‹œ์ž‘ํ•˜๊ธฐ์—” ์‰ฝ๋”๋ผ๋„, ๋””๋ฒ„๊น… ํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ์— ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

4. MobX

  • Redux์˜ ์—ฌ๋Ÿฌ ์ ์„ ๋ณด์™„ํ•˜์—ฌ ๋‚˜์˜จ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • Redux๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ด๋ฉฐ, Immutable.js ์™€ ๊ฐ™์€ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตณ์ด ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ํŠน์ง•
  • ์žฅ์  :
    • Redux์— ๋น„ํ•ด ์ „์ฒด์ ์œผ๋กœ ์กฐ๊ธˆ ๋” ์‰ฌ์šด ๋Ÿฌ๋‹์ปค๋ธŒ๋ฅผ ๊ฐ€์ง
    • ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ด๊ณ  ์บก์Šํ™”๋ฅผ ์ง€์›ํ•˜๊ธฐ์— ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ ํŽธ
    • Redux์—์„œ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๋ฐ˜์‘ํ˜• ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜๊ธฐ์— ์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ๋™์  ์›น์•ฑ ์ œ์ž‘ ๊ฐ€๋Šฅ
  • ๋‹จ์  :
    • ์›น์•ฑ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด์„œ ๋กœ์ง์ด MobX์˜ ์ž๋™ ์—…๋ฐ์ดํŠธ์— ์˜์กดํ•˜๊ธฐ์— ๋””๋ฒ„๊น…์ด ์กฐ๊ธˆ ๋” ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Œ
    • Redux ๋งŒํผ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํฌ์ง€ ์•Š์Œ
    • Validation ๊ตฌํ˜„์— ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๋ฒˆ์žก์Šค๋Ÿฝ๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ์Œ

๋ฆฌ์•กํŠธ ๋ Œ๋”๋ง์„ ๊ด€๋ฆฌํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

1. useMemo

  • useMemo๋Š” ์ข…์† ๋ณ€์ˆ˜๋“ค์ด ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉด ํ•จ์ˆ˜๋ฅผ ๊ตณ์ด ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ด์ „์— ๋ฐ˜ํ™˜ํ•œ ์ฐธ์กฐ๊ฐ’์„ ์žฌ์‚ฌ์šฉ ํ•œ๋‹ค.
  • ์ฆ‰, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ๊ฐ„๋„ ์„ธ์ด๋ธŒํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฐ™์€ ๊ฐ’์„ props๋กœ ๋ฐ›๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง๋„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. React.memo ์ปดํฌ๋„ŒํŠธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜

  • React hook์ด ์•„๋‹ˆ๋ผ์„œ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • React.memo๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ์˜ props๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋ฆฌ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•˜์—ฌ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜๋„ ์žˆ๋‹ค

3. useCallback

  • useMemo๊ฐ€ ๋ฆฌํ„ด๋˜๋Š” ๊ฐ’์„ memoize ์‹œ์ผœ์ฃผ์—ˆ๋Š”๋ฐ, useMemo์™€ ๋น„์Šทํ•œ useCallback์€ย ํ•จ์ˆ˜ ์„ ์–ธ์„ memoize ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค
  • useCallback์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ด์ฃผ๋ฉด, ์ข…์† ๋ณ€์ˆ˜๋“ค์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ๊ตณ์ด ํ•จ์ˆ˜๋ฅผ ์žฌ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ด์ „์— ์žˆ๋˜ ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— props๋กœ ์ „๋‹ฌํ•˜์—ฌ, ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋„ props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ธ์ง€ํ•˜๊ฒŒ ๋˜์–ด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

4. ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ props๋กœ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ค„ ๊ฒฝ์šฐ ๋ณ€ํ˜•ํ•˜์ง€๋ง๊ณ  ๋„˜๊ฒจ์ฃผ๊ธฐ

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

5. ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งคํ•‘ํ•  ๋•Œ์—๋Š” key๊ฐ’์œผ๋กœ index๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ๋ฆฌ์•กํŠธ์—์„œ ๋งคํ•‘์„ ํ• ๋•Œ ๋ฐ˜๋“œ์‹œ ๊ณ ์œ  key๋ฅผ ๋ถ€์—ฌํ•˜๋„๋ก ๊ฐ•์ œํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋ฐฐ์—ด์˜ index๊ฐ’์œผ๋กœ key๊ฐ’์„ ๋ถ€์—ฌํ•˜๋ฉด ์ข‹์ง€ ์•Š๋‹ค.
  • ์™œ๋ƒํ•˜๋ฉด, ์–ด๋–ค ๋ฐฐ์—ด์— ์ค‘๊ฐ„์— ์–ด๋–ค ์š”์†Œ๊ฐ€ ์‚ฝ์ž…๋ ๋•Œ ๊ทธ ์ค‘๊ฐ„ ์ดํ›„์— ์œ„์น˜ํ•œ ์š”์†Œ๋“ค์€ ์ „๋ถ€ index๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • ์ด๋กœ ์ธํ•ด key๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด React๋Š” key๊ฐ€ ๋™์ผ ํ•  ๊ฒฝ์šฐ, ๋™์ผํ•œ DOM Element๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋˜ํ•œ, ๋ฐ์ดํ„ฐ๊ฐ€ key์™€ ๋งค์น˜๊ฐ€ ์•ˆ๋˜์–ด ์„œ๋กœ ๊ผฌ์ด๋Š” ๋ถ€์ž‘์šฉ๋„ ๋ฐœ์ƒํ•œ๋‹ค.

6. useState์˜ ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ

  • setState๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ๋Š” ๋Œ€์‹ , ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ์ •์˜ํ•ด ์ฃผ๋Š” ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์„ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ,

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด useCallback์„ ์‚ฌ์šฉํ•  ๋•Œ ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ๋Š” ๋ฐฐ์—ด์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

// ์˜ˆ์‹œ) ์‚ญ์ œ ํ•จ์ˆ˜ 
const onRemove = useCallback(
  id => {
    setTodos(todos.filter(todo => todo.id !== id));
  },
  [todos],
);

// ์˜ˆ์‹œ) ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ ํ›„
const onRemove = useCallback(id => {
  setTodos(todos => todos.filter(todo => todo.id !== id));
}, []);

7. Input์— onChange ์ตœ์ ํ™”

  • ๋ณดํ†ต input ํƒœ๊ทธ์— onChange ์ด๋ฒคํŠธ๋ฅผ ์ค„๋•Œ ํƒ€์ดํ•‘์„ ํ• ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋˜์–ด, ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ๋งŽ์ด ์ฐพ๊ณคํ•œ๋‹ค.
  • lodash ๋ผ๊ณ  ์ตœ์ ํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ๊ธฐ๋„ ํ•˜๋Š”๋ฐ, ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  ์ตœ์ ํ™” ์‹œํ‚ฌ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
// ์˜ˆ์‹œ) ์ตœ์ ํ™” ์ „(X)
//UserList.jsx
function UserList() {
 {...}
  return (
      <div>
       <input
         type="text"
         value={text}
         placeholder="์•„๋ฌด ๋‚ด์šฉ์ด๋‚˜ ์ž…๋ ฅํ•˜์„ธ์š”."
         onChange={(event) => setText(event.target.value)}
        />
   {...}
      </div>
  );
}

export default UserList;

// ์˜ˆ์‹œ) ์ตœ์ ํ™” ํ›„(O)
//UserList.jsx
function UserList() {
 {...}
  return (
      <div>
       <input
          ref={searchRef}
          type="text"
          placeholder="์•„๋ฌด ๋‚ด์šฉ์ด๋‚˜ ์ž…๋ ฅํ•˜์„ธ์š”."
          onKeyUp={() => {
            let searchQuery = searchRef.current.value.toLowerCase();
            setTimeout(() => {
              if (searchQuery === searchRef.current.value.toLowerCase()) {
                setText(searchQuery);
              }
            }, 400);
          }}
        />
   {...}
      </div>
  );
}

export default UserList;