Reactμ useDebugValue ν μ νμ©νμ¬ React κ°λ°μ λꡬμ λλ²κΉ κ²½νμ ν₯μμν€μΈμ. 컀μ€ν λ μ΄λΈκ³Ό ν¬λ§·ν°λ₯Ό λ§λ€μ΄ μ»΄ν¬λνΈ κ²μ¬λ₯Ό λ μ½κ² λ§λλ λ°©λ²μ μμ보μΈμ.
React useDebugValue: κ°λ° μν¬νλ‘μ° μ΄κ³ μμΌλ‘ ν₯μμν€κΈ°
λλ²κΉ
μ μννΈμ¨μ΄ κ°λ° μλͺ
μ£ΌκΈ°μ νμμ μΈ λΆλΆμ
λλ€. Reactμμ React κ°λ°μ λꡬ λΈλΌμ°μ νμ₯ νλ‘κ·Έλ¨μ κ°λ ₯ν μμ°μ
λλ€. useDebugValue
ν
μ μ¬μ©νλ©΄ React κ°λ°μ λꡬμ νμλλ μ 보λ₯Ό 보κ°νμ¬ μ»€μ€ν
ν
κ³Ό 볡μ‘ν μ»΄ν¬λνΈλ₯Ό ν¨μ¬ μ½κ² λλ²κΉ
ν μ μμ΅λλ€. μ΄ κΈμμλ useDebugValue
μ λν΄ μμΈν μμλ³΄κ³ , ν₯μλ λλ²κΉ
μ μν΄ κ·Έ κΈ°λ₯μ νμ©νλ μ’
ν©μ μΈ κ°μ΄λλ₯Ό μ 곡ν©λλ€.
useDebugValueλ 무μμΈκ°μ?
useDebugValue
λ React κ°λ°μ λꡬ λ΄μμ 컀μ€ν
ν
μ λν μ¬μ©μ μ μ λ μ΄λΈμ νμν μ μκ² ν΄μ£Όλ λ΄μ₯ React ν
μ
λλ€. μ΄λ ν
μ λ΄λΆ μνμ κ°μ λν λ λ§μ 컨ν
μ€νΈμ μ 보λ₯Ό μ 곡νμ¬ μ£Όλ‘ λλ²κΉ
μ λμ΅λλ€. useDebugValue
κ° μμΌλ©΄ κ°λ°μ λꡬμμ "Hook"κ³Ό κ°μ μΌλ°μ μΈ λ μ΄λΈλ§ λ³΄κ² λμ΄ ν
μ΄ μ€μ λ‘ λ¬΄μμ νκ³ μλμ§ μ΄ν΄νκΈ° μ΄λ €μΈ μ μμ΅λλ€.
μ useDebugValueλ₯Ό μ¬μ©ν΄μΌ νλμ?
- ν₯μλ λλ²κΉ : React κ°λ°μ λꡬμμ 컀μ€ν ν μ μνμ λμμ λν λ μλ―Έ μλ μ 보λ₯Ό μ 곡ν©λλ€.
- μ½λ μ΄ν΄λ μ¦μ§: κ°λ°μ(λ―Έλμ μμ μ ν¬ν¨νμ¬!)κ° μ»€μ€ν ν μ λͺ©μ κ³Ό κΈ°λ₯μ λ μ½κ² μ΄ν΄ν μ μλλ‘ λ§λλλ€.
- λ λΉ λ₯Έ λ¬Έμ μλ³: κ΄λ ¨ ν κ°κ³Ό μνλ₯Ό κ°λ°μ λꡬμ μ§μ νμνμ¬ λ²κ·Έμ μμΈμ μ μνκ² μ°Ύμλ λλ€.
- νμ : 컀μ€ν ν μ λμμ λ ν¬λͺ νκ² λ§λ€κ³ λ€λ₯Έ κ°λ°μλ€μ΄ μ΄ν΄νκΈ° μ½κ² νμ¬ ν νμ μ κ°μ ν©λλ€.
κΈ°λ³Έ μ¬μ©λ²: κ°λ¨ν κ° νμνκΈ°
useDebugValue
μ κ°μ₯ κΈ°λ³Έμ μΈ μ¬μ©λ²μ κ°λ¨ν κ°μ νμνλ κ²μ
λλ€. μ¬μ©μμ μ¨λΌμΈ μνλ₯Ό κ΄λ¦¬νλ 컀μ€ν
ν
μ μλ‘ λ€μ΄λ³΄κ² μ΅λλ€:
μμ : useOnlineStatus ν
import { useState, useEffect, useDebugValue } from 'react';
function useOnlineStatus() {
const [isOnline, setIsOnline] = useState(navigator.onLine);
useEffect(() => {
const handleOnline = () => setIsOnline(true);
const handleOffline = () => setIsOnline(false);
window.addEventListener('online', handleOnline);
window.addEventListener('offline', handleOffline);
return () => {
window.removeEventListener('online', handleOnline);
window.removeEventListener('offline', handleOffline);
};
}, []);
useDebugValue(isOnline ? 'Online' : 'Offline');
return isOnline;
}
export default useOnlineStatus;
μ΄ μμ μμ useDebugValue(isOnline ? 'Online' : 'Offline')
λ React κ°λ°μ λꡬμ "Online" λλ "Offline"μ νμνμ¬ μ¬μ©μμ νμ¬ μ¨λΌμΈ μνλ₯Ό μ§μ μ μΌλ‘ λ°μν©λλ€. μ΄ λΌμΈμ΄ μλ€λ©΄ κ°λ°μ λꡬλ μΌλ°μ μΈ "Hook" λ μ΄λΈλ§ νμνμ¬ ν
μ μνλ₯Ό μ¦μ νμ
νκΈ° μ΄λ ΅κ² λ§λλλ€.
κ³ κΈ μ¬μ©λ²: λλ²κ·Έ κ° ν¬λ§·ν νκΈ°
useDebugValue
λ λ λ²μ§Έ μΈμλ‘ ν¬λ§·ν
ν¨μλ₯Ό λ°μ μλ μμ΅λλ€. μ΄ ν¨μλ₯Ό μ¬μ©νλ©΄ κ°μ΄ κ°λ°μ λꡬμ νμλκΈ° μ μ λ³νν μ μμ΅λλ€. μ΄λ 볡μ‘ν λ°μ΄ν° ꡬ쑰λ κ°μ μ¬λμ΄ λ μ½κΈ° μ¬μ΄ νμμΌλ‘ νμν λ μ μ©ν©λλ€.
μμ : ν¬λ§·ν°μ ν¨κ» μ¬μ©νλ useGeolocation ν
μ¬μ©μμ μ§λ¦¬μ μμΉλ₯Ό κ°μ Έμ€λ 컀μ€ν ν μ μκ°ν΄ λ΄ μλ€:
import { useState, useEffect, useDebugValue } from 'react';
function useGeolocation() {
const [location, setLocation] = useState({
latitude: null,
longitude: null,
accuracy: null,
error: null,
});
useEffect(() => {
if (!navigator.geolocation) {
setLocation((prevState) => ({ ...prevState, error: 'Geolocation is not supported by your browser' }));
return;
}
const handleSuccess = (position) => {
setLocation({
latitude: position.coords.latitude,
longitude: position.coords.longitude,
accuracy: position.coords.accuracy,
error: null,
});
};
const handleError = (error) => {
setLocation((prevState) => ({ ...prevState, error: error.message }));
};
const options = {
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0,
};
navigator.geolocation.getCurrentPosition(handleSuccess, handleError, options);
}, []);
useDebugValue(
location,
(loc) => loc.error || `Latitude: ${loc.latitude}, Longitude: ${loc.longitude}, Accuracy: ${loc.accuracy}`
);
return location;
}
export default useGeolocation;
μ΄ μμ μμ ν¬λ§·ν ν¨μλ μλ¬κ° μλμ§ νμΈν©λλ€. μλ¬κ° μμΌλ©΄ μλ¬ λ©μμ§λ₯Ό νμν©λλ€. κ·Έλ μ§ μμΌλ©΄ μλ, κ²½λ, μ νλλ₯Ό μ½κΈ° μ¬μ΄ λ¬Έμμ΄λ‘ ν¬λ§·ν ν©λλ€. ν¬λ§·ν°κ° μμΌλ©΄ κ°λ°μ λꡬλ λ¨μν 볡μ‘ν κ°μ²΄λ₯Ό νμνκ² λμ΄ λΉ λ₯΄κ² ν΄μνκΈ°κ° ν¨μ¬ λ μ΄λ €μΈ κ²μ λλ€.
useDebugValueλ₯Ό μν λͺ¨λ² μ¬λ‘
- λλ¬Όκ² μ¬μ©νκΈ°:
useDebugValue
λ λλ²κΉ μ μ€μν κ°μΉλ₯Ό μ 곡ν λλ§ μ¬μ©νμΈμ. κ³Όλνκ² μ¬μ©νλ©΄ κ°λ°μ λκ΅¬κ° λ³΅μ‘ν΄μ Έ κ΄λ ¨ μ 보λ₯Ό μ°ΎκΈ° μ΄λ €μμ§ μ μμ΅λλ€. - ν΅μ¬ κ°μ μ§μ€νκΈ°: ν μ λμμ μ΄ν΄νλ λ° νμμ μΈ κ°μ₯ μ€μν κ°μ νμνλ κ²μ μ°μ μνμΈμ.
- 볡μ‘ν λ°μ΄ν°μλ ν¬λ§·ν° μ¬μ©νκΈ°: 볡μ‘ν λ°μ΄ν° ꡬ쑰λ₯Ό λ€λ£° λλ ν¬λ§·ν ν¨μλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό μ¬λμ΄ μ½κΈ° μ¬μ΄ νμμΌλ‘ νμνμΈμ.
- μ±λ₯ μ§μ½μ μΈ μμ νΌνκΈ°: ν¬λ§·ν ν¨μλ κ°λ°μ λκ΅¬κ° ν μ κ²μ¬ν λλ§λ€ μ€νλλ―λ‘ κ°λ³κ³ μ±λ₯ μ§μ½μ μΈ μμ μ νΌν΄μΌ ν©λλ€.
- μ‘°κ±΄λΆ λλ²κ·Έ κ° κ³ λ €νκΈ°: λλ²κ·Έ νλκ·Έλ₯Ό κΈ°λ°μΌλ‘ ν 쑰건문μΌλ‘
useDebugValue
λ₯Ό κ°μΈ κ°λ° νκ²½μμλ§ μ€νλλλ‘ νμΈμ. μ΄λ νλ‘λμ νκ²½μμ λΆνμν μ€λ²ν€λλ₯Ό λ°©μ§ν©λλ€.
μ€μ μμ λ° μ¬μ© μ¬λ‘
λ€μμ useDebugValue
κ° λλ²κΉ
κ²½νμ ν¬κ² ν₯μμν¬ μ μλ λͺ κ°μ§ μ€μ μμ μ
λλ€:
- μΈμ¦ ν
: μ¬μ©μμ μΈμ¦ μν(μ: λ‘κ·ΈμΈλ¨, λ‘κ·Έμμλ¨) λ° μ¬μ©μ μν μ νμν©λλ€. μλ₯Ό λ€μ΄,
useAuth
μ κ°μ ν μμ "κ΄λ¦¬μλ‘ λ‘κ·ΈμΈλ¨" λλ "λ‘κ·Έμμλ¨"μ νμν μ μμ΅λλ€. - λ°μ΄ν° νμΉ ν
: λ‘λ© μν, μλ¬ λ©μμ§, κ·Έλ¦¬κ³ κ°μ Έμ¨ νλͺ©μ μλ₯Ό 보μ¬μ€λλ€.
useFetch
μ κ°μ ν μμ "λ‘λ© μ€...", "μλ¬: λ€νΈμν¬ μ€λ₯", λλ "10κ° νλͺ© κ°μ Έμ΄"μ νμν μ μμ΅λλ€. - νΌ μ ν¨μ± κ²μ¬ ν
: κ° νΌ νλμ μ ν¨μ± κ²μ¬ μνμ λͺ¨λ μλ¬ λ©μμ§λ₯Ό νμν©λλ€.
useForm
κ³Ό κ°μ ν μμ "μ΄λ©μΌ: μ ν¨ν¨", "λΉλ°λ²νΈ: μ ν¨νμ§ μμ (μ΅μ 8μ μ΄μμ΄μ΄μΌ ν©λλ€)"λ₯Ό νμν μ μμ΅λλ€. μ΄λ μ¬λ¬ μ ν¨μ± κ²μ¬ κ·μΉμ΄ μλ 볡μ‘ν νΌμ νΉν μ μ©ν©λλ€. - μν κ΄λ¦¬ ν : 볡μ‘ν μ»΄ν¬λνΈμ νμ¬ μνλ₯Ό μκ°νν©λλ€. μλ₯Ό λ€μ΄, 볡μ‘ν UI μν(μ: λ€λ¨κ³ νΌ)λ₯Ό κ΄λ¦¬νλ 컀μ€ν ν μ΄ μλ€λ©΄ νμ¬ λ¨κ³μ ν΄λΉ λ¨κ³μ κ΄λ ¨ λ°μ΄ν°λ₯Ό 보μ¬μ€ μ μμ΅λλ€.
- μ λλ©μ΄μ ν : νμ¬ μ λλ©μ΄μ νλ μκ³Ό μ§ν μν©μ νμν©λλ€. μλ₯Ό λ€μ΄, 볡μ‘ν μ λλ©μ΄μ μ κ΄λ¦¬νλ ν μμ "νλ μ: 25", "μ§νλ₯ : 75%"λ₯Ό νμν μ μμ΅λλ€.
μμ : useLocalStorage ν
λ‘컬 μ€ν 리μ§μ λ°μ΄ν°λ₯Ό μꡬ μ μ₯νλ useLocalStorage
ν
μ΄ μλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€:
import { useState, useEffect, useDebugValue } from 'react';
function useLocalStorage(key, initialValue) {
const [storedValue, setStoredValue] = useState(() => {
try {
const item = window.localStorage.getItem(key);
return item ? JSON.parse(item) : initialValue;
} catch (error) {
console.error(error);
return initialValue;
}
});
useEffect(() => {
try {
window.localStorage.setItem(key, JSON.stringify(storedValue));
} catch (error) {
console.error(error);
}
}, [key, storedValue]);
useDebugValue(`Key: ${key}, Value: ${JSON.stringify(storedValue)}`);
const setValue = (value) => {
try {
setStoredValue(value);
} catch (error) {
console.error(error);
}
};
return [storedValue, setValue];
}
export default useLocalStorage;
μ΄ μμ μ useDebugValue
λ νμ¬ λ‘컬 μ€ν 리μ§μ μ μ₯λ ν€μ JSON λ¬Έμμ΄νλ κ°μ νμν©λλ€. μ΄λ₯Ό ν΅ν΄ ν
μ΄ λ°μ΄ν°λ₯Ό μ¬λ°λ₯΄κ² μ μ₯νκ³ κ²μνλμ§ ν¨μ¬ μ½κ² νμΈν μ μμ΅λλ€.
useDebugValueμ κ΅μ ν(i18n)
κ΅μ νλ μ ν리μΌμ΄μ
μμ μμ
ν λ useDebugValue
λ νΉν μ μ©ν μ μμ΅λλ€. μ΄λ₯Ό μ¬μ©νμ¬ νμ¬ νμ±νλ λ‘μΌμΌμ΄λ μΈμ΄λ₯Ό κ°λ°μ λꡬμ νμν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ¬λ°λ₯Έ λ²μμ΄ λ‘λλκ³ νμλλμ§ μ μνκ² νμΈν μ μμ΅λλ€.
μμ : useTranslation ν μΌλ‘ νμ¬ λ‘μΌμΌ νμνκΈ°
react-i18next
μ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ€κ³ κ°μ νλ©΄, useDebugValue
λ₯Ό μ¬μ©νμ¬ νμ¬ λ‘μΌμΌμ νμν μ μμ΅λλ€:
import { useTranslation } from 'react-i18next';
import { useDebugValue } from 'react';
function MyComponent() {
const { t, i18n } = useTranslation();
useDebugValue(`Current Locale: ${i18n.language}`);
return (
{t('welcome')}
{t('description')}
);
}
export default MyComponent;
μ΄ μ€λν«μ React κ°λ°μ λꡬμ νμ¬ λ‘μΌμΌ(μ: "en", "fr", "de")μ νμνμ¬ μ¬λ°λ₯Έ μΈμ΄ ν©μ΄ λ‘λλμλμ§ μ½κ² νμΈν μ μκ² ν΄μ€λλ€.
useDebugValueμ λμ
useDebugValue
λ μ μ©ν λꡬμ΄μ§λ§, React μ ν리μΌμ΄μ
μ λλ²κΉ
νλ λ€λ₯Έ μ κ·Ό λ°©μλ μμ΅λλ€:
- μ½μ λ‘κΉ
:
console.log
,console.warn
,console.error
λ¬Έμ μ¬μ©νμ¬ λΈλΌμ°μ μ½μμ λλ²κΉ μ 보λ₯Ό μΆλ ₯ν©λλ€. κ°λ¨νμ§λ§,useDebugValue
λ₯Ό μ¬μ©νλ κ²λ³΄λ€ 볡μ‘νκ³ λ 체κ³μ μΌ μ μμ΅λλ€. - React Profiler: React κ°λ°μ λꡬμ React Profilerλ λ€λ₯Έ μ»΄ν¬λνΈλ₯Ό λ λλ§νλ λ° μμλ μκ°μ μΈ‘μ νμ¬ μ±λ₯ λ³λͺ© νμμ μλ³νλ λ° λμμ μ€λλ€.
- μλνν° λλ²κΉ
λΌμ΄λΈλ¬λ¦¬:
why-did-you-render
μ κ°μ λΌμ΄λΈλ¬λ¦¬λ λΆνμν 리λ λλ§μ μλ³νμ¬ μ±λ₯μ μ΅μ ννλ λ° λμμ μ€ μ μμ΅λλ€. - μ μ© μν κ΄λ¦¬ κ°λ°μ λꡬ: Reduxλ Zustandμ κ°μ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²½μ°, κ°κ°μ κ°λ°μ λꡬλ μ ν리μΌμ΄μ μ μνμ λν μ¬μΈ΅μ μΈ ν΅μ°°λ ₯μ μ 곡ν©λλ€.
μ£Όμμ¬ν λ° κ³ λ €μ¬ν
- κ°λ° μ μ©:
useDebugValue
λ μ£Όλ‘ κ°λ° λ° λλ²κΉ λͺ©μ μΌλ‘ μ¬μ©λ©λλ€. νλ‘λμ νκ²½μμ μ΅μ’ μ¬μ©μμκ² μ 보λ₯Ό νμνλ λ° μ¬μ©ν΄μλ μ λ©λλ€. - μ±λ₯ μν₯: μΌλ°μ μΌλ‘ κ°λ³μ§λ§,
useDebugValue
μ ν¬λ§·ν ν¨μ λ΄λΆμ κ³μ° λΉμ©μ΄ λ§μ΄ λλ λ‘μ§μ λ°°μΉνλ κ²μ νΌν΄μΌ ν©λλ€. κ°λ° μ€μ μ±λ₯μ μ½κ°μ μν₯μ μ€ μ μμ΅λλ€. - κ³Όμ©:
useDebugValue
λ₯Ό κ³Όλνκ² μ¬μ©νλ©΄ React κ°λ°μ λκ΅¬κ° λ³΅μ‘ν΄μ Έ νμν μ 보λ₯Ό μ°ΎκΈ° μ΄λ €μμ§ μ μμΌλ―λ‘ νΌν΄μΌ ν©λλ€. κ°μ₯ νμμ μ΄κ³ κ΄λ ¨μ± μλ μ 보λ₯Ό νμνλ λ° μ§μ€νμΈμ. - 보μ κ³ λ €μ¬ν:
useDebugValue
λ₯Ό μ¬μ©νμ¬ λ―Όκ°ν μ 보(μ: λΉλ°λ²νΈ, API ν€)λ₯Ό νμνλ λ° μ£Όμν΄μΌ ν©λλ€. κ°λ°μ λꡬμμ λ³Ό μ μκΈ° λλ¬Έμ λλ€.
κ²°λ‘
useDebugValue
λ κ°λ ₯νμ§λ§ μ’
μ’
κ°κ³Όλλ React ν
μΌλ‘, λλ²κΉ
μν¬νλ‘μ°λ₯Ό ν¬κ² ν₯μμν¬ μ μμ΅λλ€. 컀μ€ν
λ μ΄λΈκ³Ό ν¬λ§·ν°λ₯Ό μ 곡ν¨μΌλ‘μ¨, React κ°λ°μ λꡬ λ΄μμ μ§μ 컀μ€ν
ν
κ³Ό 볡μ‘ν μ»΄ν¬λνΈμ λμμ λ μ½κ² μ΄ν΄ν μ μκ² ν΄μ€λλ€. μ΄ κΈμμ μ€λͺ
ν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ useDebugValue
λ₯Ό νμ©νμ¬ λ κ²¬κ³ νκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ React μ ν리μΌμ΄μ
μ ꡬμΆν μ μμ΅λλ€. κ°λ° κ³Όμ μ useDebugValue
λ₯Ό ν΅ν©νλ©΄ λ¬Έμ ν΄κ²° μ κ·μ€ν μκ°κ³Ό λ
Έλ ₯μ μ μ½νμ¬ λ ν¨μ¨μ μ΄κ³ μ¦κ±°μ΄ κ°λ° κ²½νμ μ»μ μ μμ΅λλ€. λλ²κΉ
μ κ°μ₯ μ€μν μ 보λ₯Ό νμνλ λ° μ§μ€νκ³ ν¬λ§·ν
ν¨μ λ΄μμ μ±λ₯ μ§μ½μ μΈ μμ
μ νΌνλ©΄μ μ μ€νκ² μ¬μ©ν΄μΌ ν¨μ κΈ°μ΅νμΈμ.