반응형
객체의 불변성
React에서 useState로 객체를 다룰 때 불변성(Immutability) 개념을 잘 이해하고 있어야, 예상대로 리렌더링이 잘 되고 버그도 예방할 수 있다.
불변성이란, 원래 객체를 직접 수정하지 않고, 복사해서 수정된 새 객체를 만드는 방식을 말한다.
React에서는 상태가 변경될 때 컴포넌트가 리렌더링되는데, 기존 객체를 직접 수정하면 변경을 감지하지 못해 리렌더링이 일어나지 않을 수 있다.
나쁜 예시 (불변성 깨짐)
const [user, setUser] = useState({ name: 'Alice', age: 25 });
// ❌ 직접 객체 수정
user.age = 26;
setUser(user);
- 이 경우 user 객체의 참조는 바뀌지 않았기 때문에, React는 "아무것도 안 바뀌었네" 하고 리렌더링하지 않을 수 있다.
좋은 예시 (불변성 지킴)
const [user, setUser] = useState({ name: 'Alice', age: 25 });
// ✅ 새 객체를 만들어서 업데이트
setUser({ ...user, age: 26 });
- 여기서 ...user는 기존의 모든 값을 복사하고,
- age: 26으로 덮어씌우면서 새로운 객체가 만들어진다.
- React는 이걸 감지하고 리렌더링한다.
참고: 중첩된 객체일 때
const [form, setForm] = useState({
name: '',
address: {
city: '',
zip: '',
},
});
// ✅ 깊은 구조에서도 객체 복사
setForm({
...form,
address: {
...form.address,
city: 'Seoul',
},
});
정리
방식 | 설명 | 리렌더링? |
obj.prop = newVal | ❌ 원본 수정 | ❌ 안 일어날 수 있음 |
setState({...obj, prop: newVal}) | ✅ 새로운 객체 생성 | ✅ 리렌더링됨 |
'프론트엔드 > React' 카테고리의 다른 글
react-share 소셜 미디어 공유 버튼 라이브러리 (0) | 2025.04.13 |
---|---|
Ant Design (1) | 2025.04.12 |
useParams vs useNavigate (1) | 2025.04.06 |
useState vs useEffect (0) | 2025.04.06 |
React 스타일링 방식 비교 (CSS Modules, styled-components, 일반 CSS) (0) | 2025.04.05 |