브라우저에서도 랜더링은 있다. HTML과 CSS 리소스를 기반으로 웹페이지에 필요한 UI를 그리는 과정을 의미한다.
리액트에서의 랜더링은 조금 다르다.
리액트에서의 렌더링이랑 리액트 에플리케이션 트리 안에 있는 모든 컴포넌트들이 현재 자신들이 가지고 있는 props와 state의 값을 기반으로 어떻게 UI를 구성하고 이를 바탕으로 어떤 DOM 결과를 브라우저에 제공할 것인지 계산하는 일련의 과정을 의미한다. 만약 props와 state같은 상태값이 없다면 해당 컴포넌트가 반환하는 JSX 값에 기반해 렌더링이 일어나게 된다.
업데이트가 필요한 컴포넌트를 발견 시 클래스 컴포넌트는 render() 함수 실행, 함수 컴포넌트의 경우는 FunctionComponent() 그 자체를 호출한 뒤, 결과물을 저장
이 렌더링 결과물을 수집 후 새로운 트리인 가상 DOM과 비교해 실제 DOM에 반영하기 위한 모든 변경 사항을 차례차례 수집함. -> 리액트의 재조정
이 단계는 렌더 단계와 커밋 단계 총 두 단계로 분리되어 실행 됨.
렌더 단계(Render Phase)는 컴포넌트 렌더링 및 변경 사항을 계산하는 모든 작업을 말함.
비교하는 것은 크게 세 가지로 type, props, key.
렌더 단계의 변경 사항을 실제 DOM에 적용해 사용자에게 보여주는 과정을 말함. 이 단계가 끝나야 비로소 브라우저의 렌더링이 발생.
메모이제이션 최적화는 오랜 논쟁의 주제이다.
메모이제이션 역시 리소스를 쓰는 작업이므로, 무엇이 이득일지 고민해봐야한다.
기본적으로 리액트는 이전 렌더링 결과를 다음 렌더링과 구별하기 위해 저장해 둔다. 따라서 추가적으로 드는 것은 prop에 대한 얕은 비교 정도 이다.
반면 memo를 하지 않았을 때 발생할 수 있는 문제는 다음과 같다.
시간을 투자할 여유가 있다면 1번, 시간을 투자할 여유가 없다면 의심스로운 곳에는 일단 다 적용해 볼 것을 권장함.