React에서 상태(state)를 다룰 때, 불변성(immutability)은 매우 중요한 개념입니다. useState
훅을 사용하는 경우, 상태를 변경할 때 새로운 상태를 생성하는 것이 좋습니다. 이 블로그에서는 React의 useState
와 불변성의 개념에 대해 자세히 알아보겠습니다.
useState
란?React에서 상태를 관리하기 위해 제공되는 훅 중 하나입니다. 함수형 컴포넌트에서도 상태를 사용할 수 있게 해주어, 클래스 컴포넌트의 기능을 대체합니다.
import React, { useState } from 'react';
function ExampleComponent() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
</div>
);
}
React에서 불변성을 지키지 않으면 성능 저하 및 예측 불가능한 버그가 발생할 수 있습니다. 이는 주로 React의 "얕은 비교(Shallow Comparison)"에 기인합니다. React는 상태의 변경 여부를 판단할 때, 참조 비교를 통해 이루어지기 때문입니다.
불변성을 지키면서 useState
를 사용하는 방법은 다음과 같습니다.
const [user, setUser] = useState({ name: 'John', age: 25 });
// 올바른 방법
setUser((prevUser) => ({ ...prevUser, age: 26 }));
const [numbers, setNumbers] = useState([1, 2, 3]);
// 올바른 방법
setNumbers((prevNumbers) => [...prevNumbers, 4]);
함수형 업데이트는 이전 상태를 받아와서 그 상태를 바탕으로 새로운 상태를 반환하는 함수입니다.
const [count, setCount] = useState(0);
// 올바른 방법
setCount((prevCount) => prevCount + 1);
React의 성능 최적화를 위해 PureComponent
나 React.memo
를 사용할 때, 객체나 배열이 불변성을 유지하지 않으면 제대로 동작하지 않을 수 있습니다.
React는 얕은 비교를 통해 이전 상태와 새로운 상태를 비교합니다. 따라서 참조가 같아야지만 적절한 업데이트가 이루어집니다. 만약 불변성을 지키지 않으면 예상치 못한 결과가 발생할 수 있습니다.
불변성을 유지하면 React는 더 효율적으로 업데이트를 관리할 수 있고, 상태의 변화를 예측 가능하게 만들어줍니다. useState
를 사용할 때는 항상 불변성을 유지하도록 주의하면서 코드를 작성해야 합니다.