๋ฐ˜์‘ํ˜•

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

 

์œ„ ๊ฐ™์€ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด useEffect์˜ ํด๋ฆฐ์—… ํ•จ์ˆ˜์— ํƒ€์ด๋จธ ํ•ด์ œ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ์—ฌ๋Ÿฌ ํƒ€์ด๋จธ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํƒ€์ด๋จธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋กœ์ง ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ์˜ ๋ณต์žก์„ฑ์ด ๋†’์•„์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

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

 

useTimeouts.ts ํ›… ์ •์˜ โ–ผ

type TimerID = NodeJS.Timeout;

export default function useTimeouts() {
  const timerIDs = useRef<Set<TimerID>>(new Set());

  const setTimer = (callback: () => void, delay: number) => {
    const id = setTimeout(callback, delay);
    timerIDs.current.add(id);
    return id;
  };

  const clearTimer = (id: TimerID) => {
    clearTimeout(id);
    timerIDs.current.delete(id);
  };

  const clearAllTimers = () => {
    timerIDs.current.forEach(clearTimeout);
    timerIDs.current.clear();
  };

  useEffect(() => {
    // ํ›…์„ ํ˜ธ์ถœํ•œ ์ปดํฌ๋„ŒํŠธ ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ์‹œ ๋“ฑ๋กํ•œ ๋ชจ๋“  ํƒ€์ด๋จธ ID ํ•ด์ œ
    return () => clearAllTimers();
  }, []);

  return { setTimer, clearTimer, clearAllTimers };
}

 

useTimeouts ์‚ฌ์šฉ ์˜ˆ์‹œ โ–ผ

const { setTimer, clearTimer, clearAllTimers } = useTimeouts();

const timerID = setTimer(() => { /* ... */ }, 500); // ํƒ€์ด๋จธ ์„ค์ •
clearTimer(timerID); // ํƒ€์ด๋จธ ์ˆ˜๋™ ํ•ด์ œ
clearAllTimers(); // ๋ชจ๋“  ํƒ€์ด๋จธ ์ˆ˜๋™ ํ•ด์ œ

 

๐Ÿ’ก React ํ›…์€ ๊ฐ ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ์ƒํƒœ ๊ณต๊ฐ„์„ ๊ฐ–๋Š”๋‹ค. ๋•Œ๋ฌธ์— A ์ปดํฌ๋„ŒํŠธ์™€ B ์ปดํฌ๋„ŒํŠธ์—์„œ useTimeouts๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ํ›… ๋‚ด๋ถ€์— ์žˆ๋Š” ์ƒํƒœ๋Š” ๋…๋ฆฝ์ ์ด๋‹ค.

๋ฐ˜์‘ํ˜•