개발 경험 및 효율성 증대를 위해 클라이언트와 비동기 및 서버 상태 관리를 분리하여 개발하고, 클라이언트 상태 관리를 맡아주는 라이브러리 설치하려고 함.
클라이언트 상태 관리 라이브러리로 Zustand를 골랐음. 사실 최대한 클라이언트 전역 상태 관리 라이브러리를 사용하지 않으려는 쪽으로 가려다 선회해 주스탄드로 결정함.
클라이언트 상태 관점에서 로컬 상태는 useState, 전역 상태는 Zustand로 관리할 것임. 비동기적 상태 관리는 기존 상태 관리 라이브러리로는 부족해 리액트쿼리를 쓸 것임.
A small, fast, and scalable bearbones state management solution. Zustand has a comfy API based on hooks. It isn't boilerplatey or opinionated, but has enough convention to be explicit and flux-like.
작고, 빠르고, 간소하지만 확장 가능한 상태 관리 솔루션. 훅에 기반한 코드. boilerplatey 하지 않고, 강한 의견을 가진 코드는 아니지만, Flux 패턴을 따라 정확하고, 명확한 컨벤션을 지닌 라이브러리.
import { createSlice, configureStore } from '@reduxjs/toolkit';
const counterSlice = createSlice({
name: 'counter',
initialState: { value: 0 },
reducers: {
increment: (state) => {
state.value += 1;
},
decrement: (state) => {
state.value -= 1;
},
},
});
const store = configureStore({
reducer: counterSlice.reducer,
});
// 사용 예시
const ExampleComponent = () => {
const { value } = store.getState().counter;
return (
<div>
<p>Count: {value}</p>
<button onClick={() => store.dispatch(counterSlice.actions.increment())}>
Increment
</button>
<button onClick={() => store.dispatch(counterSlice.actions.decrement())}>
Decrement
</button>
</div>
);
};
import create from 'zustand';
const useStore = create((set) => ({
count: 0,
increment: () => set((state) => ({ count: state.count + 1 })),
decrement: () => set((state) => ({ count: state.count - 1 })),
}));
// 사용 예시
const ExampleComponent = () => {
const { count, increment, decrement } = useStore();
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
<button onClick={decrement}>Decrement</button>
</div>
);
};