Debugging
기본적인 앱에서는 console.log
가 아톰을 디버깅하는 데 가장 좋은 친구가 될 수 있습니다. 하지만 애플리케이션이 커지고 사용할 아톰이 많아지면, 로깅은 아톰을 디버깅하는 좋은 방법이 아닙니다.
Jotai는 아톰을 디버깅하는 두 가지 방법을 제공합니다: React Dev Tools와 Redux Dev Tools입니다. 값을 읽고 간단한 디버깅을 할 때는 React Dev Tools가 적합할 수 있지만, 시간 여행(time-travelling)이나 값을 설정하는 것과 같은 더 복잡한 작업에는 Redux Dev Tools가 더 나은 선택이 될 것입니다.
디버그 라벨
Jotai에는 디버그 라벨이라는 개념이 있습니다. 이는 디버깅에 도움을 줄 수 있습니다.
기본적으로 각 Jotai 상태는 1:<no debugLabel>
과 같은 라벨을 가지고 있습니다. 여기서 숫자는 각 아톰에 자동으로 할당된 내부 key
입니다. 하지만 debugLabel
을 사용해 아톰에 라벨을 추가하면 더 쉽게 구분할 수 있습니다.
const countAtom = atom(0)// countAtom의 기본 debugLabel은 'atom1'입니다.if (process.env.NODE_ENV !== 'production') {countAtom.debugLabel = 'count'// 이제 debugLabel은 'count'입니다.}
Jotai는 Babel과 SWC 플러그인을 제공합니다. 이 플러그인은 모든 아톰에 자동으로 debugLabel
을 추가해 줍니다. 이를 통해 작업이 더 쉬워집니다. 자세한 내용은 jotai/babel과 @swc-jotai/debug-label를 참고하세요.
React Dev Tools 사용하기
React Dev Tools를 사용하여 Jotai 상태를 확인할 수 있습니다. 이를 위해 커스텀 훅 내부에서 useDebugValue가 사용됩니다. 이 기능은 개발 모드(NODE_ENV === 'development'
)에서만 작동한다는 점을 유의하세요.
useAtom
useAtom
은 atom 값에 대해 useDebugValue
를 호출합니다. 따라서 React Dev Tools에서 Jotai atom을 사용하는 컴포넌트를 선택하면, 해당 컴포넌트에서 사용 중인 각 atom에 대한 "Atom" 훅과 현재 값을 확인할 수 있습니다.
useAtomsDebugValue
useAtomsDebugValue
는 Provider 아래에 있는 컴포넌트 트리(또는 Provider가 없는 모드에서는 전체 트리)의 모든 아톰을 캐치하고, 모든 아톰 값에 대해 useDebugValue
를 사용합니다. React Dev Tools에서 useAtomsDebugValue
가 있는 컴포넌트로 이동하면, "AtomsDebugValue"라는 커스텀 훅을 볼 수 있습니다. 이를 통해 모든 아톰 값과 그 의존성을 확인할 수 있습니다.
이 훅을 사용하는 한 가지 예는 Provider
컴포넌트 바로 아래에 훅을 배치하는 것입니다:
const DebugAtoms = () => {useAtomsDebugValue()return null}const Root = () => (<Provider><DebugAtoms /><App /></Provider>)
Redux DevTools 사용하기
Redux DevTools를 사용하여 아톰을 검사할 수 있습니다. 이 도구는 시간 여행(Time-travelling)이나 값 디스패치(value dispatching)와 같은 다양한 기능을 제공합니다.
useAtomDevtools
useAtomDevtools
는 특정 아톰을 위한 ReduxDevTools 확장을 관리하는 React 훅입니다.
디버깅하고 싶은 특정 아톰이 있다면, useAtomDevtools
를 사용하는 것이 좋은 선택일 수 있습니다.
const countAtom = atom(0)// 아톰이 여러 개라면 countAtom.debugLabel을 설정하는 것을 권장합니다.function Counter() {const [count, setCount] = useAtom(countAtom)useAtomDevtools(countAtom)}
이제 setCount
를 사용하면 Redux Dev Tools에서 해당 변경 사항이 즉시 기록되는 것을 확인할 수 있습니다.
타임 트래블
때로는 아톰 상태의 특정 값으로 전환해야 할 때가 있습니다. 타임 트래블을 사용하면 이 작업이 가능합니다.
개발자 도구에서 각 액션 위로 마우스를 가져가면 Jump 옵션이 표시됩니다. 이 옵션을 클릭하면 해당 특정 값으로 전환할 수 있습니다.
일시 중지
아톰에 변경 사항을 기록하지 않으려면 일시 중지 기능을 사용하여 해당 아톰의 감시를 중지할 수 있습니다.
Dispatch
Dispatch 기능을 사용하면 아톰에 값을 설정할 수 있습니다. Show Dispatcher 버튼을 클릭하면 이 기능을 사용할 수 있습니다.
이렇게 하면 countAtoms
의 값이 5
로 설정됩니다.
값은 JSON.parse로 파싱되므로 지원되는 값을 전달해야 합니다.
useAtomsDevtools
useAtomsDevtools
는 특정 아톰만 보여주는useAtomDevtools
의 확장 버전으로, 스토어에 있는 모든 아톰을 보여줍니다.
여러분이 모든 아톰을 한 곳에서 관리하고 싶다면 이 훅을 사용하는 것을 추천합니다. 이 훅 아래에 위치한 (React 트리에서) 모든 아톰에 대한 액션이 Redux Dev Tools에 잡힙니다.
useAtomDevtools
의 모든 기능이 이 훅에서 지원되며, 추가적으로 아톰의 의존성에 대한 더 많은 정보를 제공합니다. 예를 들면 다음과 같습니다:
{"values": {"atom1:count": 0,"atom2:doubleCount": 0,"atom3:half": 0,"atom4:sum": 0},"dependents": {"atom1:count": ["atom1:count", "atom2:doubleCount", "atom4:sum"],"atom2:doubleCount": ["atom3:half", "atom4:sum"],"atom3:half": ["atom4:sum"],"atom4:sum": []}}
Frozen Atoms
실수로 아톰에 저장된 객체를 변경하려고 할 때 발생하는 버그를 찾으려면 jotai/utils
번들에서 제공하는 freezeAtom
또는 freezeAtomCreator
를 사용할 수 있습니다. 이 함수들은 Object.freeze
를 사용하여 아톰의 값을 깊이 얼려서 반환합니다.
freezeAtom
freezeAtom(anAtom): AtomType
freezeAtom
은 기존의 아톰을 "고정(frozen)" 상태로 만듭니다. 이 함수는 동일한 아톰을 반환합니다. 아톰의 값은 Object.freeze
를 통해 깊은 고정(deep freeze)이 적용됩니다. 이 기능은 의도치 않게 객체(상태)를 변경하려고 시도했을 때 발생할 수 있는 예상치 못한 동작을 찾는 데 유용합니다. 여러분은 모든 아톰에 freezeAtom
을 사용하여 이러한 상황을 방지할 수 있습니다.
매개변수
anAtom (필수): 고정하려는 아톰.
예제
import { atom } from 'jotai'import { freezeAtom } from 'jotai/utils'const objAtom = freezeAtom(atom({ count: 0 }))
freezeAtomCreator
필요한 경우 freezeAtom
을 위한 팩토리를 정의할 수 있습니다.
import { freezeAtom } from 'jotai/utils'export function freezeAtomCreator<CreateAtom extends (...args: unknown[]) => Atom<unknown>,>(createAtom: CreateAtom): CreateAtom {return ((...args: unknown[]) => freezeAtom(createAtom(...args))) as never}