Zustand와 Recoil은 React 애플리케이션에서 상태 관리를 쉽게 만들어주는 JavaScript 라이브러리입니다. 두 라이브러리는 모두 고도로 직관적이며, 가볍지만, 특정 기능과 구조에서는 몇 가지 차이점을 가지고 있습니다.
먼저, Recoil의 간단한 사용 예제를 들어보겠습니다.
Recoil을 사용하려면 우선 RecoilRoot가 필요합니다. 앱의 최상위 컴포넌트에 RecoilRoot를 래핑해야 합니다:
import { RecoilRoot } from 'recoil';
function App() {
return (
<RecoilRoot>
<MyComponent />
</RecoilRoot>
);
}
다음으로, 상태를 생성하려면 atom을 사용해야 합니다. atom은 상태의 최소 단위입니다:
import { atom } from 'recoil';
export const counterState = atom({
key: 'counterState', // unique ID (with respect to other atoms/selectors)
default: 0, // default value (aka initial value)
});
이제 생성한 counterState라는 atom을 사용하는 컴포넌트를 만들어 봅시다. 이 컴포넌트에서는 useRecoilState라는 훅을 사용하여 atom의 상태를 읽고 쓸 수 있습니다:
import { useRecoilState } from 'recoil';
import { counterState } from './counterState';
function MyComponent() {
const [counter, setCounter] = useRecoilState(counterState);
return (
<div>
Counter: {counter}
<button onClick={() => setCounter(counter + 1)}>Increment</button>
<button onClick={() => setCounter(counter - 1)}>Decrement</button>
</div>
);
}
위의 컴포넌트에서, 우리는 useRecoilState 훅을 사용하여 counterState의 현재 상태를 얻고, 그 상태를 변경하는 함수를 얻습니다. 이 함수를 사용하여 카운터를 증가시키거나 감소시킬 수 있습니다.
먼저, Zustand 스토어를 생성해야 합니다. Zustand 스토어는 상태와 상태를 변경하는 함수들을 포함합니다. 아래 코드는 카운터 상태를 가진 스토어를 만드는 예시입니다:
import create from 'zustand';
// Define your store
export const useStore = create(set => ({
counter: 0,
increment: () => set(state => ({ counter: state.counter + 1 })),
decrement: () => set(state => ({ counter: state.counter - 1 })),
}));
위의 코드에서, useStore는 Zustand 훅입니다. 이 훅은 스토어의 상태를 가져오거나, 스토어의 함수를 사용하여 상태를 변경하는 데 사용됩니다.
다음으로, 위에서 생성한 스토어를 사용하는 컴포넌트를 만들어 보겠습니다:
import { useStore } from './store';
function MyComponent() {
const { counter, increment, decrement } = useStore();
return (
<div>
Counter: {counter}
<button onClick={increment}>Increment</button>
<button onClick={decrement}>Decrement</button>
</div>
);
}
이 컴포넌트에서는 useStore 훅을 사용하여 스토어의 상태를 가져오고, increment와 decrement 함수를 사용하여 상태를 변경합니다. 이렇게 하면 컴포넌트가 스토어의 상태에 반응적으로 업데이트되고, 버튼 클릭에 반응하여 상태를 변경할 수 있습니다.