We want to hear from you!Take our 2021 Community Survey!
This site is no longer updated.Go to react.dev

์ž์‹ ๋งŒ์˜ Hook ๋งŒ๋“ค๊ธฐ

These docs are old and wonโ€™t be updated. Go to react.dev for the new React docs.

These new documentation pages teach modern React and include live examples:

Hook์€ React 16.8 ๋ฒ„์ „์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Hook์€ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ state์™€ ๊ฐ™์€ ํŠน์ง•๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์‹ ๋งŒ์˜ Hook์„ ๋งŒ๋“ค๋ฉด ์ปดํฌ๋„ŒํŠธ ๋กœ์ง์„ ํ•จ์ˆ˜๋กœ ๋ฝ‘์•„๋‚ด์–ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Effect Hook ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐฐ์šธ ๋•Œ, ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์นœ๊ตฌ๊ฐ€ ์˜จ๋ผ์ธ ์ƒํƒœ์ธ์ง€ ์•„๋‹Œ์ง€์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

import React, { useState, useEffect } from 'react';

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 ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ๋ถ™์—ฌ๋„ฃ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

import React, { useState, useEffect } from 'react';

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>
  );
}

๊ทธ ๋Œ€์‹  ์ด ๋กœ์ง์„ FriendStatus์™€ FriendListItem์—์„œ ๊ณต์œ ํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

React์—๋Š” ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง์„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ณต์œ ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ „ํ†ต์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ render props์™€ ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. Hook์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋”ํ•˜์ง€ ์•Š๊ณ  ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ Hook ์ถ”์ถœํ•˜๊ธฐ

๋‘ ๊ฐœ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์—์„œ ๊ฐ™์€ ๋กœ์ง์„ ๊ณต์œ ํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์™€ Hook ๋˜ํ•œ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์‚ฌ์šฉ์ž ์ •์˜ Hook์€ ์ด๋ฆ„์ด use๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž Hook์€ ๋‹ค๋ฅธ Hook์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, ์•„๋ž˜์˜ useFriendStatus๊ฐ€ ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ์‚ฌ์šฉ์ž ์ •์˜ Hook์ž…๋‹ˆ๋‹ค.

import { useState, useEffect } from 'react';

function useFriendStatus(friendID) {  const [isOnline, setIsOnline] = useState(null);

  useEffect(() => {
    function handleStatusChange(status) {
      setIsOnline(status.isOnline);
    }

    ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);
    return () => {
      ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);
    };
  });

  return isOnline;
}

๋”ฑํžˆ ์ƒˆ๋กœ์šด ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋กœ์ง์€ ์œ„์˜ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ๋ณต์‚ฌํ•ด์™”์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ปดํฌ๋„ŒํŠธ์—์„œ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ Hook๋“ค์€ ์‚ฌ์šฉ์ž Hook์˜ ์œ„๋กœ ๋†“์—ฌ์•ผ ํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ์ •์˜ Hook์€ ์กฐ๊ฑด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

useFriendStatus Hook์˜ ๋ชฉํ‘œ๋Š” ์นœ๊ตฌ์˜ ์ƒํƒœ๋ฅผ ๊ตฌ๋…ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•˜์—ฌ friendID๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›๊ณ  ์˜จ๋ผ์ธ ์ƒํƒœ์˜ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

function useFriendStatus(friendID) {
  const [isOnline, setIsOnline] = useState(null);

  // ...

  return isOnline;
}

์ด์ œ ์‚ฌ์šฉ์ž ์ •์˜ Hook์„ ์–ด๋–ป๊ฒŒ ์ด์šฉํ•˜๋Š”์ง€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ Hook ์ด์šฉํ•˜๊ธฐ

์ฒ˜์Œ ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” FriendStatus์™€ FriendListItem ์ปดํฌ๋„ŒํŠธ์— ์ค‘๋ณต๋˜์–ด์žˆ๋Š” ๋กœ์ง์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ์ปดํฌ๋„ŒํŠธ ๋ชจ๋‘ ์นœ๊ตฌ์˜ ์˜จ๋ผ์ธ ์ƒํƒœ ์—ฌ๋ถ€๋ฅผ ์•Œ์•„์•ผ ํ•˜์ฃ .

์ด์ œ ์ด ๋กœ์ง์„ useFriendStatus hook์œผ๋กœ ๋ฝ‘์•„๋‚ด์—ˆ์œผ๋‹ˆ, ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function FriendStatus(props) {
  const isOnline = useFriendStatus(props.friend.id);
  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>
  );
}

