Redux
2023. 4. 17. 21:41ㆍReact
Redux는 자바스크립트 애플리케이션의 전역 상태 관리를 위한 라이브러리로, 특히 React와 함께 많이 사용됩니다. Redux는 애플리케이션의 상태를 한 곳에서 중앙 집중적으로 관리하여 상태의 일관성을 유지하고, 상태 변경을 예측 가능하게 만드는 것이 목표입니다.
Redux의 핵심 개념은 "단일 상태 저장소(Single Source of Truth)"로, 모든 상태가 하나의 전역 스토어에 저장되고, 이 스토어를 통해 상태가 관리됩니다. 이 구조는 복잡한 애플리케이션에서도 상태 추적과 디버깅을 용이하게 합니다.
Redux의 핵심 개념
- 스토어(Store):
- Redux는 애플리케이션의 모든 상태를 단일 저장소(스토어)에 보관합니다. 이 스토어는 상태를 저장하고 관리하는 중앙 집중적인 역할을 합니다.
- React 애플리케이션에서는
Provider
를 통해 스토어를 하위 컴포넌트에 제공하여 전역 상태에 접근할 수 있게 합니다.
- 액션(Action):
- 액션은 상태를 변경하려는 의도를 설명하는 객체입니다. 각 액션은
type
필드를 가지고 있으며, 필요한 경우 추가 데이터를 포함할 수 있습니다. - 예를 들어,
"INCREMENT"
또는"DECREMENT"
같은type
필드를 가진 액션 객체가 상태 변경의 의도를 전달합니다.
const incrementAction = { type: 'INCREMENT' }; const decrementAction = { type: 'DECREMENT' };
- 액션은 상태를 변경하려는 의도를 설명하는 객체입니다. 각 액션은
- 리듀서(Reducer):
- 리듀서는 현재 상태와 액션을 받아서 새로운 상태를 반환하는 함수입니다. 상태 변경 로직은 모두 리듀서에 정의됩니다.
- 리듀서는 불변성을 유지하면서 상태를 변경해야 하며, 항상 새로운 상태 객체를 반환해야 합니다.
function counterReducer(state = { count: 0 }, action) { switch (action.type) { case 'INCREMENT': return { count: state.count + 1 }; case 'DECREMENT': return { count: state.count - 1 }; default: return state; } }
- 디스패치(Dispatch):
dispatch
함수는 액션을 스토어에 전달하여 리듀서를 실행시키고 상태를 변경합니다.- 컴포넌트에서 상태를 변경하려면
dispatch
를 호출하고, 액션 객체를 전달합니다.
store.dispatch({ type: 'INCREMENT' });
- 구독(Subscribe):
subscribe
를 통해 상태 변화에 따라 특정 함수가 호출되도록 할 수 있습니다. 이를 통해 상태가 변경될 때 UI를 자동으로 업데이트할 수 있습니다.
Redux의 기본 구조와 동작 흐름
- 사용자가 액션을 발생시킵니다(예: 버튼 클릭).
- 디스패치(dispatch)를 통해 액션이 스토어로 전달됩니다.
- 스토어는 전달된 액션과 현재 상태를 리듀서(reducer)에 전달합니다.
- 리듀서는 액션의
type
에 따라 상태를 업데이트하고 새로운 상태를 반환합니다. - 스토어는 새로운 상태를 저장하고, 상태가 변경되었음을 애플리케이션에 알립니다.
- 컴포넌트는 변경된 상태를 받아 UI를 다시 렌더링합니다.
Redux 사용 예제
아래는 Redux를 사용하여 간단한 카운터 애플리케이션을 만든 예제입니다.
1. Redux 설정
import { createStore } from 'redux';
// 리듀서 정의
function counterReducer(state = { count: 0 }, action) {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
}
// 스토어 생성
const store = createStore(counterReducer);
2. 상태 변경
// 상태 변경을 위한 액션 디스패치
store.dispatch({ type: 'INCREMENT' });
console.log(store.getState()); // { count: 1 }
store.dispatch({ type: 'DECREMENT' });
console.log(store.getState()); // { count: 0 }
3. 구독 및 상태 업데이트
store.subscribe(() => console.log(store.getState()));
store.dispatch({ type: 'INCREMENT' }); // { count: 1 }
store.dispatch({ type: 'INCREMENT' }); // { count: 2 }
store.dispatch({ type: 'DECREMENT' }); // { count: 1 }
Redux의 장점과 단점
장점:
- 상태 일관성 유지: 모든 상태가 한 곳에 집중되어 관리되므로 상태 일관성을 쉽게 유지할 수 있습니다.
- 디버깅 용이성: 상태 변화가 예측 가능하고 기록이 가능하여 디버깅과 상태 추적이 용이합니다.
- 확장성과 유지보수성: 상태 관리가 잘 구조화되어 있어 대규모 애플리케이션에서도 확장성과 유지보수성이 높습니다.
단점:
- 보일러플레이트 코드: 액션, 리듀서, 스토어 설정 등으로 코드가 길어지고 복잡해질 수 있습니다.
- 초기 학습 난이도: 개념이 많고, 상태 관리 패턴이 복잡하여 초반에 이해하는 데 시간이 걸릴 수 있습니다.
Redux와 Context API의 비교
- Context API는 전역 상태가 단순한 경우에 적합하며, 상태가 복잡하지 않거나 자주 변경되지 않는 경우 효율적입니다.
- Redux는 상태가 복잡하고, 많은 컴포넌트에서 상태를 공유하거나 변경이 자주 발생하는 애플리케이션에서 적합합니다.
Redux Toolkit
최근에는 Redux Toolkit이라는 라이브러리가 Redux의 보일러플레이트 문제를 해결하고, 더 간단하게 Redux를 사용할 수 있도록 돕고 있습니다. Redux Toolkit을 사용하면 상태 관리가 더욱 직관적이고, 코드가 간결해집니다.
요약
Redux는 전역 상태를 관리하는 강력한 라이브러리로, 대규모 애플리케이션에서 상태를 일관성 있게 유지하고 예측 가능하게 만들어줍니다. store
, reducer
, action
, dispatch
등의 개념을 통해 상태 관리를 구조화하여 복잡한 상태를 체계적으로 관리할 수 있습니다.
'React' 카테고리의 다른 글
Axios (0) | 2024.11.04 |
---|---|
Promise (0) | 2024.11.04 |
react project 실행 관련 (0) | 2024.11.04 |
Context API (0) | 2024.10.24 |
Hook (0) | 2024.10.24 |