사전적 단어를 먼저 보자.
문서 객체 모델(The Document Object Model, 이하 DOM) 은 HTML, XML 문서의 프로그래밍 interface 이다.
저 어려운 말을 쉽게 설명해보면,
웹 페이지가 마치 책처럼 생긴 것이라고 상상해보자. 그럼 DOM은 그 책의 쪽수와 내용을 알려주는 것이다. 책의 쪽수를 보면 어디에서 어떤 내용을 찾을 수 있는지 알게 된다. 그리고 그 책에서 특정한 부분을 찾고 그 부분을 변경하거나 조작할 수 있는 도구이다.
정말 트리모양 같지 않나??😒
document
객체를 통해 DOM에 접근하고, 다양한 메서드와 속성을 사용하여 DOM 요소를 찾고 조작할 수 있다.DOM이 생성되는 시기를 보자. 먼저 브라우저 렌더링 과정을 살펴보자.
앞에서 렌더링 과정을 살펴보았다. 그런데 문제가 하나 있다. DOM을 수정할 때마다 Render Tree의 생성부터 Reflow, Repaint의 과정을 다시 수행해야 한다.
이것은 성능 저하의 주 원인이 되며, 특히 Reflow, Repaint의 과정에서 많이 발생한다. DOM에서 발생하는성능저하를 최소화 하기 위해서는 결국에는 DOM의 수정을 최소화 해야한다.
이 문제를 해결하려 Virtual DOM이 등장했다.
가상돔 때문에 오히려 메모리를 더 잡아먹는게 아닐까..?
- React의 가상 DOM은 애플리케이션의 복잡성과 성능을 고려하여 설계된 기술로, 메모리 오버헤드는 대개 상대적으로 낮은 비용으로 간주된다. 가상 DOM을 사용함으로써 개발자는 성능 최적화와 유지보수의 이점을 누릴 수 있다
리엑트에서 직접 document.으로 접근하면 안좋은점
- 리액트는 컴포넌트 상태(State)가 변경될 때마다 가상 돔을 업데이트하고 이전 가상 돔과 비교하여 실제 DOM 업데이트를 최소화한다. 직접 DOM을 조작하면 리액트가 이 변경 사항을 감지하지 못하고 불필요한 DOM 업데이트가 발생할 수 있다.
- 직접 DOM 조작은 리액트의 컴포넌트 생명주기와 관리 방식을 무시하고 코드를 복잡하게 만들 수 있다.
- 직접 DOM 조작은 다른 브라우저와 호환성 문제를 일으키거나 보안 취약점을 발생시킬 수 있다.
리엑트의 이상적인 접근방식 useRef()
훅
- 리액트에서 태그에 접근하는 가장 이상적인 방법은 Refs를 사용하는 것이다. Refs는 리액트에서 DOM 요소 또는 컴포넌트 인스턴스에 직접 접근하기 위한 방법을 제공하며, 이를 통해 DOM 요소에 접근할 수 있다. 이는 리액트의 가상 DOM을 무시하지 않고 관리할 수 있다.
가상돔이 장점만 있을까?
- 가상 DOM을 사용하면 렌더링 성능을 최적화할 수 있지만, 초기 로딩 시에는 추가적인 오버헤드가 발생할 수있다. 가상 DOM의 초기 로딩 오버헤드는 주로 성능 최적화와 초기 로딩 속도 사이의 균형을 유지하는 문제이며, 프로젝트의 요구 사항과 사용자 기대치에 따라 이 문제를 다룰 때 선택을 해야 한다.
- 작은 규모의 애플리케이션에서는 가상 DOM의 장점이 오버헤드보다 큰 가치를 가질 수 있으며, 대규모 애플리케이션에서는 초기 로딩 속도에 민감하므로 최적화가 필요할 수 있다.
가상돔과 리엑트의 최적화.. 그리고 설계원칙에 대한 내생각
관심사에 따라서 코드를 분리하고 단일 책임을 가지는 컴포넌트를 만들어야 한다.
리엑트에서 많이 들은 설계원칙이다. 결국, 컴포넌트 분할을 통해 각 컴포넌트는 독립적으로 관리되고 최적화되며 이렇게 최적화된 컴포넌트는 가상 DOM이 변경 사항을 처리할 때 불필요한 연산을 최소화하고, 렌더링이 필요한 부분만 업데이트하도록 도와준다. 이러한 최적화는 애플리케이션의 성능을 향상시키고 더 빠른 UI 업데이트를 가능한다.
리엑트의 가상돔을 이해하고, 필요성을 안다고 하면, 좀 더 클린코드 맞게 작성할 수 있을 것 같다.
참고자료
https://hyebeen2658.tistory.com/14