둘 다 React element를 DOM에 렌더링하기 위해 사용된다.
ReactDOM.render()
는 React 컴포넌트를 DOM의 컨테이너로 렌더링하는 전통적인 방법이다.
import ReactDOM from 'react-dom';
import MyComponent from './MyComponent';
ReactDOM.render(<MyComponent />, documt.getElementById('root');
// 업데이트가 발생해서 다시 렌더링해도 DOM 엘리먼트를 통해 Root에 접근한다.
createRoot()
는 React 18 버전에서 새로 도입된 함수이다. React의 새로운 렌더링 방식인 Concurrent 모드에서 사용된다. 즉, React가 자동으로 Concurrent 모드를 사용하게 된다.
import ReactDOM from 'react-dom';
import MyComponent from './MyComponent';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<MyComponent />);
// 업데이트가 발생했을 때, container를 다시 넘겨줄 필요가 없다.
[hydrationRoot()](https://velog.io/@ggong/React-18%EC%97%90%EC%84%9C-ReactDOM.render-%EB%8C%80%EC%8B%A0-createRoot-%EC%93%B0%EA%B8%B0)
라는 메소드도 도입되었다고 한다.Concurrent 모드 (동시 모드)
애플리케이션의 사용자 경험을 향상시키기 위해, 컴포넌트의 렌더링을 중단하고 다시 시작할 수 있는 기능을 말한다. 리액트는 UI 렌더링 도중 렌더링 이외의 모든 작업을 차단한다(자바스크립트 자체가 싱글 스레드이기 때문!). 따라서 동시성
을 활용해 여러 작업을 작은 단위로 나눈 뒤, 그들 간의 우선순위를 정하고 그에 따라 작업을 번갈아 수행한다. 즉, 작업 간의 전환이 매우 빠르게 이루어지면서 동시에 수행되는 것 처럼 보이게 한다.
ReactDOM.render()
를 사용하면 기존 blocking mode로 렌더링이 된다.
createRoot()
를 사용하면 concurrent 모드로 렌더링이 되는 것!
따라서, createRoot()를 사용하면 React 애플리케이션에서 Concurrent 모드를 더 쉽게 활성화하고, 더 높은 성능을 얻을 수 있다.
Concurrent 모드에 대해 처음 접하기도 했고, React에 대해 완벽히 이해하지 않은 상태로 접하다보니 개념과 원리에 대해 아직 파악하지 못한 것 같다.