React를 다시 공부하면서 state를 관리하는 중요성에 대해서 다시금 깨달았다.
그리고 useState와 useReducer에 대한 개념을 복기하면서 이 둘의 차이에 대한 것을 명확히 짚고 넘어가야겠다고 싶었다.
이 두 훅은 모두 상태를 업데이트하고 컴포넌트 리렌더링을 트리거하는 역할을 하지만 사용목적과 구조적인 차이점이 있다.
useState란?
useState는 React에서 가장 기본적인 상태관리 훅으로 간단한 상태관리를 위해 사용된다.
상태값과 이를 업데이트 하는 함수를 반환한다.
const [state, setState] = useState(initialState);
특징
1. 단순성을 가진다. 간단한 상태를 선언하고 업데이트 할 때 유용하다.
2. 상태 관리 로직이 분리되지 않는다. 상태를 업데이트하는 로직이 컴포넌트 내부에 존재하기 때문이다.
3. setState는 비동기로 작동하며, React는 효율적인 렌더링을 위해 상태 업데이트를 일괄 처리한다.
예제
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const increment = () => setCount(count + 1);
const decrement = () => setCount(count - 1);
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>+</button>
<button onClick={decrement}>-</button>
</div>
);
}
useReducer란?
useReducer는 상태관리 로직이 더 복잡하거나, 여러 상태를 조합해야할 때 사용된다. reducer패턴을 사용하여 상태 업데이트 로직을 컴포넌트 외부로 분리한다.
특징
1. 상태 변경 로직이 복잡하거나 다양한 액션이 필요할 때 유용하다.
2. 상태 업데이트 로직을 한 곳에 집중시켜 가독성과 유지 보수성을 높인다.
3. 상태 업데이트가 동기적으로 실행된다.
예제
import React, { useReducer } from 'react';
const initialState = { count: 0 };
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
return state;
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<div>
<p>Count: {state.count}</p>
<button onClick={() => dispatch({ type: 'increment' })}>+</button>
<button onClick={() => dispatch({ type: 'decrement' })}>-</button>
</div>
);
}
useState와 useReducer의 주요 차이점 표정리
특징 | useState | useReducer |
복잡성 | 간단한 상태 관리에 적합 | 복잡한 상태와 상태 전환 로직 관리에 적합 |
상태 업데이트 방식 | 업데이트 로직이 컴포넌트 내부에 위치 | Reducer 함수로 상태 업데이트 로직을 분리 |
사용 사례 | 단순한 상태(숫자, 문자열, boolean 등) | 여러 상태를 조합하거나 다양한 액션이 필요한 경우 |
상태 초기화 | 초기 상태 값을 간단히 설정 가능 | 초기 상태와 Reducer 함수가 필요 |
상태 업데이트 함수 이름 | setState | dispatch |
코드 가독성 | 간단한 상태에는 더 직관적 | 복잡한 상태 관리에 더 체계적 |