useState
는 React에서 함수형 컴포넌트에서 상태(state)를 관리하기 위해 제공되는 훅(Hook)입니다. 이 훅은 함수형 컴포넌트 내에서 상태를 정의하고, 그 상태를 업데이트하는 방법을 제공합니다. 아래에서 useState
의 동작 원리, 개념, 클로저, 비동기 호출 등과 관련된 내용을 설명하겠습니다.
useState
는 상태를 관리하는 Hook: 함수형 컴포넌트에서 상태를 추가할 수 있도록 하는 React의 Hook입니다. 상태는 컴포넌트가 렌더링될 때 유지되는 값으로, 컴포넌트 내에서 동적인 데이터를 다룰 때 사용됩니다.useState
는 초기 상태 값을 인자로 받아, 현재 상태 값과 그 상태를 업데이트하는 함수를 반환합니다. const [state, setState] = useState(initialValue);
형태로 사용됩니다.useState
가 반환하는 상태 값은 매번 새롭게 정의되지 않고, 이전 렌더링에서 설정된 상태가 유지됩니다.useState
를 사용해 상태를 관리함으로써, UI와 데이터의 일관성을 유지할 수 있습니다.this.state
를 사용할 수 없습니다. useState
를 통해 함수형 컴포넌트에서도 상태를 관리할 수 있게 됩니다.클로저는 함수와 그 함수가 선언될 때의 렉시컬 환경(Lexical Environment)을 기억하는 메커니즘입니다. useState
와 클로저는 밀접하게 관련되어 있습니다.
클로저와 상태 유지: useState
로 생성된 상태와 이를 변경하는 함수는 클로저에 의해 상태값을 기억합니다. 함수형 컴포넌트가 여러 번 렌더링 되더라도, 클로저를 통해 useState
의 상태는 항상 최신 상태를 유지합니다. 이는 상태 관리가 컴포넌트 내에서 안정적으로 이루어질 수 있게 해줍니다.
업데이트 함수와 클로저: setState
와 같은 상태 업데이트 함수는 클로저를 통해 이전 상태 값을 참조하여 새로운 상태를 계산하거나, 업데이트된 상태를 렌더링 주기에 전달합니다. 이 때문에 setState
에 상태를 업데이트하는 콜백 함수를 넘길 수 있습니다. 예를 들어:
const [count, setCount] = useState(0);
const increment = () => {
setCount((prevCount) => prevCount + 1);
};
이 경우, setCount의 인자로 넘겨지는 함수는 prevCount라는 이름으로 이전 상태값을 가지고 있으며, 이 값은 클로저에 의해 유지됩니다.
useState에서의 상태 업데이트는 비동기적으로 처리됩니다.
상태 업데이트의 비동기성: setState는 즉각적으로 상태를 변경하지 않습니다. React는 여러 상태 업데이트를 하나의 렌더링 주기(batch)에서 처리하여 성능을 최적화합니다. 따라서 setState를 호출한 직후에 상태 값을 참조하면 업데이트되기 전의 값이 반환될 수 있습니다.
비동기 로직에서의 상태 관리: 비동기 작업(예: API 호출)에서 useState를 사용해 상태를 관리할 때, 비동기 작업이 완료된 후 상태를 업데이트할 수 있습니다. 이러한 경우 useEffect와 같은 훅을 함께 사용하여 비동기 로직을 처리할 수 있습니다.
useEffect(() => {
async function fetchData() {
const data = await fetchSomeData();
setState(data);
}
fetchData();
}, []);
useState의 비동기적 특성
React의 배치 업데이트(batch update) 메커니즘
useState의 비동기성 + 배치 업데이트의 결합
발생할 수 있는 문제
해결 방법
프로젝트시 useState의 비동기적 특성과 배치 업데이트에 대한 이해가 부족해 setState()로 상태를 설정하고 그 상태를 다음 줄에서 바로 확인하려고 해 문제가 발생한 경험이 있었습니다. 참고
당시에는 useState의 비동기적 특성을 이해하고 문제를 해결하였습니다. 이후 공부를 더 하며 배치 업데이트와 연관된 점을 파악했고, useState의 동작원리를 더 깊이 공부하며 클로저를 이용해 이전 상태를 참조할 수 있음을 알게되었습니다.
처음 React를 공부할 때는 함수형 컴포넌트에서 간단하게 상태 관리할 수 있는 Hook으로만 이해했지만 해당 경험을 통해 동작원리를 잘 알지 못하면 버그를 발생시킬 수 있다는 점을 배웠습니다.
정리
useState는 React에서 함수형 컴포넌트의 상태를 관리하기 위한 핵심적인 도구입니다. 클로저와의 결합을 통해 상태를 안전하게 관리할 수 있으며, 비동기 작업과 함께 사용할 때 상태 관리의 복잡성을 처리할 수 있습니다. 이러한 특징들은 React 컴포넌트가 복잡한 UI를 효율적으로 관리할 수 있도록 돕습니다.
추가하면 좋은 부분이나 잘못된 점이 있다면 댓글 남겨주세요. 감사합니다 :)