๐Ÿž

11. useDebugValue

ย 
ย 

11.1 useDebugValue๋ž€?

ย 
useDebugValue๋Š” React Developer Tools ๋‚ด์—์„œ ์ปค์Šคํ…€ ํ›…์˜ ๋‚ด๋ถ€ ๋…ผ๋ฆฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋นŒํŠธ์ธ ํ›…์ž…๋‹ˆ๋‹ค. useDebugValue๋Š” ์ปค์Šคํ…€ ํ›…์„ ๋””๋ฒ„๊น…ํ•  ๋•Œ ํ›จ์”ฌ ๋” ๋‚˜์€ ๋””๋ฒ„๊น… ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
ย 
๐Ÿ’ก
๋””๋ฒ„๊ทธ(debug)๋ž€? ๋””๋ฒ„๊ทธ(debug) ํ˜น์€ ๋””๋ฒ„๊น…(debugging)์€ ๊ฐœ๋ฐœ ๋‹จ๊ณ„ ์ค‘์— ๋ฐœ์ƒํ•˜๋Š” ์‹œ์Šคํ…œ์˜ ๋…ผ๋ฆฌ์ ์ธ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„๋‚ด๊ณ , ๊ทธ ์›์ธ์„ ๋ฐํžˆ๊ณ  ์ˆ˜์ •ํ•˜๋Š” ์ž‘์—… ๊ณผ์ •์„ ์ผ์ปซ์Šต๋‹ˆ๋‹ค.
ย 
useDebugValue๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ย 
useDebugValue(debugValue) // ๋˜๋Š” useDebugValue(debugValue, debugValue => debugValue.toString());
ย 
React Developer Tools ๋‚ด์—์„œ ๋””๋ฒ„๊ทธ ๊ฐ’์„ ํ‘œ์‹œํ•  ๋•Œ, ํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์ผ ๊ฒฝ์šฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ํ›…์ด ๊ฒ€์‚ฌ๋˜์ง€ ์•Š๋Š” ํ•œ, ํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” ์ž‘์—…์ด ๋ถˆํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, useDebugValue์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

11.2 React Developer Tools ์„ค์น˜๋ฐฉ๋ฒ• ๋ฐ ์‚ฌ์šฉ๋ฐฉ๋ฒ•

ย 
React์—์„œ๋Š” ์ฃผ๋กœ props์™€ state๋ฅผ ํ†ตํ•ด ์‹ค์ˆ˜์˜ ์›์ธ์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. props์™€ state๋ฅผ ์ถ”์ ํ•˜์—ฌ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋‹ค๋ฅธ ๋ฌธ์ œ ์›์ธ๊ณผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋‹ค๋ฅธ ๋ฌธ์ œ์™€ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋ฌธ์ œ ๋ฐœ์ƒ ์›์ธ์„ ๋”์šฑ ์‰ฝ๊ฒŒ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ฝ”๋“œ ๋ฒ ์ด์Šค(Codebase)๋กœ ์ธํ•œ ์‹ค์ˆ˜์˜ ์›์ธ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™˜๊ฒฝ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ ์‹œ ํ™”๋ฉด์—์„œ ๋ Œ๋”๋ง ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ, React Developer Tools๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค props ํ˜น์€ state์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. React Developer Tools๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด, ๋จผ์ € React Developer Tools๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 

11.2.1 ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜

ย 
ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ React Developer Tools๋ฅผ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋ฏธ๋ฆฌ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์›น ์Šคํ† ์–ด ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์›น ์Šคํ† ์–ด ํŽ˜์ด์ง€์—์„œ React Developer Tools๋ฅผ ๊ฒ€์ƒ‰ํ•œ ๋’ค, ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์„ โ€˜ํฌ๋กฌ์— ์ถ”๊ฐ€โ€™ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํฌ๋กฌ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 11-1 ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜๊ทธ๋ฆผ 11-1 ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜
๊ทธ๋ฆผ 11-1 ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜
ย 
ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์„ ํฌ๋กฌ์— ์ถ”๊ฐ€ํ–ˆ๋‹ค๋ฉด React๋ฅผ ์‹คํ–‰ํ•œ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ Components ํƒญ์œผ๋กœ ์ด๋™ํ•˜์—ฌ React Developer Tools๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 11-2 ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ React Developer Tools ์‚ฌ์šฉํ•˜๊ธฐ๊ทธ๋ฆผ 11-2 ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ React Developer Tools ์‚ฌ์šฉํ•˜๊ธฐ
๊ทธ๋ฆผ 11-2 ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ React Developer Tools ์‚ฌ์šฉํ•˜๊ธฐ
ย 