๋ณธ๋ž˜์˜ ์˜ˆ์‹œ์™€ ๋™์ผํ•œ ์ฝ”๋“œ์ธ๊ฐ€์š”? ๋„ค ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํžˆ ๋ณด๋ฉด ์ž‘๋™๋ฐฉ์‹์— ์–ด๋–ค ๋ณ€ํ™”๋„ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋€ ๊ฒƒ์€ ์˜ค๋กœ์ง€ ๊ณตํ†ต์˜ ์ฝ”๋“œ๋ฅผ ๋ฝ‘์•„๋‚ด ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋กœ ๋งŒ๋“  ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ Hook์€ React์˜ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์ด๋ผ๊ธฐ๋ณด๋‹ค ๊ธฐ๋ณธ์ ์œผ๋กœ Hook์˜ ๋””์ž์ธ์„ ๋”ฐ๋ฅด๋Š” ๊ด€์Šต์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ Hook์˜ ์ด๋ฆ„์€ โ€œuseโ€๋กœ ์‹œ์ž‘๋˜์–ด์•ผ ํ•˜๋‚˜์š”? ๋„ค ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ด ๊ด€์Šต์€ ์•„์ฃผ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š์œผ๋ฉด ํŠน์ •ํ•œ ํ•จ์ˆ˜๊ฐ€ ๊ทธ ์•ˆ์—์„œ Hook์„ ํ˜ธ์ถœํ•˜๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— Hook ๊ทœ์น™์˜ ์œ„๋ฐ˜ ์—ฌ๋ถ€๋ฅผ ์ž๋™์œผ๋กœ ์ฒดํฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ Hook์„ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” state๋ฅผ ๊ณต์œ ํ•˜๋‚˜์š”? ์•„๋‹ˆ์š”. ์‚ฌ์šฉ์ž ์ •์˜ Hook์€ ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง(๊ตฌ๋…์„ ์„ค์ •ํ•˜๊ณ  ํ˜„์žฌ ๋ณ€์ˆซ๊ฐ’์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ)์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด์ง€๋งŒ ์‚ฌ์šฉ์ž Hook์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ ์•ˆ์˜ state์™€ effect๋Š” ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ Hook์€ ์–ด๋–ป๊ฒŒ ๋…๋ฆฝ๋œ state๋ฅผ ์–ป๋Š” ๊ฑด๊ฐ€์š”? ๊ฐ๊ฐ์˜ Hook์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ์„œ๋กœ ๋…๋ฆฝ๋œ state๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. useFriendStatus๋ฅผ ์ง์ ‘์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— React์˜ ๊ด€์ ์—์„œ ์ด ์ปดํฌ๋„ŒํŠธ๋Š” useState์™€ useEffect๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒƒ๊ณผ ๋‹ค๋ฆ„์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์šฐ๋ฆฌ๊ฐ€ ์ด์ „์— ๋ฐฐ์› ๋“ฏ์ด, ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ useState์™€ useEffect๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๊ณ  ์ด๋“ค์€ ๋ชจ๋‘ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.

ํŒ: Hook์—์„œ Hook์œผ๋กœ ์ •๋ณด ์ „๋‹ฌํ•˜๊ธฐ

Hook์€ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— Hook ์‚ฌ์ด์—์„œ๋„ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒํ™ฉ์„ค๋ช…์„ ์œ„ํ•ด ์ฑ„ํŒ… ์˜ˆ์‹œ์— ์žˆ๋Š” ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์„ ํƒ๋œ ์นœ๊ตฌ๊ฐ€ ์˜จ๋ผ์ธ ์ƒํƒœ์ธ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ฑ„ํŒ… ์ˆ˜์‹ ์ž ์„ ํƒ๊ธฐ์ž…๋‹ˆ๋‹ค.

const friendList = [
  { id: 1, name: 'Phoebe' },
  { id: 2, name: 'Rachel' },
  { id: 3, name: 'Ross' },
];

function ChatRecipientPicker() {
  const [recipientID, setRecipientID] = useState(1);  const isRecipientOnline = useFriendStatus(recipientID);
  return (
    <>
      <Circle color={isRecipientOnline ? 'green' : 'red'} />      <select
        value={recipientID}
        onChange={e => setRecipientID(Number(e.target.value))}
      >
        {friendList.map(friend => (
          <option key={friend.id} value={friend.id}>
            {friend.name}
          </option>
        ))}
      </select>
    </>
  );
}

