리액트에서 객체와 배열 타입의 상태를 다룰 때는 불변성(immutability)을 지켜야 합니다. 불변성을 지킨다는 것은 객체 또는 배열을 직접 수정하지 않는다는 것을 의미합니다.
예를 들어, 다음과 같은 객체가 있다고 가정해봅시다.
const info = { id: 1, name: 'John Doe' };
만약 info의 name 값을 'Jane Doe'로 바꾼다면 보통 다음과 같은 코드를 작성할 것입니다.
info.name = 'Jane Doe';
리액트에서 상태를 다룰 때는 객체가 지닌 값을 바꾸고 싶다고 해서 앞에서와 같이 값을 직접 수정하면 안 됩니다. 그 대신 기존 객체는 그대로 두고, 새로운 객체를 만들어 원하는 값을 덮어씌워야 합니다.
const nextInfo = { ...info, name: 'Jane Doe' };
Note ≡
여기서 ...info는 spread 연산자 문법입니다. info 객체가 지닌 값들을 새로 만드는 객체에 펼친다고 이해하면 됩니다.
const object = { a: 1, b: 2, c: 3 }; const anotherObject = { ...object, d: 4 }; console. (anotherObject); // { a: 1, b: 2, c: 3, d: 4 } const updatedObject = { ...object, c: 10 }; console. (updatedObject); // { a: 1, b: 2, c: 10 }
spread 연산자를 사용해 특정 객체를 다른 객체 내부에 펼친 다음, 이미 존재하는 키 값에 대한 값을 지정하면 해당 값이 덮어씌워집니다.