useDebugValue๋Š” React DevTools์—์„œ ์ปค์Šคํ…€ ํ›…์— ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” React Hook์ž…๋‹ˆ๋‹ค.

useDebugValue(value, format?)

๋ ˆํผ๋Ÿฐ์Šค

useDebugValue(value, format?)

์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋””๋ฒ„๊ทธ ๊ฐ’์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ปค์Šคํ…€ Hook์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ useDebugValue๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”.

import { useDebugValue } from 'react';

function useOnlineStatus() {
// ...
useDebugValue(isOnline ? 'Online' : 'Offline');
// ...
}

์•„๋ž˜์—์„œ ๋” ๋งŽ์€ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

๋งค๊ฐœ๋ณ€์ˆ˜

  • value: React DevTools์— ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์€ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ํƒ€์ž…์ด๋“  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ ํƒ์‚ฌํ•ญ format: ํฌ๋งทํŒ… ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฒ€์‚ฌ๋  ๋•Œ, React DevTools๋Š” value๋ฅผ ์ธ์ž๋กœ ํฌ๋งทํŒ… ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ํฌ๋งทํŒ… ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ํฌ๋งทํŒ… ๋œ ๊ฐ’์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. (ํฌ๋งทํŒ… ๋œ ๊ฐ’์€ ์–ด๋–ค ํƒ€์ž…์ด๋“  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ํฌ๋งทํŒ… ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, ์›๋ž˜์˜ value๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

useDebugValue๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

์ปค์Šคํ…€ Hook์— ๋ผ๋ฒจ ์ถ”๊ฐ€ํ•˜๊ธฐ

์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋””๋ฒ„๊ทธ ๊ฐ’์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ปค์Šคํ…€ Hook์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ useDebugValue๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”.

import { useDebugValue } from 'react';

function useOnlineStatus() {
// ...
useDebugValue(isOnline ? 'Online' : 'Offline');
// ...
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด useOnlineStatus๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฒ€์‚ฌํ•  ๋•Œ, OnlineStatus: "Online"์™€ ๊ฐ™์€ ๋ผ๋ฒจ์ด ๋ถ™์Šต๋‹ˆ๋‹ค.

๋””๋ฒ„๊ทธ ๊ฐ’์ด ํ‘œ์‹œ๋œ React DevTools์˜ ์Šคํฌ๋ฆฐ์ƒท

useDebugValue๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด, ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ(์ด ์˜ˆ์‹œ์—์„œ๋Š” true)๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

import { useSyncExternalStore, useDebugValue } from 'react';

export function useOnlineStatus() {
  const isOnline = useSyncExternalStore(subscribe, () => navigator.onLine, () => true);
  useDebugValue(isOnline ? 'Online' : 'Offline');
  return isOnline;
}

function subscribe(callback) {
  window.addEventListener('online', callback);
  window.addEventListener('offline', callback);
  return () => {
    window.removeEventListener('online', callback);
    window.removeEventListener('offline', callback);
  };
}

์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!

๋ชจ๋“  ์ปค์Šคํ…€ Hook์— ๋””๋ฒ„๊ทธ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€์ด๊ณ  ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•˜์—ฌ ๊ฒ€์‚ฌํ•˜๊ธฐ ์–ด๋ ค์šด ์ปค์Šคํ…€ Hook์— ๊ฐ€์žฅ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.


๋””๋ฒ„๊ทธ ๊ฐ’์˜ ํฌ๋งทํŒ… ์ง€์—ฐํ•˜๊ธฐ

useDebugValue์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ํฌ๋งทํŒ… ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

useDebugValue(date, date => date.toDateString());

ํฌ๋งทํŒ… ํ•จ์ˆ˜๋Š” ๋””๋ฒ„๊ทธ ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›๊ณ , ํฌ๋งทํŒ…๋œ ํ‘œ์‹œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฒ€์‚ฌ๋  ๋•Œ, React DevTools๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹ค์ œ๋กœ ๊ฒ€์‚ฌ๋  ๋•Œ๊นŒ์ง€ ๋†’์€ ๋น„์šฉ์ด ๋“ค ์ˆ˜ ์žˆ๋Š” ํฌ๋งทํŒ… ๋กœ์ง์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, date๊ฐ€ Date ๊ฐ’์ด๋ผ๋ฉด, ์ด๋Š” ๋ Œ๋”๋ง๋งˆ๋‹ค toDateString()์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.