React 18버전부터 Batching이 더욱 강화되었다.
Batching은 React에서 굉장히 중요한 개념이며 최적화에 크게 기여하고 있다고 하는데, 이번에 Batching에 대해 처음 알게 되었다...
Batching에 대해 살펴보자!
Batch는 '일괄'이란 뜻이다.
배칭 (Batching)이란 여러 개의 state 업데이트를 하나의 리렌더링으로 묶는 것을 의미한다.
React 17까지는 React event handler 내부의 업데이트까지만 batch update를 했기 때문에, Promise, setTimeout, native event handler와 그 외 모든 이벤트 내부에서의 업데이트들은 batching되지 않았다.
React 18부터 createRoot를 통해 브라우저 이벤트 뿐만 아니라 모든 업데이트들이 어디서 왔는가와 무관하게 자동으로 bathing이 적용되게 할 수 있다. (= automatic batching)
auto batching이 적용되게 할 수 있다라고 한 이유는 automatic batching을 하지 않게 할 수도 있다는 뜻이다.
ReactDOM.flushSync를 이용해 해당 상태 업데이트 호출을 배치 대상에서 제외시킬 수 있다.
function App () {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount((count) => count+1);
setCount((count) => count+1);
setCount((count) => count+1);
};
useEffect(() => {
console.log("count", count);
}, [count]);
return <button onClick={handleClick}> + </button>;
}
Javascript 기반으로 생각할 경우 console에 count1 > count2 > count3
이라고 찍힐 것 같은 느낌이 온다.
그러나, React에서는 count3
만 한 번 찍힌다.
즉, 배칭으로 인해 세 번의 상태변화가 세 번의 렌더링을 발생시키지 않고 한 번의 렌더링만을 발생시킨다.
배칭은 성능 최적화를 위해 설계됐다.
단기간에 일어나는 상태 변화를 매번 렌더링 시키지 않고, 일괄처리함으로써 성능을 최적화한다.
레스토랑 직원이 하나의 주문을 받을 때마다 주방으로 가는 것은 비효율적이다.
수 개의 주문이 동시에 들어온다면, 한 번에 받아서 주방으로 향하는 것이 효율적이다.
따라서, 일정 기간이 끝날 때까지 setState를 실행하지 않고 모아둔다.
배칭은 React event 단위로 발생한다.
function useInput () {
const [value, setValue] = useState('');
const [validation, setValidation] = useState(false);
const onChange = (e) => {
setValue(e.target.value);
}
// value가 업데이트 되면 validation 업데이트
useEffect (() => {
setValidation(validate(value));
}, [value]);
const validate = (value) => {
...
}
return {value, validation, onChange}
}
setValue, setValidation이 다른 React event에 기반하므로 렌더링이 두 번 일어난다.
function useInput () {
const [value, setValue] = useState('');
const [validation, setValidation] = useState(false);
const onChange = (e) => {
setValue(e.target.value);
setValidation(validate(e.target.value));
}
const validate = (value) => {
...
}
return {value, validation, onChange}
}
하나의 리액트 이벤트 (=onChange)에 두 가지 상태 변화를 넣음으로써, 배칭을 가능하게 하고 렌더링을 최적화했다.
<참고 : https://happysisyphe.tistory.com/41
https://pannchat.tistory.com/entry/React-18-%EC%9E%90%EB%8F%99-%EB%B0%B0%EC%B9%AD-Automatic-batching >