1. ExternalStore

useState λ₯Ό μ œκ±°ν•˜μ—¬ μƒνƒœλ₯Ό κ΄€λ¦¬ν•΄λ³΄μž

Reactμ—μ„œλŠ” 일반적으둜 μ–΄λ–€ λ³€μˆ˜μ˜ 값이 λ³€ν™”ν•˜μ˜€μ„ λ•Œ(보톡 μœ μ €μ˜ μ‘°μž‘μœΌλ‘œ μΈν•œ), UI에 ν•΄λ‹Ή 값을 λ°˜μ˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” useStore λΌλŠ” Reactμ—μ„œ μ œκ³΅ν•˜λŠ” hook을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

κ·Έλ ‡μ§€ μ•Šκ³ , 일반적으둜 λ³€μˆ˜λ₯Ό μ •μ˜ν•œ 후에 μ–΄λ–€ μ΄λ²€νŠΈμ— λ”°λΌμ„œ 값을 λ³€ν™”μ‹œμΌ°μ„ λ•ŒλŠ” UI에 ν•΄λ‹Ή 값을 λ°˜μ˜ν•  수 μ—†λ‹€. λ³€κ²½λœ 값을 μΈμ‹ν•˜μ§€ λͺ»ν•˜κΈ° λ•Œλ¬Έμ—, λ¦¬λ Œλ”λ§λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.

Reactμ—μ„œλŠ” 둜컬 state, κ·ΈλŸ¬λ‹ˆκΉŒ λ³€μˆ˜μ˜ μƒνƒœλ₯Ό λ³€κ²½ν•΄μ„œλŠ” μ•ˆλ˜λ©°, useStateλ₯Ό μ‚¬μš©ν•˜κΈ°λ₯Ό ꢌμž₯ν•œλ‹€.

let count = 0;

export default function Counter() {
  const handleClick = () => {
    count += 1;
  };

  return (
    <div>
      <p>{count}</p>
      <button type='button' onClick={handleClick}>
        Increase
      </button>
    </div>
  );
}

λ³€κ²½λœ μƒνƒœμ˜ 값을 λ°˜μ˜ν•˜μ—¬, λ¦¬λ Œλ”λ§ λ˜λ„λ‘ ν•˜κΈ° μœ„ν•΄μ„œλŠ” useState λ₯Ό μ‚¬μš©ν•œλ‹€.


그러면 useStateλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ¦¬λ Œλ”λ§μ„ κ°•μ œν•˜μ—¬ UI에 λ°˜μ˜ν•  수 μžˆλŠ” 방법이 μžˆμ„κΉŒ? useReducerλ₯Ό μ‚¬μš©ν•˜λ©΄ κ°€λŠ₯ν•˜λ‹€.

λ²„νŠΌμ„ ν΄λ¦­ν–ˆμ„ λ•Œ μ¦κ°€ν•œ count 의 화면에 잘 반영이 λœλ‹€. ν₯미둜운 것은 useReducer 의 첫번째 인자둜 μ „λ‹¬λœ ν•¨μˆ˜μ—μ„œ ν•˜κ³ μžˆλŠ” 역할은 μ˜λ―Έκ°€ μ—†λ‹€λŠ” 것이닀. +1을 해도 되고, λΉˆλ¬Έμžμ—΄μ„ 더해도 λœλ‹€. 즉, μ—¬κΈ°μ„œ useReducer λŠ” μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” ν›…μœΌλ‘œμ¨λ§Œ μ‚¬μš©λœλ‹€λŠ” 점이닀.

참고둜 useState λŠ” λ‚΄λΆ€μ μœΌλ‘œ useReducerλ₯Ό μ‚¬μš©ν•œλ‹€.

그러면 λ‹€μ‹œ ν•œ 번 μ½”λ“œλ₯Ό 고쳐보자.

useReducerλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ , forceUpdateλΌλŠ” ν•¨μˆ˜ μ•ˆμ—μ„œ setState λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ—¬, κ°•μ œλ‘œ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ¦¬λ Œλ”λ§ μ‹œν‚¬μˆ˜λ„ μžˆλ‹€. 화면에 λ³΄μ΄λŠ” 값은 increase ν•¨μˆ˜μ—μ„œ μ²˜λ¦¬ν•œ μ¦κ°€λœ λ³€μˆ˜μ˜ 값이닀. forceUpdateλΌλŠ” ν•¨μˆ˜λ₯Ό Hook 으둜 λ§Œλ“€λ©΄ μ•„λž˜μ™€ 같은 λͺ¨μ–‘이 λœλ‹€.


μ΄λ ‡κ²Œ ν•˜λ©΄ Counter μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” 더이상 useState κ°€ ν•„μš”μ—†μ–΄μ§€κ³  μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ κ°€μ§€κ³  μžˆλŠ” 둜컬 λ³€μˆ˜λ₯Ό μ—…λ°μ΄νŠΈν•˜μ—¬ UI에 λ°˜μ˜ν•  수 μžˆλ‹€.

그런데 μ—¬κΈ°μ„œ λ¬Έμ œλŠ” ν›…μœΌλ‘œ λΆ„λ¦¬ν•œ useReducer 의 ν•¨μˆ˜ μΈμžμ—μ„œ 계속 setState ν•¨μˆ˜λ₯Ό ν†΅ν•΄μ„œ, μ˜λ―Έμ—†λŠ” κ°’μ˜ μ—…λ°μ΄νŠΈκ°€ λœλ‹€λŠ” 것이닀. μ—¬κΈ°μ„œ useReducer 의 역할은 λ‹¨μˆœνžˆ μ»΄ν¬λ„ŒνŠΈλ₯Ό κ°•μ œ λ¦¬λ Œλ”λ§ ν•˜λŠ” 것이고, useReducer 의 ν•¨μˆ˜ 인자 κ°’μ—μ„œ λ³€κ²½ν•˜κ³  μžˆλŠ” μƒνƒœλŠ” νŠΉλ³„ν•œ 일을 ν•˜λŠ” 것이 μ•„λ‹ˆλ‹€.

useForceUpdate λ₯Ό λ¦¬νŽ™ν† λ§ν•΄λ³΄μž.

useCallback 을 μ‚¬μš©ν•˜μ—¬, useCallback 의 첫번째 인자둜 μ „λ‹¬λœ ν•¨μˆ˜κ°€ 맀번 μƒˆλ‘œμš΄ ν•¨μˆ˜κ°€ μ•„λ‹ˆλ„λ‘ λ§Œλ“€μ–΄μ£Όμ—ˆλ‹€.

결과적으둜, μœ„μ˜ μ½”λ“œμ—μ„œλŠ” λΉ„μ§€λ‹ˆμŠ€ 둜직과 UI에 λŒ€ν•œ κ΄€μ‹¬μ‚¬μ˜ 뢄리가 μ΄λ£¨μ–΄μ‘Œλ‹€.

Last updated