Automatic batching

Automatic batching

batching์ด๋ž€ ์—…๋ฐ์ดํŠธ ๋Œ€์ƒ์ด ๋˜๋Š” ์ƒํƒœ๊ฐ’๋“ค์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ํ•œ๋ฒˆ์˜ ๋ฆฌ๋ Œ๋”๋ง์— ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ชจ๋‘ ์ง„ํ–‰๋˜๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

const handleClick = () => {
  setCount(prev => prev + 1);
  setFlag(prev => !prev);
  // ์˜ค์ง ํ•œ๋ฒˆ๋งŒ ๋ฆฌ๋ Œ๋”๋ง
}
  • ํ•˜๋‚˜์˜ ํ•จ์ˆ˜ ๋‚ด์—์„œ setState๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœํ•ด๋„ ๋ฆฌ๋ Œ๋”๋ง์€ ํ•œ ๋ฒˆ๋งŒ ๋ฐœ์ƒํ•œ๋‹ค.

  • ํ•จ์ˆ˜์˜ ๋์—์„œ ์—…๋ฐ์ดํŠธ ๋˜๋ฉฐ ๋ฆฌ์—‘ํŠธ๋Š” ๋งˆ์ง€๋ง‰์— ํ•œ๋ฒˆ ๋ฆฌ๋ Œ๋”๋ง์„ ์‹œํ‚จ๋‹ค.

  • ์—ฌ๋Ÿฌ๋ฒˆ์˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์— ์ด์ ์ด ์žˆ๋‹ค.

v18 ์ด์ „ ๋ฒ„์ „์—์„œ๋„ batch update๊ฐ€ ์ง€์› ๋˜์—ˆ์ง€๋งŒ ํด๋ฆญ๊ณผ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ์ด๋ฒคํŠธ์—์„œ๋งŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ–ˆ๊ณ  api ํ˜ธ์ถœ ์ฝœ๋ฐฑํ•จ์ˆ˜๋‚˜ timeout ํ•จ์ˆ˜์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๋‹ค.

const handleClick = () => {
  somethingFetch().then(() => {
    setCount(prev => prev + 1); // re-render 1
    setFlag(prev => !prev); // re-render 2
  }) 
}

setTimeout(() => {
  setCount(prev => prev + 1); // re-rend er 1
  setFlag(prev => !prev); // re-render 2
});

React 18์—์„œ์˜ Batching

  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋ฐ–์—์„œ๋„ ๋™์ž‘ํ•˜๋„๋ก ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.

  • ํ•„์š”ํ•  ๋•Œ bach ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ์™ธ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€ ๋˜์—ˆ๋‹ค.

batch ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด?

์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ๋Š” ์ผ๊ด„ ์ฒ˜๋ฆฌ๊ฐ€ ์•ˆ์ „ํ•˜์ง€๋งŒ, ์ผ๋ถ€ ์ฝ”๋“œ๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ์งํ›„ DOM์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฝ๋Š”๋ฐ ์˜์กดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ReactDOM.flushSync() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋ฅผ ์˜ตํŠธ์•„์›ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

import { flushSync } from 'react-dom';

const handleClick = () => {
  flushSync(() => {
    setCount(prev => prev + 1); // re-render
  })
  
  flushSync(() => {
    setFlag(prev => !prev); // re-render 2
  })
}

Last updated