- Published on
리액트 가상DOM이란?
- Authors
- 이름
- Samdasoo1076
- @Samdasoo1076
가상 DOM 이란?
가상 DOM을 알기까지 위한 :
사용자가 웹을 들어가면 최소한 HTML, CSS, JS를 사용 하는 웹에 들어가게 된다. 그리고 실제 파싱하는 순서도 HTML, CSS, JS 순이다.
순서대로 간단하게 설명하자면
HTML :
- 첫 번째로 파싱됨
- 웹 페이지의 기본 구조, 컨텐츠 정의
- HTML 문서 파싱과 동시에 DOM 트리 생성
CSS :
- 두 번째로 파싱됨
- HTML의 정의된 요소들의 스타일 결정
- HTML 파싱, DOM 구성 후에 브라우저에 다운로드 되고 해석됨.
JS :
- 세 번째에 파싱됨
- DOM 생성이 완료 된 후에 다운로드, 해석됨
HTML 내용이 먼저 나타나고, 스타일이 적용된 후에 JavaScript에 의한 동작이 추가 됨
그럼 뭐가 문제인가?
내가 기초지식으로 알고 있는 리액트는 JS에서 HTML을 소환한다.
뭔가 이상하다.. 그럼 순서가 어떻게 되는거지?
AI에게 물어봤다
가상 DOM에 대해 더 깊게 들어가보자
1. 초기 로딩
HTML 파일 로드
- 브라우저는 리액트 애플리케이션의 기본 HTML 파일(일반적으로
public/index.html
)을 다운로드 - 이 HTML 파일은 최소한의 마크업을 포함하며, 리액트가 렌더링될 루트 요소를 정의
- 브라우저는 리액트 애플리케이션의 기본 HTML 파일(일반적으로
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>React App</title>
</head>
<body>
<div id="root"></div>
<!-- 리액트가 렌더링될 루트 요소 -->
<script src="/static/js/bundle.js"></script>
<!-- 번들된 JS 파일 -->
</body>
</html>
2. 리액트 애플리케이션 초기화
- 리액트 DOM 라이브러리
- 로드된 JavaScript 파일은 리액트 라이브러리와 애플리케이션 코드를 실행
ReactDOM.render
메서드를 호출하여 리액트 컴포넌트를 실제 DOM에 마운트함
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
ReactDOM.render(<App />, document.getElementById('root'))
- 가상 DOM 생성
ReactDOM.render
는 컴포넌트를 가상 DOM에 렌더링함- 가상 DOM은 메모리 내에서 실제 DOM의 가벼운 복사본을 유지하며, 변경 사항을 추적함
- JSX 코드는
React.createElement
호출로 변환되어 가상 DOM 객체를 생성함
3. 가상 DOM 업데이트 및 렌더링
컴포넌트 상태 변경
- 컴포넌트의 상태(state)나 속성(props)이 변경되면, 해당 컴포넌트와 하위 컴포넌트가 다시 렌더링됩니다.
- 이 과정에서 새로운 가상 DOM이 생성
다이프 알고리즘
- 리액트는 이전 가상 DOM과 새로운 가상 DOM을 비교하여 수정된 부분 추적
- 이 비교 작업은 효율적인 다이프 알고리즘(diffing algorithm)을 사용하여 빠르게 수행.
실제 DOM 업데이트
- 리액트는 가상 DOM 비교 결과를 바탕으로 최소한의 실제 DOM 업데이트를 수행 함
- 필요한 경우에만 실제 DOM의 요소들을 생성, 수정 또는 제거하여 성능을 최적화
4. 이벤트 및 상호작용
이벤트 바인딩
- 리액트는 이벤트 핸들러를 가상 DOM에 바인딩 함
- 이벤트가 발생하면, 리액트는 이를 가상 DOM에서 처리하여 필요한 상태 변경을 수행하고 다시 렌더링 함
재렌더링 및 최적화
- 상태나 속성 변경으로 인해 컴포넌트가 재렌더링되면, 리액트는 가상 DOM을 다시 생성하고 비교하여 최소한의 실제 DOM 업데이트를 수행함
- 리액트는 효율적인 업데이트를 위해 메모이제이션, 배치 업데이트, 불변성 등을 사용함
요약
리액트 애플리케이션의 렌더링 과정은 다음과 같이 요약할 수 있습니다:
- 초기 HTML, CSS, JavaScript 파일을 로드.
- 리액트 라이브러리를 초기화하고, 루트 컴포넌트를 가상 DOM에 렌더링.
- 컴포넌트의 상태나 속성 변경 시, 새로운 가상 DOM을 생성하고, 이전 가상 DOM과 비교하여 변경된 부분만 실제 DOM에 반영
- 이벤트와 상호작용을 통해 가상 DOM을 업데이트하고, 최소한의 실제 DOM 변경을 수행
장점
- 최소한의 업데이트
- 효율적인 다이프 알고리즘
- 효율적인 이벤트 처리
단점
- 러닝 커브 : 복잡성, JSX 문법
- 보일러플레이트 코드 : 웹팩, 바벨, 반복적 코드
- SEO : 클라이언트 사이드 렌더링
- 상태관리 : 상태관리가 복잡성
- 성능 : 메모리 사용량, 다량의 컴포넌트, 재렌더링 방지
그 외
가상 DOM 트리는 2개.
- 현재 가상 DOM 트리
- 마지막으로 렌더링한 상태를 반영한 가상 DOM
- 실제 DOM의 현재 상태와 일치
- 현재 화면에 렌더링 되어있는 상태
- 새로운 가상 DOM 트리
- 상태, 속성의 변경에 따라 다시 렌더링된 결과 나타냄
- 수정이 발생할 경우 다시 렌더링 되어 생성됨
- 새로운 가상 DOM 트리는 컴포넌트의 새로운 상태를 반영
한 줄 요약
#2024-07-05 아직까진 맛있다