React의 Diffing Algorithm

React DOM은 새로 그리는 화면을 최소화하기 위해서 엘리먼트를 이전 엘리먼트와 비교해서 필요한 경우에만 DOM을 업데이트하며, Diffing Algorithm에 따라 변경 전, 후의 React 엘리먼트 트리를 비교하여 가장 효과적으로 UI를 갱신할 방법을 찾는다.

2021-12-27에 씀

🤵 React에서 key prop이 하는 역할이 무엇일까요? (기억이 정확하지 않지만 이런 느낌의 질문..)

👩 가상돔을 비교하는 과정에서 쓰일 것 같습니다..


React Element는 React 앱의 가장 작은 단위이면서 불변객체이다. 불변객체의 특성 상 엘리먼트 생성 이후에는 자식이나 속성의 변경이 불가하다. 따라서 UI를 업데이트하려면 새로운 엘리먼트 객체를 만들어서 ReactDOM.render()로 새로 렌더링해 주어야 한다.

React DOM은 새로 그리는 화면을 최소화하기 위해서, 렌더링이 일어날 때, 엘리먼트를 이전 엘리먼트와 비교한 다음 다시 그려야 할 경우에만 DOM을 업데이트한다. React에서는 Diffing Algorithm에 따라 변경 전, 후의 React 엘리먼트 트리를 비교하여 가장 효과적으로 UI를 갱신할 방법을 찾는다.

React Diffing Algorithm

React Diffing Algorithm은 아래 두 가지를 가정한다.

  1. 서로 다른 타입의 두 엘리먼트는 서로 다른 트리를 만들어낸다.
  2. 개발자는 key prop을 지정하여 여러 렌더링 사이에서 어떤 자식 엘리먼트가 변경되지 않아야 할 지 표시한다.

Diff Algorithm은 아래와 같은 방식으로 진행된다.

DOM 엘리먼트 타입이 다르다면

예를 들어, <div> 엘리먼트가 <a> 엘리먼트로 바뀌는 경우, 트리 전체를 다시 구축한다. 이전의 DOM 노드들은 모두 파괴된다.

DOM 엘리먼트 타입이 같다면

DOM 노드의 자식 요소들을 처리하기 위하여 자식 리스트를 순회하며 비교하고, 차이점이 있다면 변경된 엘리먼트를 생성한다. 이 때, 자식 요소에 key prop 값을 주지 않은 상황에서, 만약 어떤 엘리먼트가 자식 리스트 사이에 새로 삽입되었다면, 그 엘리먼트가 삽입된 것으로 인식하지 못하고 해당 엘리먼트 이후의 모든 엘리먼트가 변경된 것으로 인식하여 요소를 다시 만들어 렌더링할 것이다. 이런 상황은 성능에 악영향을 준다.

따라서 각 자식 요소를 고유하게 인식하게 하기 위하여 자식 엘리먼트에는 고유한 key prop을 주는 것이 좋다. 보통 그 엘리먼트에 들어가는 데이터의 ID 값을 key prop에 전달한다. Diffing Algorithm에서 key prop을 사용하여 자식 엘리먼트를 비교하는 방식은 아래와 같다.

프로필 사진

조예진

이전 포스트
JSX란?
다음 포스트
Next.js란?