ํ˜„์žฌ ์„ ํƒ๋œ ์นœ๊ตฌ์˜ ID๋ฅผ recipientID state ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ <select> ์„ ํƒ๊ธฐ์— ์žˆ๋Š” ๋‹ค๋ฅธ ์นœ๊ตฌ๋ฅผ ์„ ํƒํ•˜๋ฉด ์ด๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

useState Hook ํ˜ธ์ถœ์€ recipientID state ๋ณ€์ˆ˜์˜ ์ตœ์‹ ๊ฐ’์„ ๋Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ useFriendStatus Hook์— ์ธ์ˆ˜๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  const [recipientID, setRecipientID] = useState(1);
  const isRecipientOnline = useFriendStatus(recipientID);

์ด๋ฅผ ํ†ตํ•ด ์ง€๊ธˆ ์„ ํƒ๋˜์–ด์žˆ๋Š” ์นœ๊ตฌ์˜ ์˜จ๋ผ์ธ ์ƒํƒœ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์นœ๊ตฌ๋ฅผ ์„ ํƒํ•˜๊ณ  recipientID state ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด useFriendStatus Hook์€ ์ด๋ฏธ ์„ ํƒ๋˜์–ด์žˆ๋Š” ์นœ๊ตฌ์˜ ๊ตฌ๋…์„ ํ•ด์ง€ํ•˜๊ณ  ์ƒˆ๋กœ์ด ์„ ํƒ๋œ ์นœ๊ตฌ์˜ ์ƒํƒœ๋ฅผ ๊ตฌ๋…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

useYourImagination()

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

๋„ˆ๋ฌด ์ด๋ฅธ ๋‹จ๊ณ„์—์„œ ๋กœ์ง์„ ๋ฝ‘์•„๋‚ด๋ ค๊ณ  ํ•˜์ง€๋Š” ์•Š๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ๋” ๋‹ค์–‘ํ•ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ์— ์žˆ๋Š” ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์˜ ๊ธธ์ด๋„ ๊ธธ์–ด์กŒ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ง€๊ทนํžˆ ํ‰๋ฒ”ํ•œ ์ผ์ด๋ฉฐ ์ง€๊ธˆ ๋ฐ”๋กœ Hook์œผ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ๋งŒ ํ•œ๋‹ค๊ณ  ๋А๋‚„ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋™์‹œ์— ์‚ฌ์šฉ์ž ์ •์˜ Hook์ด ๋ณต์žกํ•œ ๋กœ์ง์„ ๋‹จ์ˆœํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์†์— ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ฑฐ๋‚˜ ๋ณต์žกํ•˜๊ฒŒ ๋’ค์—‰ํ‚จ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ’€์–ด๋‚ด๋„๋ก ๋•๋Š” ๊ฒฝ์šฐ๋“ค์„ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, ๋‚ด๋ถ€์— ๋งŽ์€ state๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ์ง€๋งŒ, ์ด๊ฒƒ๋“ค์ด ์ ์ ˆํ•˜๊ฒŒ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. useState๋Š” ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ๋ชจ์•„์ฃผ๋Š” ๋ฐ์—๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์‹  Redux reducer์˜ ์ด์šฉ์„ ์„ ํ˜ธํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€์š”.

function todosReducer(state, action) {
  switch (action.type) {
    case 'add':
      return [...state, {
        text: action.text,
        completed: false
      }];
    // ... other actions ...
    default:
      return state;
  }
}

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

์ปดํฌ๋„ŒํŠธ์˜ ์•ˆ์˜ state๋ฅผ reducer๋กœ ๊ด€๋ฆฌํ•˜๋Š” useReducer Hook์„ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ์ด Hook์„ ๊ฐ„๋‹จํžˆ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

function useReducer(reducer, initialState) {
  const [state, setState] = useState(initialState);

  function dispatch(action) {
    const nextState = reducer(state, action);
    setState(nextState);
  }

  return [state, dispatch];
}

์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์ด Hook์„ ์‚ฌ์šฉํ•˜์—ฌ reducer๊ฐ€ state ๊ด€๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

function Todos() {
  const [todos, dispatch] = useReducer(todosReducer, []);
  function handleAddClick(text) {
    dispatch({ type: 'add', text });
  }

  // ...
}

๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋‚ด์—์„œ state๋ฅผ reducer๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ณดํŽธ์  ํ•„์š”์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ React์—๋Š” useReducer๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Hook API ์ฐธ๊ณ ์„œ์—์„œ ๋‹ค๋ฅธ ๋‚ด์žฅ Hook๊ณผ ํ•จ๊ป˜ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Is this page useful?Edit this page