11.2.2 ๋…๋ฆฝ ์‹คํ–‰ํ˜• ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜

ย 
๋…๋ฆฝ ์‹คํ–‰ํ˜• ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ node.js ํ™˜๊ฒฝ ๊ตฌ์ถ•์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. node.js์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด, ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ React Developer Tools๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์˜ ์ฝ”๋“œ๋Š” ๋Œ€ํ‘œ์ ์ธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋„๊ตฌ์ธ yarn๊ณผ NPM์—์„œ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
ย 
yarn add --dev react-devtools
yarn์œผ๋กœ react-devtools ์„ค์น˜ํ•˜๊ธฐ
ย 
npx react-devtools
NPM์œผ๋กœ react-devtools ์„ค์น˜ํ•˜๊ธฐ
ย 
์œ„์˜ ๊ณผ์ •์œผ๋กœ ์„ค์น˜ํ•œ ํ›„ ํ„ฐ๋ฏธ๋„์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ๊ทธ๋ฆผ 11-3๊ณผ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ ์ฐฝ์ด ์‹คํ–‰๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋…๋ฆฝ ์‹คํ–‰ํ˜• ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” React Native, React DOM ๊ทธ๋ฆฌ๊ณ  Profiler๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์ด๋ฒˆ ์˜ˆ์ œ์—์„œ๋Š” React DOM์„ ์ด์šฉํ•˜์—ฌ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
react-devtools
react-devtools ์‹คํ–‰ํ•˜๊ธฐ
ย 
๊ทธ๋ฆผ 11-3 React Developer Tools ํ”„๋กœ๊ทธ๋žจ ๊ธฐ๋ณธ ์‹คํ–‰ํ™”๋ฉด๊ทธ๋ฆผ 11-3 React Developer Tools ํ”„๋กœ๊ทธ๋žจ ๊ธฐ๋ณธ ์‹คํ–‰ํ™”๋ฉด
๊ทธ๋ฆผ 11-3 React Developer Tools ํ”„๋กœ๊ทธ๋žจ ๊ธฐ๋ณธ ์‹คํ–‰ํ™”๋ฉด
ย 
React DOM์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‘ ๋งํฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ํด๋ฆญํ•˜์—ฌ ํด๋ฆฝ๋ณด๋“œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ script ํƒœ๊ทธ๋ฅผ ๊ฐœ๋ฐœ ์ค‘์ธ index.html ํŒŒ์ผ์˜ head ํƒœ๊ทธ ๋ฐ”๋กœ ์•„๋ž˜์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ์ค๋‹ˆ๋‹ค.
ย 
<!DOCTYPE html> <html lang="ko"> <head> <script src="http://localhost:8097"></script>
ย 
์œ„์˜ ๊ณผ์ •๋Œ€๋กœ ์ง„ํ–‰ํ•˜์—ฌ ๊ฐœ๋ฐœ ์ค‘์ธ ํŽ˜์ด์ง€๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ์ •์ƒ์ ์œผ๋กœ React Developer Tools์— ์—ฐ๊ฒฐ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ React Developer Tools์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ฐฐํฌ ์ „์— ์œ„์—์„œ ์ž‘์„ฑํ•œ script ํƒœ๊ทธ๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ย 

11.2.3 React Developer Tools ์‚ฌ์šฉ๋ฐฉ๋ฒ•

