Reducer는 JavaScript에서 상태(state)를 관리하기 위해 사용하는 함수로, 특히 Redux나 React의 useReducer Hook에서 활용됩니다.
Reducer는 아래와 같은 역할을 합니다:
Reducer의 기본 구조
const reducer = (state, action) => {
switch (action.type) {
case 'INCREMENT':
return { ...state, count: state.count + 1 };
case 'DECREMENT':
return { ...state, count: state.count - 1 };
default:
return state;
}
};
Reducer의 특징
컴포넌트가 많아지고 상태가 여러 곳에서 관리되다 보면 상태 변경 로직이 흩어지고 코드가 복잡해집니다. 이를 해결하기 위해 상태 변경 로직을 한 곳에 모으고 체계적으로 관리하려는 필요성이 생겼습니다. Reducer는 상태와 상태를 변경하는 로직을 한 곳에 모아 관리하게 합니다.
Reducer는 순수 함수로 작성되기 때문에, 입력(state, action)에 따라 항상 동일한 결과를 반환합니다. 이로 인해 상태 변경 과정을 예측할 수 있고, 디버깅과 테스트가 용이합니다.
React는 컴포넌트 기반으로 UI를 구축하며, 컴포넌트 간 상태를 공유하고 관리해야 하는 경우가 많습니다. Reducer를 활용하면 React에서 상태 변경을 명확하게 정의하고 관리할 수 있습니다. 특히, 복잡한 상태 관리가 필요한 상황에서 유용합니다.
1. 단일 책임 원칙: 상태 관리 로직이 한 곳에 집중되어 가독성과 유지보수성이 좋아짐.
2. 예측 가능성: 같은 입력에 대해 항상 같은 결과를 반환하므로 디버깅이 쉬움.
3. 불변성 유지: 기존 상태를 직접 수정하지 않고 새로운 상태를 반환하므로 버그를 예방할 수 있음.
4. 확장성: 액션을 추가하여 상태 변경 로직을 쉽게 확장 가능.
Redux에서의 Reducer
const initialState = { count: 0 };
function counterReducer(state = initialState, action) {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
}
React의 useReducer Hook
const initialState = { count: 0 };
function counterReducer(state = initialState, action) {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
}
결론
Reducer는 상태 관리 로직을 체계적으로 관리하기 위해 등장했으며, React와 Redux 환경에서 상태를 예측 가능하고 유지보수하기 쉽게 만들어주는 중요한 개념입니다. 복잡한 상태 관리가 필요한 프로젝트에서 특히 유용합니다.