Custom Hooks

1. Custom Hooks์ด๋ž€?

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์Šค์Šค๋กœ ์ปค์Šคํ…€ํ•œ ํ›…์„ ์˜๋ฏธ

  • ์ด๋ฅผ ์ด์šฉํ•ด ๋ฐ˜๋ณต๋˜๋Š” ๋กœ์ง์„ ํ•จ์ˆ˜๋กœ ๋ฝ‘์•„๋‚ด์–ด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ

(1) Custom Hooks์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

  • ์—ฌ๋Ÿฌ url์„ fetchํ•  ๋•Œ,

  • ์—ฌ๋Ÿฌ input์— ์˜ํ•œ ์ƒํƒœ ๋ณ€๊ฒฝ ๋“ฑ ๋ฐ˜๋ณต๋˜๋Š” ๋กœ์ง์„ ๋™์ผํ•œ ํ•จ์ˆ˜์—์„œ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ.

(2) Custom Hooks์˜ ์žฅ์ 

  • ์ƒํƒœ๊ด€๋ฆฌ ๋กœ์ง์˜ ์žฌํ™œ์šฉ์ด ๊ฐ€๋Šฅ

  • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ณด๋‹ค ์ ์€ ์–‘์˜ ์ฝ”๋“œ๋กœ ๋™์ผํ•œ ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ

  • ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๋‹ค ๋ช…๋ฃŒํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Œ (e.g. useSomething)

2. Custom Hooks ์‚ฌ์šฉ ์˜ˆ์‹œ

  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด,

      // FriendStatus : ์นœ๊ตฌ๊ฐ€ online์ธ์ง€ offline์ธ์ง€ returnํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ
      function FriendStatus(props) {
      const [isOnline, setIsOnline] = useState(null);
      useEffect(() => {
          function handleStatusChange(status) {
          setIsOnline(status.isOnline);
          }
          ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
          return () => {
          ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
          };
      });
    
      if (isOnline === null) {
          return 'Loading...';
      }
      return isOnline ? 'Online' : 'Offline';
      }
    
      // FriendListItem : ์นœ๊ตฌ๊ฐ€ online์ผ ๋•Œ ์ดˆ๋ก์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ
      function FriendListItem(props) {
      const [isOnline, setIsOnline] = useState(null);
      useEffect(() => {
          function handleStatusChange(status) {
          setIsOnline(status.isOnline);
          }
          ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
          return () => {
          ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
          };
      });
    
      return (
          <li style={{ color: isOnline ? 'green' : 'black' }}>
          {props.friend.name}
          </li>
      );
      }
  • ๋‘ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ํ•จ์ˆ˜ useFriendStatus ์‚ฌ์šฉ โ†’ Custom Hook์„ ์ •์˜ํ•  ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทœ์น™์ด ํ•„์š”

    • (1) Custom Hook์„ ์ •์˜ํ•  ๋•Œ๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„ ์•ž์— use๋ฅผ ๋ถ™์ด๊ธฐ

    • (2) ๋Œ€๊ฐœ์˜ ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ ๋‚ด์˜ hooks ๋””๋ ‰ํ† ๋ฆฌ์— Custom Hook์„ ์œ„์น˜์‹œํ‚ค๊ธฐ

    • (3) Custom Hook์œผ๋กœ ๋งŒ๋“ค ๋•Œ ํ•จ์ˆ˜๋Š” ์กฐ๊ฑด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ์–ด์•ผ ํ•จ. ์ฆ‰ return ํ•˜๋Š” ๊ฐ’์€ ์กฐ๊ฑด๋ถ€์—ฌ์„œ๋Š” ์•ˆ ๋จ. ๋•Œ๋ฌธ์— ์œ„์˜ ์ด useFriendStatus Hook์€ ์˜จ๋ผ์ธ ์ƒํƒœ์˜ ์—ฌ๋ถ€๋ฅผ boolean ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ์Œ.

  • ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ Custom Hook์€ Hook ๋‚ด๋ถ€์— useState์™€ ๊ฐ™์€ React ๋‚ด์žฅ Hook์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ ๊ฐ€๋Šฅ

  • ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” React ๋‚ด์žฅ Hook์„ ๋ถˆ๋Ÿฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ Custom Hook์—์„œ๋Š” ๊ฐ€๋Šฅํ•จ.

  • useFriendStatus Hook์„ ๋‘ ์ปดํฌ๋„ŒํŠธ์— ์ ์šฉํ•œ ์ฝ”๋“œ

    function FriendStatus(props) {
        const isOnline = useFriendStatus(props.friend.id); // useFriendStatus Hook ์ ์šฉ
    
        if (isOnline === null) {
            return 'Loading...';
        }
        return isOnline ? 'Online' : 'Offline';
    }
    
    function FriendListItem(props) {
        const isOnline = useFriendStatus(props.friend.id);
    
        return (
            <li style={{ color: isOnline ? 'green' : 'black' }}>
                {props.friend.name}
            </li>
        );
    }
  • ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด Custom Hook์œผ๋กœ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ์ปดํฌ๋„ŒํŠธ๋Š” ๋” ์ง๊ด€์ ์œผ๋กœ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ด์ง.

  • ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ™์€ Custom Hook์„ ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ๋‘ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ™์€ state๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜. ๊ทธ์ € ๋กœ์ง๋งŒ ๊ณต์œ ํ•  ๋ฟ, state๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ์Œ.

Last updated