React에서 useState를 더 안전하고 효율적으로 사용하는 방법을 알아보자. 특히 함수형 업데이트라는 기법을 통해 상태 관리를 더 똑똑하게 할 수 있다.
왜 함수형 업데이트가 필요할까?
React로 개발하다 보면 이런 경험이 있을 것이다:
- 상태 업데이트가 예상대로 동작하지 않는다
- 여러 번 상태를 변경했는데 한 번만 반영된다
- 이전 상태값이 제대로 반영되지 않는다
이러한 문제들은 대부분 React의 상태 업데이트가 비동기적으로 동작하기 때문에 발생한다. 하지만 함수형 업데이트를 사용하면 이런 문제들을 깔끔하게 해결할 수 있다.
함수형 업데이트란?
함수형 업데이트는 말 그대로 함수를 사용해서 상태를 업데이트하는 방식이다.
기존 상태를 기반으로 새로운 상태를 만들어내는 함수를 전달하는 것이다.
일반적인 방식 vs 함수형 업데이트
// 일반적인 방식 (❌ 권장하지 않음)
setCount(count + 1);
// 함수형 업데이트 (✅ 권장)
setCount(prevCount => prevCount + 1);
함수형 업데이트를 사용하면 항상 최신 상태값을 기준으로 업데이트가 이루어져서 훨씬 안전하다.
실제 사용 예시
1. 간단한 카운터
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>👉 현재 숫자: {count}</p>
<button
onClick={() => setCount(prev => prev + 1)}
className="px-4 py-2 bg-blue-500 text-white rounded"
>
숫자 올리기
</button>
</div>
);
}
2. 여러 번 상태 업데이트하기
function MultiCounter() {
const [count, setCount] = useState(0);
const increaseThreeTimes = () => {
// ✅ 이렇게 하면 정확히 3씩 증가한다
setCount(prev => prev + 1);
setCount(prev => prev + 1);
setCount(prev => prev + 1);
};
return (
<button onClick={increaseThreeTimes}>
3번 올리기
</button>
);
}
3. 조건부 상태 업데이트
function SmartCounter() {
const [count, setCount] = useState(0);
const incrementWithLimit = () => {
setCount(prev => {
// 10 이상이면 더 이상 증가하지 않는다
if (prev >= 10) {
alert('최대 10까지만 가능하다!');
return prev;
}
return prev + 1;
});
};
return (
<div>
<p>현재 값: {count}</p>
<button onClick={incrementWithLimit}>올리기</button>
</div>
);
}
함수형 업데이트의 장점 정리
1. 안전한 상태 업데이트
- 항상 최신 상태를 기준으로 업데이트된다
- 비동기 작업에서도 안전하다
2. 코드 가독성 향상
- 상태 변경 로직이 더 명확해진다
- 디버깅이 쉬워진다
3. 성능 최적화
- React의 배치 업데이트와 잘 어울린다
- 불필요한 렌더링을 줄여준다
함수형 업데이트는 React에서 상태를 다룰 때 꼭 알아야 할 중요한 개념이다.
특히 복잡한 상태 관리가 필요한 경우에 더욱 유용하다.
이 방식을 활용하면 더 안정적이고 예측 가능한 앱을 만들 수 있다.
실제 프로젝트에서 상태 업데이트가 예상대로 동작하지 않는다면, 함수형 업데이트를 적용해보자.
'개발' 카테고리의 다른 글
React useEffect와 빈 의존성 배열: 마운트/언마운트 생명주기 이해하기 (0) | 2025.02.19 |
---|---|
HTTP vs HTTPS: 웹 통신 보안의 모든 것 (0) | 2025.02.19 |
React 상태 관리(State Management) 방법과 장단점 비교 (0) | 2025.02.18 |
Claude AI vs ChatGPT: 차이점, 장단점, 활용법 총정리 (0) | 2025.02.15 |
클로저(Closure)란? (1) | 2025.02.15 |