Frontend Study
Redux 기본 원리
jimmmy_jin
2025. 1. 5. 14:56
Redux가 굴러가는 원리를 알아보기 위해 몇가지 코드를 작성했다.
// import { legacy_createStore } from "redux";
const redux = require("redux");
//항상 2개의 파라미터를 받아야한다.
const counterReducer = (state = { counter: 0 }, action) => {
if (action.type === "increment") {
return {
counter: state.counter + 1,
};
}
if (action.type === "decrement") {
return {
counter: state.counter - 1,
};
}
return state;
};
const store = redux.legacy_createStore(counterReducer);
const counterSubscriber = () => {
const latestState = store.getState();
console.log(latestState);
};
store.subscribe(counterSubscriber);
store.dispatch({ type: "increment" });
store.dispatch({ type: "decrement" });
Reducer를 통해서 2개의 파라미터를 받아 설정해놓는다, state의 초기 값을 설정할 수 있고
자바스크립트 처럼 함수를 작성할 수 있다.
store라는 객체를 만들어서 해당 Reducer를 저장했다. Redux의 옵션이 바뀌어서
createStore 에서 legacy_createStore로 바뀌었다.
요즘에는 이거 말고 툴킷? 이라는 다른 방법을 사용하는 거 같다.
내가 공부하는 유데미에는 아직 업데이트가 되지 않았다.
또 store.getState()를 통해서 해당 state와 action에 접근할 수 있고
dispatch를 통해서 해당 값을 사용할 수 있다.
아래의 코드는 toolkit을 통해서 작성한 값이다.
const { configureStore, createSlice } = require("@reduxjs/toolkit");
// Slice 생성 (Reducer와 Actions를 함께 정의)
const counterSlice = createSlice({
name: "counter", // 슬라이스 이름
initialState: { counter: 0 }, // 초기 상태
reducers: {
increment(state) {
state.counter++; // 상태를 직접 수정 (immer가 처리)
},
decrement(state) {
state.counter--; // 상태를 직접 수정
},
},
});
// Actions 추출
const { increment, decrement } = counterSlice.actions;
// 스토어 생성
const store = configureStore({
reducer: counterSlice.reducer, // reducer 등록
});
// 구독자 함수
const counterSubscriber = () => {
const latestState = store.getState();
console.log(latestState);
};
// 스토어에 구독자 등록
store.subscribe(counterSubscriber);
// 액션 디스패치
store.dispatch(increment()); // increment 액션 호출
store.dispatch(decrement()); // decrement 액션 호출
변경된 주요 부분
- createSlice로 Reducer와 Actions를 정의
- createSlice를 사용하여 상태와 상태 변경 로직을 한 곳에 정의.
- increment와 decrement는 자동으로 액션 생성자가 만들어지므로 따로 정의할 필요가 없음.
- configureStore로 스토어 생성
- redux.createStore 대신 configureStore를 사용하여 간단히 스토어 생성.
- Redux DevTools와 미들웨어가 기본으로 설정됨.
- 액션 호출 간소화
- store.dispatch({ type: "increment" }) 대신 store.dispatch(increment())로 간단히 호출 가능.
- 자동 불변성 관리
- Redux Toolkit은 immer를 내장하고 있어 상태를 불변성을 신경 쓰지 않고 직접 수정할 수 있음.
결과
위 코드를 실행하면 다음과 같은 출력이 터미널에 표시됩니다:
{ counter: 1 }
{ counter: 0 }
increment와 decrement 액션이 각각 호출되어 상태가 변경된 결과입니다.
Redux Toolkit의 장점
- 코드 간결화:
- 기존 legacy_createStore와 비교해 보일러플레이트 코드가 줄어듦.
- 안정성:
- 상태를 직접 수정하는 방식이 가능하면서도 불변성 유지.
- 확장성:
- 복잡한 상태 관리 로직을 더 쉽게 추가 가능.
이 방식으로 작성하면 더 직관적이고 유지보수가 쉬운 코드를 작성이 가능해 보인다.