ย 
React Developer Tools๋ฅผ ํ™œ์šฉํ•˜๋ฉด Component Inspector ๋‚ด๋ถ€์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ state๋‚˜ props๋ฅผ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Component Inspector๊ฐ€ ์ „๋‹ฌํ•˜๋Š” ๋””๋ฒ„๊ทธ ์ •๋ณด์—์„œ๋Š” useState๋‚˜ useEffect์™€ ๊ฐ™์€ ๋‚ด์žฅ๋œ React Hook๋“ค์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Hook ๋ ˆ์ด๋ธ”์ด ์กด์žฌํ•˜์ง€ ์•Š์•„, ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ์–ด๋ ค์›€์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, useDebugValue๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด Hook ๋ ˆ์ด๋ธ”์„ ํ†ตํ•ด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ useDebugValue๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด๋– ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๊ฐ€ โ€˜์‹œ์ž‘โ€™, โ€˜์‹คํ–‰ ์ค‘โ€™, โ€˜์ข…๋ฃŒโ€™์˜ ์ƒํƒœ๋กœ ํ•œ์ •๋˜๊ณ , ๋ฒ„ํŠผ์˜ ํด๋ฆญ ์ด๋ฒคํŠธ๋กœ ์„ธ ๊ฐœ์˜ ์ƒํƒœ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ React Developer Tools์—์„œ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
import React from "react"; import useChangeAppState, { STATE_START, STATE_RUNNING, } from "./hooks/useChangeAppState"; function App() { const [state, next] = useChangeAppState(); const msg = state===STATE_START ? "์•ฑ ์‹œ์ž‘" : state===STATE_RUNNING ? "์•ฑ ์‹คํ–‰ ์ค‘" : "์•ฑ ์ข…๋ฃŒ"; return ( <div> <p>{msg}</p> <button onClick={next}>next</button> </div> ); } export default App;
App.js
ย 
import { useState, useDebugValue } from "react"; export const STATE_START = 0; export const STATE_RUNNING = 1; export const STATE_STOP = 2; export default function useChangeAppState() { const [state, setState] = useState(STATE_START); const next = () => setState(state === STATE_STOP ? STATE_START : state + 1); useDebugValue( state === STATE_START ? "์•ฑ ์‹œ์ž‘" : state === STATE_RUNNING ? "์•ฑ ์‹คํ–‰ ์ค‘" : "์•ฑ ์ข…๋ฃŒ" ); return [state, next]; }
useChangeAppState.jsx
ย 
์œ„์˜ ์ฝ”๋“œ๋Š” next ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์ƒํƒœ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. React Developer Tools์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ…์ŠคํŠธ(โ€™์•ฑ ์‹œ์ž‘โ€™, โ€˜์•ฑ ์‹คํ–‰ ์ค‘โ€™, โ€˜์•ฑ ์ข…๋ฃŒโ€™)๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 11-4 React Developer Tools์—์„œ ํ™•์ธํ•œ useChangeAppState ์ปดํฌ๋„ŒํŠธ์˜ ์‹คํ–‰ ์ƒํƒœ๊ทธ๋ฆผ 11-4 React Developer Tools์—์„œ ํ™•์ธํ•œ useChangeAppState ์ปดํฌ๋„ŒํŠธ์˜ ์‹คํ–‰ ์ƒํƒœ
๊ทธ๋ฆผ 11-4 React Developer Tools์—์„œ ํ™•์ธํ•œ useChangeAppState ์ปดํฌ๋„ŒํŠธ์˜ ์‹คํ–‰ ์ƒํƒœ

11.3 ์ปค์Šคํ…€ ํ›… ๋””๋ฒ„๊น…ํ•˜๊ธฐ

