Redux(๋ฆฌ๋์ค)๋?
๋ฆฌ๋์ค๋ ์คํ ์์ค ์๋ฐํฌ์ค๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ์ข ์ผ๋ก ,state๋ฅผ ์ด์ฉํด ์น ์ฌ์ดํธ ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๊ด๋ฆฌ๋ฅผ ํด์ค ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ๋ฒ ์ด์ค๋ Node.js ๋ชจ๋๋ก store ๋ผ๋ ํ๋์ ๋ฐ์ดํฐ ๊ณต๊ฐ(์ ์ฅ์)๋ฅผ ๊ฐ์ง๊ณ ์ ์ญ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ์ด๋ต๋๋ค.
Redux Toolkit (๋ฆฌ๋์ค ํดํท)์ด๋?
๊ธฐ์กด์ ๋ฆฌ๋์ค์ ๊ตฌ์กฐ์ ํจ๋ฌ๋ค์์ ๊ฑฐ์ ๋์ผํ์ง๋ง ์ฝ๋๋์ ๋ ์ ๊ฒ, ์ฌ์ฉํ๊ธฐ ํธํ๊ฒ ๊ฐ์ ๋ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฆฌ๋์ค ํดํท์ ์ฅ์
๋ฆฌ๋์ค์ ๋น๊ตํด๋ณด์๋ฉด ์ฐ์ ์ด๊ธฐ ์ค์ ์์ ๋ฆฌ๋์ค๋ ์คํ ์ด๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด์ ์ค์นํด์ผํ๋ ๊ฐ์ข ํจํค์ง๋ค์ ์ค์นํ์ง ์์๋ ๋ฉ๋๋ค. ํดํท์๋ ์ด๋ฏธ ์ค์น๋์ด์๊ธฐ ๋๋ฌธ์ ๋๋ค! ๊ทธ๋ฆฌ๊ณ ๋ถ๋ณ์ฑ์ ๋ํด์ ์ ๊ฒฝ์ฐ์ง ์์ผ์ ๋ ๋ฉ๋๋ค!
์ด๋ฐ ์ ์ด ์ฝ๋๋์ ์ค์ด๋ค๊ฒ ๋ง๋ค์์ง์.
Redux Toolkit ์ฝ๋ ์ ๋ฆฌ
app.js
๋ฆฌ๋์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก Provider๋ฅผ ์ฌ์ฉํด์ ํด๋น ํ์ผ์ ๊ฐ์ธ์ฃผ๊ณ store๋ฅผ ๋ ํด์ค๋๋ค
import { Provider } from "react-redux";
import Counter from "./components/Counter";
import store from "./store";
function App() {
return (
<Provider store={store}>
<Counter />
</Provider>
);
}
export default App;
store/counterSlice.tsx
createSlice๋ฅผ ๋ง๋ค์ด์ค๋๋ค. ์ด ๋ถ๋ถ์ด ๊ธฐ์กด์ Redux์ ๊ต์ฅํ ๋ค๋ฅธ ๋ถ๋ถ์ด์์
createSlice๋ฅผ ์ธ์๋ก ๊ฐ์ฒด๋ฅผ ๋ฐ๋๋ฐ ๊ทธ ๊ฐ์ฒด๊ฐ ๊ธฐ์กด ๋ฆฌ๋์ค์์ ์ฐ๋ name, initial state, reducers ์ ๋๋ค.
dispatc์์ ๋ฉ์๋์ ์ ๊ทผํ๊ธฐ ์ฝ๊ฒ ๊ตฌ์กฐ๋ฅผ ๋ถํดํด์ ํ ๋นํด์ค๋๋ค.
import { createSlice } from "@reduxjs/toolkit";
type InitialState = {
value: number;
};
const initialState: InitialState = {
value: 0,
};
const counterSlice = createSlice({
name: "counter",
initialState,
reducers: {
up: (state, action) => {
//console.log(action) => { payload : 2 }
state.value = state.value + action.payload;
},
},
});
export default counterSlice;
export const { up } = counterSlice.actions;
store/index.tsx
store๋ฅผ ๋ง๋ค์ด์ค๋๋ค. ์ด store๋ฅผ ํตํด์ ๊ฐ ๊ฐ ํฉ์ด์ ธ์๋ reducer๋ฅผ ํ ๊ณณ์ผ๋ก ๋ชจ์์ค๋๋ค.
import { configureStore } from "@reduxjs/toolkit";
import counterSlice from "./counterSlice";
const store = configureStore({
reducer: {
counter: counterSlice.reducer,
},
});
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
export default store;
counter.tsx
useSelector๋ฅผ ์ฌ์ฉํด์ store์ state๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
import { useSelector, useDispatch } from "react-redux";
import { RootState } from "../store";
import { up } from "../store/counterSlice";
function Counter() {
const dispach = useDispatch();
const count = useSelector((state: RootState) => {
return state.counter.value;
});
return (
<div>
<div>{count}</div>
<button onClick={() => { dispach(up(2));}}>+</button>
</div>
);
}
export default Counter;
๊ณต๋ถ ์๋ฃ! ์ํ์ฝ๋ฉ๋์ ์ง์ง ๋ ์ ๋ -!