기존에는 1979년에 고안된 MVC 디자인 패턴을 사용하였다. 관심사의 분리에 따라 분업화하는 디자인 패턴이다.
하지만 단점도 존재하는데 아래 그림처럼 하나의 컨트롤러가 여러 모델에 걸쳐 데이터를 조작하고 있는 상황. 모델은 여러 뷰를 업데이트 하고, 뷰 또한 컨트롤러를 통해 모델을 업데이트 합니다(양방향 데이터 바인딩) 바인딩: 뷰와 데이터를 연결하는 것
컨트롤러가 일으킨 조작이 정확히 어떤 요소들에 대한 업데이트를 일으켰는지 파악하기 어렵다.
매우 효율적인 디자인 패턴이지만 점점 고도화 되는 웹어플리케이션에는 부적합하여 안정적인 상태관리가 필요해짐.
export const addCart = (item) => { // 액션 "생성 함수"
return {
type: "ADD_ITEM", // 액션 "객체"
payload: item,
};
};
const INITIAL_STATE = [];
// redux/cart.js
export default function cartReducer(state = INITIAL\_STATE, action) {
switch (action.type) {
case "ADD\_ITEM":
return \[...state, action.payload\]; // 이전 상태에 새로운 item을 추가
case "DELETE\_ITEM":
return state.filter((product) => product.id !== payload.id);
default:
return state; // 해당 사항 없으면 이전 상태를 그대로 리턴
}
}
// redux/index.js
import { combineReducers } from "redux";
import cartReducer from "./cartReducer";
export default combineReducers({ cartReducer });
store.getState()
로 읽어올 수 있습니다.import { Provider } from "react-redux";
import { createStore } from "redux";
import rootReducer from "./store/reducers";
const store = createStore(rootReducer);
ReactDOM.render(
,
document.getElementById("root")
);
```
6. Middleware
정리하자면 Reducer란.
View
에서 유저가 일으키는 행동에 맞게 Action
객체가 생성되고,Dispatcher
를 통해 Reducer
로 전달되고,Store
를 변경하고,View
로 반영된다.
리덕스를 사용하는 핵심 이유는 기존 props drilling이 아닌 외부에 어느 위치에서든 다이렉트 접근 가능한 store라는 저장소를 설정해서 훨씬 간결해지고,
또한 성능에도 영향을 끼치는데 리액트는 props, state가 바뀌었을 때 리렌더링을 하게된다. 예를 들어 기존 props로 A
Z까지 전달하게 된다면(B ~
Y구간에는 이 props를 사용하지 않는다.) A의 state, props 바뀌면 불필요한 리런데링으로 사이트 성능이 안좋다.
기본 리액트의 기능만으로 대응하기 힘들 정도로 애플리케이션의 상태 관리가 복잡해졌다는 확신이 들 때 리덕스를 사용한다.
[React] 리액트 설계구조를 어떻게 해야하는걸까? (0) | 2022.02.20 |
---|---|
[React] Recoil 상태관리 라이브러리 (0) | 2021.12.26 |
[React] why use styled component? (0) | 2021.12.17 |
[React] useState 비동기 처리와 함수형 업데이트 (0) | 2021.12.07 |
[React] useEffect Hook (0) | 2021.12.05 |