ย 
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ค‘ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ ๊ฐ’์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๋ฉด console.log๋ฅผ ํ†ตํ•˜์—ฌ ๊ฐ’์„ ๊ฒ€์ฆํ•˜๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. console.log๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ React์—์„œ๋„ ์ถฉ๋ถ„ํžˆ ์ข‹์€ ๋ฐฉ๋ฒ•์ž„์€ ํ‹€๋ฆผ์—†์œผ๋‚˜ ์ปค์Šคํ…€ ํ›…์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉ๋  ๋•Œ ์‚ฌ์šฉ๋œ ์ปดํฌ๋„ŒํŠธ์—์„œ Hook์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.
ย 
์•„๋ž˜ ์˜ˆ์ œ๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉ๋˜๋Š” ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ์‹œ console.log๋กœ ๊ฐ’์„ ์ถœ๋ ฅํ•  ๋•Œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
ย 
import { useState, useDebugValue } from 'react'; export const STATE_START = 0; export const STATE_RUNNING = 1; export const STATE_STOP = 2; export default function useChangeAppState() { const [state, setState] = useState(STATE_START); const next = () => setState(state === STATE_STOP ? STATE_START : state + 1); console.log( state === STATE_START ? "์•ฑ ์‹œ์ž‘" : state === STATE_RUNNING ? "์•ฑ ์‹คํ–‰ ์ค‘" : "์•ฑ ์ข…๋ฃŒ" ); return [state, next]; }
useChangeAppState.jsx
ย 
import React from "react"; import useChangeAppState, { STATE_START, STATE_RUNNING, } from "./hooks/useChangeAppState"; import ItemComponent from "./ItemComponent"; function App() { const [state, next] = useChangeAppState(); const msg = state === STATE_START ? "์•ฑ ์‹œ์ž‘" : state === STATE_RUNNING ? "์•ฑ ์‹คํ–‰ ์ค‘" : "์•ฑ ์ข…๋ฃŒ"; return ( <div> <p>{msg}</p> <button onClick={next}>next</button> <ItemComponent /> <ItemComponent /> {... ์ค‘๋žต} <ItemComponent /> </div> ); } export default App;
App.jsx
ย 
๊ทธ๋ฆผ 11-5 ์‹คํ–‰ ๊ฒฐ๊ณผ๊ทธ๋ฆผ 11-5 ์‹คํ–‰ ๊ฒฐ๊ณผ
๊ทธ๋ฆผ 11-5 ์‹คํ–‰ ๊ฒฐ๊ณผ
ย 
ย 
ย 
ย 
ย 
ย 
ย 
๊ทธ๋ฆผ 11-6 console.log๋กœ ๋””๋ฒ„๊น…ํ•œ ๊ฒฐ๊ณผ๊ทธ๋ฆผ 11-6 console.log๋กœ ๋””๋ฒ„๊น…ํ•œ ๊ฒฐ๊ณผ
๊ทธ๋ฆผ 11-6 console.log๋กœ ๋””๋ฒ„๊น…ํ•œ ๊ฒฐ๊ณผ
ย 
์œ„ ์˜ˆ์ œ์—์„œย next ๋ฒ„ํŠผ์„ย ๋ˆ„๋ฅธ๋‹ค๋ฉด ์ƒํƒœ๊ฐ€ โ€œ์•ฑ ์‹คํ–‰ ์ค‘โ€์œผ๋กœ ๋ณ€๊ฒฝ๋˜๊ณ  ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด์„œย ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ย ์žฌย ๋ Œ๋”๋งย ๋ ย ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์ด ํ•ด๋‹นย ์ปค์Šคํ…€ย ํ›…์„ ์‚ฌ์šฉํ•˜๋Š”ย ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ย ์žˆ๋‹ค๋ฉด ์žฌย ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ๊ฐ๊ฐ์˜ console.log๊ฐ€ ์‹คํ–‰๋˜์–ด ์›ํ•˜๋Š”ย ์ปค์Šคํ…€ ํ›…์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ฐพ๊ธฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.
ย 
์ด๋•Œ, useDebugValue๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ปค์Šคํ…€ ํ›…์„ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋Š˜์–ด๋‚˜๋„ ํŠน์ • ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ๋œ ์ปค์Šคํ…€ ํ›…์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
import { useState, useDebugValue } from 'react'; export const STATE_START = 0; export const STATE_RUNNING = 1; export const STATE_STOP = 2; export default function useChangeAppState() { const [state, setState] = useState(STATE_START); const next = () => setState(state === STATE_STOP ? STATE_START : state + 1); useDebugValue( state === STATE_START ? "์•ฑ ์‹œ์ž‘" : state === STATE_RUNNING ? "์•ฑ ์‹คํ–‰ ์ค‘" : "์•ฑ ์ข…๋ฃŒ", ); return [state, next]; }
useChangeAppState.jsx
ย 
๊ทธ๋ฆผ 11-7 useDebugValue๋กœ ๋””๋ฒ„๊น…ํ•œ ๊ฒฐ๊ณผ๊ทธ๋ฆผ 11-7 useDebugValue๋กœ ๋””๋ฒ„๊น…ํ•œ ๊ฒฐ๊ณผ
๊ทธ๋ฆผ 11-7 useDebugValue๋กœ ๋””๋ฒ„๊น…ํ•œ ๊ฒฐ๊ณผ
ย 
๐Ÿ’ก
์ปค์Šคํ…€ ํ›…์˜ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœ ๊ฐ’๋งŒ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด console.log๋งŒ ์‚ฌ์šฉํ•ด๋„ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณด๋‹ค ๋ณต์žกํ•˜๊ณ  ๋งŽ์€ ์–‘์˜ ์ปค์Šคํ…€ ํ›…์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์„ ๋•Œ, useDebugValue ํ›…์€ ์šฐ๋ฆฌ์˜ ํ›…์ด ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์—์„œ ์–ด๋–ค ์ƒํƒœ์ธ์ง€ ์กฐ๊ธˆ ๋” ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ์•Œ๋ ค์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

