면접에서 React Dom의 작동 원리에 대해서 질문을 받았는데,,, virtual Dom이랑 Dom만 공부하고 ReactDOM이 그 과정에서 어떻게 동작하는지에 대해서는 모르고 있었다. React 사용하면서 React Dom 학습도 안 되어있는 내 자신에 충격 받고 오늘 정리를 통해 React 동작 원리를 제대로 학습하고자 한다!!
React Dom은 React에서 사용되는 가상돔(virtual Dom)을 브라우저의 실제 Dom에 동기화시키는 역할을 담당하는 라이브러리 이다.
브라우저가 이해할 수 있는 것은 html, css, javascript 뿐이다. 그래서 React에서 사용하는 jsx문은 바벨을 사용해서 순수 자바스크립트로 변환되어 진다. 그 다음에 React에서 만든 컴포넌트를 html과 연결하는 작업을 해줘야 하는데 이 작업을 도와주는 것이 React Dom이다. 그래서 최종적으로 사용자들에게 배포되어지는 파일은 index.html이 되는 것이다.
이러한 과정을 통해 React는 빠른 성능과 효율적인 UI 업데이트를 제공하면, 개발자들이 간편하게 사용자 인터페이스를 구현할 수 있게 도와준다.
React는 컴포넌트 기반의 UI 라이브러리로, 사용자 인터페이스를 작성할 때 컴포넌트들을 조합하여 구성한다. 이때 컴포넌트들을 Javascript객체로서 가상돔에 존재하게 된다.
가상돔은 브라우저의 실제돔과 일치하게 구조를 유지하면서도 실제돔보다 가벼우며, 변경된 부분만을 효율적으로 감지할 수 있다. React는 컴포넌트들의 상태 변화를 감지하고, 변경된 부분을 가상돔에 반영한다. 그리고 React Dom은 이 가상돔과 실제돔을 비교하여 변경된 부분만을 실제돔에 업데이트하는 역할을 수행한다. 이를 통해 브라우저의 리렌더링을 최소화하여 성능을 향상시킨다.
간단히 말해, React Dom은 React 애플리케이션의 가상돔과 실제돔을 관리하여 효율적인 UI렌더링을 지원하는 역할을 수행하는 라이브러리이다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta name="description" content="Web site created using create-react-app" />
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<title>React App</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<div id="modal"></div>
</body>
</html>
위의 index.html파일을 보면 body태그 안에
<div id="root"></div>
root를 id로 한 div태그 코드가 있는데 이 부분에 이제 React에서 만든 컴포넌트를 연결해줄 건데 이것을 가능하게 하는 것이 ReactDOM이다.
index.js 파일을 보면,
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter } from "react-router-dom";
import { Provider } from "react-redux";
import store from "./redux/configStore";
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<Provider store={store}>
<BrowserRouter>
<App />
</BrowserRouter>
</Provider>
);
reportWebVitals();
위의 index.js파일의 코드를 이해하면 ReactDOM이 DOM을 업데이트 한다는 말을 이해할 수 있다.
createRoot(container[,options]);
createRoot 메서드는 container 요소를 인자로 받아 root를 반환한다. 이 반환받은 root를 render 메서드와 함께 사용하면, React 요소를 DOM에 렌더링 할 수 있다고 공식문서에 나와있다.
const root = ReactDOM.createRoot(document.getElementById('root'));
그래서 이 코드를 보면 매개변수 container에 id가 root인 요소가 인자로 들어간다. 이는 index.html 파일의 body 안에 id가 root인 div를 가리키는 것이다. 👇
<div id="root"></div>
이 root가 id인 div 태그를 통해 DOM에 접근하는 것이다.
root.render(element);
render의 역할은 이름 그대로 렌더링이다. 렌더링 할 요소를 인자로 받아 컴포넌트(root)에 렌더링한다.
root.render(
<Provider store={store}>
<BrowserRouter>
<App />
</BrowserRouter>
</Provider>
);
index.js의 이 부분은 root 요소에 App컴포넌트를 렌더링하는 것이다. 즉, 우리가 작성한 컴포넌트들은 render 메서드를 통해 id가 root인 div 안에 렌더링이 된다.
React의 컴포넌트들은 이런 과정을 통해 사용자가 보는 브라우저 화면을 구성하고 작동하게 한다.
그래서 항상 index.js 파일에서 연결을 해주고,
실제로 우리가 컴포넌트를 만들어나갈 때는 app.jsx에서부터 시작하면 된다.
출처