redux와 recoil을 어떻게 사용하는지에 대해서는 자세하게 설명은 하지 않습니다.
redux는 회사에서 현재 사용 중인데 recoil 계속 뜨고 있고 다른 회사에서도
많이 쓰고 있다길래 프로덕션에서 사용 할 수 있는지 또 두개의 차이가 얼마나 있는지 알아보기 위해 요번에 사용해 봤습니다.
만약 새로운 프로젝트를 세팅 부터 들어가는데 Redux Template 따로 없고 redux를 사용해 보지 않은 팀원이 많으며, Recoil을 선택 할 것입니다.
/** counterReducer.js */
import { createSlice } from "@reduxjs/toolkit";
export interface CounterState {
value: number;
}
const initialState: CounterState = {
value: 0,
};
export const counterSlice = createSlice({
name: "counter",
initialState,
reducers: {
increment: (state) => {
state.value += 1;
},
decrement: (state) => {
state.value -= 1;
},
incrementByAmount: (state, action) => {
state.value += action.payload;
},
},
});
// Action creators are generated for each case reducer function
export const { increment, decrement, incrementByAmount } = counterSlice.actions;
export default counterSlice.reducer;
/** store.js */
import { configureStore } from "@reduxjs/toolkit";
import counterReducer from "./reducer/counterReducer";
export const store = configureStore({
reducer: {
counter: counterReducer,
},
});
/** dispatch custom hook */
import { useDispatch, useSelector } from "react-redux";
import { decrement, increment } from "../redux/reducer/counter";
import { RootState } from "../redux/store";
export default function useReduxCount() {
const reduxCount = useSelector((state: RootState) => state.counter.value);
const dispatch = useDispatch();
const incrementRedux = () => dispatch(increment());
const decrementRedux = () => dispatch(decrement());
return { reduxCount, incrementRedux, decrementRedux };
}
import { atom } from "recoil";
const countState = atom({
key: `count${+new Date()}`,
default: 0,
});
export { countState };
/** custom hook */
import { useRecoilValue, useSetRecoilState } from "recoil";
import { countState } from "../atoms/countAtoms";
export default function useRecoilCount() {
const recoilCount = useRecoilValue(countState);
const setCount = useSetRecoilState(countState);
const incrementRecoil = () => setCount((count) => count + 1);
const decrementRecoil = () => setCount((count) => count - 1);
return { recoilCount, incrementRecoil, decrementRecoil };
}
custom hook은 필수는 아니나 공용적으로 쓰기 위해 예제로 만들어봤습니다.
물론 recoil도 비동기 처리를 위한 기능들을 쓰기 위해서는 더 알아야하나 기본으로 쓰기 위해서는 atom만 추가하면 된다는 결론에 도달했습니다.
아쉬운 debug툴...
redux는 현재 debug 툴이 매우 잘 되어있기 때문에 사용이 매우 편합니다.
하지만 recoil은 아직 사용하기도 불편하고 제대로 작동을 하지 않아 console로 확인을 해야만 합니다.
아직은 beta...
Redux 보다 부족한 여러가지의 라이브러리들
Recoil은 매우 괜찮은 state 관리 library라고 생각 하며 드디어 프로적션에서 사용하기 위한 턱걸이를 통과를 했다는 생각이 듭니다. 그러니 Recoil을 아직 안써보셨다면 한번쯤 써보시는것을 추천합니다.