리액트 불변성의 가지는 의의는 중요해서
velog에 적어보겠다.
리액트에서는 화면을 리렌더링 할지 말지를 결정할 때
state의 변화를 확인한다.
state가 변했으면 리렌더링 하는것이고 state가 변하지 않았으면 리렌더링을 하지 않는다.
그 때, state가 변했는지 변하지 않았는지 확인하는 방법이
state의 변화 전 후의 메모리 주소를 비교한다.
그래서 만약 리액트에서 원시데이터가 아닌 데이터를 수정할 때
불변성을 지켜주지 않고 직접 수정을 가하면
값을 바뀌지만 메모리 주소는 변함이 없기 때문에
리액트는 state가 변했다고 인지하니 못하게 된다.
그래서 결국 리렌더링이 일어나지 않는다.
원시 데이터의 경우 불변성을 가지기 때문에 문제가 되지 않지만
객체나 배열같은 경우에는 불변성을 가지지 않기 때문에
배열을 setState할 때 (내용을 바꾸게 된다면)
push() 라는 식으로 값을 추가하는게 아니라
불변성을 지켜주기 위해 전개연산자를 이용
let newArray = [...aray,추가할 값]이런 형태로
새로운 배열을 만들어 값을 추가하여야한다.
컴포넌트가 현재 props와 state의 상태에 기초하여 UI를 어떻게 구성할 지 컴포넌트에게 요청하는 작업을 의미한다.
랜더링 트리거
렌더링이 발생하는 경우
1. 첫 리액트 앱을 실행했을 때
2. 현재 리액트 내부에 어떤 상태에 변경이 발생했을 때
리액트 앱이 실행되고 첫 렌더링이 일어나면 리액트는 컴포넌트의 root에서 시작하여 아래쪽으로 쭉 훑으며 컴포넌트가 반환하는 JSX결과물을 DOM요소에 반영한다.
만약 여러 상태가 변경됐다면 리액트는 이를 큐 자료구조에 넣어 순서를 관리한다.
기술적 관점