본문으로 건너뛰기

Batching

정보

Batching is when React groups multiple state updates into a single re-render for better performance.

React의 렌더링 과정

Rendering

상태 값이 변경되면, React는 변경된 상태 값을 중심으로 새로운 Virtual DOM을 생성

즉시 컴포넌트를 다시 호출(리렌더링)하는거이 아닌, 언제 컴포넌트를 생성할 지 최적의 시간을 계산한다.

Reconciliation(조정)

컴포넌트가 다시 호출되면, Rendering 단계에서 만든 Virtual DOM을 현재 UI에 적용된 가장 최신의 Virtual DOM과 비교한다. (Fiber로 처리)

Commit(적용)

Actual DOM에 변경된 Virtual DOM을 적용해 화면의 변화를 만들어낸다.

React Batching?

유저 이벤트가 발생하는 시점에 여러 상태 값이 변경되는 코드(ex. setState)가 있다면 모두 기다린 다음 렌더링으로 넘어간다.

React 18 이후의 Automatic Batching

  • 유저 이벤트에 연결된 함수 내에서 직접적으로 변경된 상태 값만 batching의 범위 안에 들어왔음.
    • 다시 말해 timeouts, promises, native event handlers 등은 batching이 수행되지 않음
  • 18 이후부터는 createRoot로 리액트 루트 컴포넌트를 초기화하면 promise 등의 주기 내에서도 batching이 적용 됨.
const root = createRoot(document.getElementById("root"));
root.render(<App />);

batch를 원하지 않는다면?

import { flushSync } from "react-dom"; // Note: react-dom, not react

function handleClick() {
flushSync(() => {
setCounter((c) => c + 1);
});
// React has updated the DOM by now
flushSync(() => {
setFlag((f) => !f);
});
// React has updated the DOM by now
}

참고 문서