
Redux Toolkit - 우리가 이전에 배운 리덕스를 개량한 것
리덕스를 사용하기 위해 작성했던 ducks 패턴의 요소들이 전체적인 코드의 양을 늘린다는 개발자들의 불만이 발생 =>
이것을 수용하여 코드는 더 적게, 그리고 리덕스를 더 편하게 쓰기 위한 기능들을 흡수해서 리덕스 툴킷을 만듦 =>
줄여서 RTK
리덕스 툴킷은 새로운 것이 아님
리덕스 툴킷은 리덕스와 구조나 패러다임이 모두 똑같음
컴포넌트에서 useSelector를 통해서 사용하는 것은 모두 똑같음. 바뀐 부분은 모듈 파일 하나.
리덕스의 전체 코드의 양을 줄이기 위해 새로운 API가 추가되었고
일일히 손으로 만들어 줘야 했던 ducks 패턴의 요소들이 어느정도 자동화되었음
일반 리덕스와 코드 비교
1. yarn을 통해 툴킷 설치
yarn add react-redux @reduxjs/toolkit
2. count 프로그램 코드 비교
아래 보이는 코드는 일반 리덕스의 counter 프로그램 모듈.
Action Value, Action Creator를 별도로 생성해줘야 했음.
그리고 리듀서에서 값을 어떻게 변화시킬 지 만들어줬어야 했음.
// 일반 리덕스 예시 코드
// Action Value
const ADD_NUMBER = "ADD_NUMBER";
const MINUS_NUMBER = "MINUS_NUMBER";
// Action Creator
export const addNumber = (payload) => {
return {
type: ADD_NUMBER,
payload,
};
};
export const minusNumber = (payload) => {
return {
type: MINUS_NUMBER,
payload,
};
};
// Initial State
const initialState = {
number: 0,
};
// Reducer
const counter = (state = initialState, action) => {
switch (action.type) {
case ADD_NUMBER:
return {
number: state.number + action.payload,
};
// [퀴즈 답]
case MINUS_NUMBER:
return {
number: state.number - action.payload,
};
default:
return state;
}
};
// export default reducer
export default counter;
아래 코드가 리덕스 툴킷을 사용해서 만든 counter 프로그램 모듈.
일반 리덕스를 사용했을보다 확실히 코드의 양이 줄어듦.
큰 차이점은 Action Value와 Action Creator를 이제 직접 생성해주지 않고,
Action Value, Action Creator, Reducer가 하나로 합쳐졌다는 점
Slice 라는 API를 사용하면, 저 3개를 각각 만들어줄 필요 없이 한번에 3개가 모두 만들어짐
// src/redux/modules/counterSlice.js
import { createSlice } from "@reduxjs/toolkit";
const initialState = {
number: 0,
};
const counterSlice = createSlice({
name: "counter",
initialState,
reducers: {
addNumber: (state, action) => {
state.number = state.number + action.payload;
},
minusNumber: (state, action) => {
state.number = state.number - action.payload;
},
},
});
// 액션크리에이터는 컴포넌트에서 사용하기 위해 export 하고
export const { addNumber, minusNumber } = counterSlice.actions;
// reducer 는 configStore에 등록하기 위해 export default 합니다.
export default counterSlice.reducer;
슬라이스만 자세히 보기
슬라이스는 createSlice 라는 API를 통해 만들 수 있음.
인자로 설정정보를 객체로 받는데, 그 안에 우리가 필수로 작성해줘야 하는 값은 name, initialState, reducers
//createSlice API 뼈대
const counterSlice = createSlice({
name: '', // 이 모듈의 이름
initialState : {}, // 이 모듈의 초기상태 값
reducers : {}, // 이 모듈의 Reducer 로직
})
신기한 것은
counterSlice 리듀서 객체 안에서 만들어주는 함수가 리듀서의 로직이 되면서도 동시에 Action Creator가 된다는 점.
그리고 Action Value 까지 함수의 이름을 따서 자동으로 만들어짐. 그래서 우리는 Reducer만 만들어주면 됨.
// counterSlice.js의 Slice 구조
const counterSlice = createSlice({
name: "counter",
initialState,
reducers: {
// 리듀서 안에서 만든 함수 자체가 리듀서의 로직이자, 액션크리에이터가 된다.
addNumber: (state, action) => {
state.number = state.number + action.payload;
},
minusNumber: (state, action) => {
state.number = state.number - action.payload;
},
},
});
일반 리덕스에서 export를 통해서각각의 Action Creator를 내보내주었던 것을 아래 코드로 똑같이 내보낼 수 있음.
리듀서에 로직을 추가할 때마다 함수를 추가해서 내보내주면 됨.
// 액션크리에이터는 컴포넌트에서 사용하기 위해 export 하고
export const { addNumber, minusNumber } = counterSlice.actions;
// reducer 는 configStore에 등록하기 위해 export default 합니다.
export default counterSlice.reducer;
3. configStore 비교
- 일반 리덕스
// 일반 리덕스 combineReducers 예시 코드
import { createStore } from "redux";
import { combineReducers } from "redux";
import counter from "../modules/counter";
const rootReducer = combineReducers({
counter,
});
const store = createStore(rootReducer);
export default store;
- 리덕스 툴킷
configStore에서도 크게 달라지는 점은 없음.
// src/redux/modules/config/configStore.js
import { configureStore } from "@reduxjs/toolkit";
/**
* import 해온 것은 slice.reducer 입니다.
*/
import counter from "../modules/counterSlice";
import todos from "../modules/todosSlice";
/**
* 모듈(Slice)이 여러개인 경우
* 추가할때마다 reducer 안에 각 모듈의 slice.reducer를 추가해줘야 합니다.
*
* 아래 예시는 하나의 프로젝트 안에서 counter 기능과 todos 기능이 모두 있고,
* 이것을 각각 모듈로 구현한 다음에 아래 코드로 2개의 모듈을 스토어에 연결해준 것 입니다.
*/
const store = configureStore({
reducer: { counter: counter, todos: todos },
});
export default store;
이렇게 생성한 store를 export default 해서 최상위의 index.js Provider에 주입해주는 것은 전혀 바뀐게 없음.
// index.js
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { Provider } from "react-redux";
import store from "./redux/config/configStore";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<Provider store={store}>
<App />
</Provider>
);
App.jsx에서는 툴킷을 사용해서 만든 모듈을 조회할 수 있음.
방식은 일반리덕스를 사용했을 때와 동일.
// src/App.js
import React from "react";
import { useSelector } from "react-redux";
const App = () => {
// Store에 있는 todos 모듈 state 조회하기
const todos = useSelector((state) => state.todos);
// Store에 있는 counter 모듈 state 조회하기
const counter = useSelector((state) => state.counter);
return <div>App</div>;
};
export default App;
'React' 카테고리의 다른 글
리액트 심화1 - Redux Toolkit(2) - TodoList 리덕스 툴킷으로 변환 (0) | 2023.01.18 |
---|---|
리액트 심화 - 리액트 쿼리1 (react-query 1) - 수정할 것... (1) | 2023.01.18 |
Json server + Axios 공부하기 01 (1) | 2022.12.23 |
TODOLIST 과제 영상 (0) | 2022.12.15 |
React - Redux (0) | 2022.12.12 |
github : https://github.com/dnjfht
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!