11.4 useDebugValue ์ฃผ์˜์‚ฌํ•ญ & ๊ฐœ์„ ์‚ฌํ•ญ

ย 

11.4.1 useDebugValue ์˜ ์‚ฌ์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ

ย 
useDebugValue ๋˜ํ•œ Hook์˜ ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ˜๋ณต๋ฌธ๊ณผ ์กฐ๊ฑด๋ฌธ, ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜ ์•ˆ์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ, ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ top level์—์„œ ์ž‘์„ฑํ•˜๋ฉด ์•„๋ฌด๋Ÿฐ ๋™์ž‘์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Hook์˜ ๋‚ด๋ถ€(์ตœ์ƒ๋‹จ)์—์„œ ์ž‘์„ฑํ•ด์•ผ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ย 
function App() { {/* ------------------ */} useDebugValue("test"); {/* ------------------ */} } export default App;
์ปดํฌ๋„ŒํŠธ ์ตœ์ƒ๋‹จ์— ์ž‘์„ฑํ•˜์—ฌ ์•„๋ฌด๋Ÿฐ ์ž‘๋™์ด ์—†๋Š” ๊ฒฝ์šฐ
ย 
function App() { {/* ------------------ */} const useColorState = () => { useDebugValue("test"); }; useColorState(); {/* ------------------ */} } export default App;
useDebugValue๋Š” ์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ Hook๋‚ด์— ์ž‘์„ฑํ•ด์•ผ ๋™์ž‘
ย 

11.4.2 useDebugValue๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

ย 
useDebugValue๋ฅผ ๋” ๊ฐœ์„ ํ•˜์—ฌ์„œ useState ๊ฐ’์— ๋ผ๋ฒจ๊ณผ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์„ ๋ถ™์—ฌ์„œ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ข€ ๋” ํ–ฅ์ƒ๋œ ๋””๋ฒ„๊น…์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์„ธ ๊ฐœ์˜ ๋ฒ„ํŠผ์„ ํ†ตํ•ด, ๋ฐ•์Šค์˜ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ปค์Šคํ…€๋œ ๋””๋ฒ„๊น… ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 11-8 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ๊ทธ๋ฆผ 11-8 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ
๊ทธ๋ฆผ 11-8 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ
ย 
๊ทธ๋ฆผ 11-9 ์ปค์Šคํ…€๋œ ๋””๋ฒ„๊น… ๋ฉ”์‹œ์ง€๊ทธ๋ฆผ 11-9 ์ปค์Šคํ…€๋œ ๋””๋ฒ„๊น… ๋ฉ”์‹œ์ง€
๊ทธ๋ฆผ 11-9 ์ปค์Šคํ…€๋œ ๋””๋ฒ„๊น… ๋ฉ”์‹œ์ง€
ย 
import { useState, useDebugValue } from "react"; const useBoxColorState = (initialValue, message) => { const [value, setValue] = useState(initialValue); useDebugValue(`${message}: ${value}`); return [value, setValue]; }; export default useBoxColorState ;
useBoxColorState.jsx
ย 
ํ•˜๋‚˜์˜ ์ปค์Šคํ…€ ํ›…์„ ๋งŒ๋“ค๊ณ , ํ›… ๋‚ด๋ถ€์—์„œ ๋ฐ›์•„์˜จ ์ธ์ž ๊ฐ’์„ ์ดˆ๊ธฐ ๊ฐ’์œผ๋กœ ํ•˜์—ฌ state๊ฐ’์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.
useDebugValue๋ฅผ ํ›… ์•ˆ์—์„œ ์„ ์–ธํ•ด์ฃผ๊ณ , ์ƒํƒœ ๊ฐ’๊ณผ ์ƒํƒœ๊ด€๋ฆฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ค๋‹ˆ๋‹ค.
์œ„์ฒ˜๋Ÿผ ์ปค์Šคํ…€ ํ›… ์•ˆ์— useDebugValue๋ฅผ ์„ ์–ธํ•ด์ฃผ๋ฉด ํ•ด๋‹น ํ›…์„ ํ˜ธ์ถœํ•  ๋•Œ, ๋””๋ฒ„๊น… ์‹œ์— use๋ฅผ ์ œ์™ธํ•œ BoxColorState ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋””๋ฒ„๊น…๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ย 
import { useDebugValue, useEffect } from "react"; import { useState } from "react"; import useBoxColorState from "./useBoxColorState.jsx"; import "./style.css"; function App() { const [isColor, setIsColor] = useBoxColorState("", "ํ˜„์žฌ ๋ฐ•์Šค์ƒ‰์ƒ"); const [isTomato, setIsTomdato] = useState(false); const [isPink, setIsPink] = useState(false); const [isSky, setIsSky] = useState(false); useEffect(() => { if (isPink) { setIsColor("pink"); } if (isSky) { setIsColor("sky"); } if (isTomato) { setIsColor("tomato"); } }, [isTomato, isPink, isSky]); return ( <> <button onClick={() => { setIsTomdato(true); setIsPink(false); setIsSky(false); }} > Tomato </button> <button onClick={() => { setIsTomdato(false); setIsPink(true); setIsSky(false); }} > Pink </button> <button onClick={() => { setIsTomdato(false); setIsPink(false); setIsSky(true); }} > Sky </button> <div className={isColor}></div> </> ); } export default App;
App.jsx
ย 
์œ„์—์„œ ๋งŒ๋“  useBoxColorState Hook์„ ํ˜ธ์ถœํ•˜์—ฌ isColor, setIsColor ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. useState๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ๋Š” ์ดˆ๊ธฐ ๊ฐ’์„ ๋„ฃ๊ณ , ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ๋Š” ์ถœ๋ ฅํ•  ๋””๋ฒ„๊น… ๋ฉ”์‹œ์ง€๋ฅผ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.
์ดํ›„, ๊ฐ ๋ฒ„ํŠผ์˜ ํด๋ฆญ์œผ๋กœ isColor ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋””๋ฒ„๊น… ๋ฉ”์‹œ์ง€๊ฐ€ ์ˆ˜์ •๋˜์–ด ์ถœ๋ ฅ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ย 
.pink { width: 100px; height: 100px; background-color: pink; } .sky { width: 100px; height: 100px; background-color: skyblue; } .tomato { width: 100px; height: 100px; background-color: tomato; }
style.css
ย 
์œ„์˜ ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉ๋œ CSS ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
ย 
ย 
ย 
ย