ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

web/react dom

flushSync

dev_been94 2024. 12. 16. 17:06
728x90
๋ฐ˜์‘ํ˜•

flushSync

 

๐ŸŽฏ flushSync๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

**flushSync**๋Š” React์—์„œ ์ƒํƒœ(state) ์—…๋ฐ์ดํŠธ๋ฅผ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๊ณ  ํ™”๋ฉด์„ ๊ฐ•์ œ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์˜ˆ์š”.
๋ณดํ†ต React๋Š” ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์„œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•ด์š”.
ํ•˜์ง€๋งŒ ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” "์ง€๊ธˆ ๋‹น์žฅ ํ™”๋ฉด์— ๋ฐ˜์˜๋˜์–ด์•ผ ํ•ด!" ๋ผ๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธฐ์ฃ .

์ด๋Ÿด ๋•Œ **flushSync**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด React๊ฐ€ ์ฆ‰์‹œ ๋ Œ๋”๋งํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

 

๐Ÿ• ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ: ์Œ์‹์  ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ

์—ฌ๋Ÿฌ๋ถ„์ด ์Œ์‹์ ์—์„œ ์ฃผ๋ฌธ์„ ๋ฐ›๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ด์š”. ๐Ÿ”

  1. ๊ธฐ๋ณธ React ์ƒํƒœ ์—…๋ฐ์ดํŠธ (๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ)
    • ์†๋‹˜์ด ์ฃผ๋ฌธ์„ ํ•˜๋ฉด ์ฃผ๋ฐฉ์— ์—ฌ๋Ÿฌ ์ฃผ๋ฌธ์„ ๋ชจ์•„์„œ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ด์š”.
    • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฃผ๋ฐฉ์˜ ํšจ์œจ์„ฑ์ด ์ข‹์•„์ง€์ง€๋งŒ, ์†๋‹˜์€ ์กฐ๊ธˆ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”.
  2. flushSync๋ฅผ ์‚ฌ์šฉํ•œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ (์ฆ‰์‹œ ์ฒ˜๋ฆฌ)
    • VIP ์†๋‹˜์ด ์™€์„œ "์ œ ์ฃผ๋ฌธ์€ ๋ฐ”๋กœ ๋งŒ๋“ค์–ด ์ฃผ์„ธ์š”!" ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ์ƒํ™ฉ์ด์—์š”.
    • ์ด๋Ÿด ๋• ๊ธฐ์กด ์ฃผ๋ฌธ์„ ๋ฌด์‹œํ•˜๊ณ  ๋ฐ”๋กœ ์ฃผ๋ฐฉ์—์„œ VIP ์†๋‹˜์˜ ์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜์ฃ .

React์˜ **flushSync**๋Š” ์ด๋Ÿฐ ์ฆ‰์‹œ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์˜ˆ์š”.
์ฆ‰, ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ํ•˜๊ณ  ํ™”๋ฉด์„ ๊ฐ•์ œ๋กœ ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ› ๏ธ flushSync ์‚ฌ์šฉ๋ฒ•

flushSync๋Š” React์˜ react-dom ํŒจํ‚ค์ง€์— ํฌํ•จ๋œ ํ•จ์ˆ˜์˜ˆ์š”.
๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ํ•จ๊ป˜ ์‚ดํŽด๋ณผ๊ฒŒ์š”.

 

1. ๊ธฐ๋ณธ ์˜ˆ์‹œ: ์ƒํƒœ ์—…๋ฐ์ดํŠธ์™€ flushSync ๋น„๊ต

flushSync ์—†์ด ์ƒํƒœ ์—…๋ฐ์ดํŠธ

import React, { useState } from 'react';

export default function App() {
  const [count, setCount] = useState(0);

  const handleClick = () => {
    setCount(count + 1);
    console.log(count); // ์—…๋ฐ์ดํŠธ ์ „ ๊ฐ’์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค (๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋•Œ๋ฌธ)
  };

  return (
    <div>
      <h1>์นด์šดํŠธ: {count}</h1>
      <button onClick={handleClick}>์นด์šดํŠธ ์ฆ๊ฐ€</button>
    </div>
  );
}

์„ค๋ช…:

  • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด setCount๊ฐ€ ์‹คํ–‰๋˜์ง€๋งŒ, ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—
    ๋ฐ”๋กœ ํ™”๋ฉด์ด ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๊ณ  console.log์—๋Š” ์ด์ „ ๊ฐ’์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

flushSync๋ฅผ ์‚ฌ์šฉํ•œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ

import React, { useState } from 'react';
import { flushSync } from 'react-dom';

export default function App() {
  const [count, setCount] = useState(0);

  const handleClick = () => {
    flushSync(() => {
      setCount(count + 1);
    });
    console.log(count); // ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธ๋œ ๊ฐ’์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค
  };

  return (
    <div>
      <h1>์นด์šดํŠธ: {count}</h1>
      <button onClick={handleClick}>์นด์šดํŠธ ์ฆ๊ฐ€</button>
    </div>
  );
}

 

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

  1. flushSync ์‚ฌ์šฉ
    • flushSync ์•ˆ์—์„œ setCount๋ฅผ ์‹คํ–‰ํ•˜๋ฉด React๊ฐ€ ์ฆ‰์‹œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ํ™”๋ฉด์— ๋ฐ˜์˜ํ•ด์š”.
  2. ์ฆ‰์‹œ ๋ Œ๋”๋ง ํ™•์ธ
    • console.log๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ตœ์‹  ์ƒํƒœ ๊ฐ’์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
    • React๊ฐ€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋Œ€์‹  ์ฆ‰์‹œ ์ƒํƒœ๋ฅผ ๋ Œ๋”๋งํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.

 

๐Ÿš€ ์–ธ์ œ flushSync๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ์š”?

  1. ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์งํ›„์— DOM์ด ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•  ๋•Œ
    • ์˜ˆ: ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋‚˜ ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ์ด ์ƒํƒœ ๋ณ€ํ™” ์งํ›„์— ์ฆ‰์‹œ ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  2. ์—ฐ์†๋œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ˜์˜๋˜์–ด์•ผ ํ•  ๋•Œ
    • ์˜ˆ: ํŠน์ • ์ˆœ์„œ์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ฐ”๋กœ ํ™•์ธํ•ด์•ผ ํ•  ๋•Œ
  3. UI ๋™๊ธฐํ™”๊ฐ€ ์ค‘์š”ํ•œ ์ƒํ™ฉ
    • ์˜ˆ: ํ™”๋ฉด์— ์ค‘์š”ํ•œ ํ”ผ๋“œ๋ฐฑ(์—๋Ÿฌ ๋ฉ”์‹œ์ง€, ๋กœ๋”ฉ ํ‘œ์‹œ ๋“ฑ)์„ ์ฆ‰์‹œ ๋ณด์—ฌ์ค˜์•ผ ํ•  ๋•Œ

 

โš ๏ธ ์ฃผ์˜ํ•  ์ 

  1. ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ์„ฑ
    • flushSync๋ฅผ ๋„ˆ๋ฌด ์ž์ฃผ ์‚ฌ์šฉํ•˜๋ฉด React์˜ ๋น„๋™๊ธฐ ์ตœ์ ํ™”๊ฐ€ ๋ฌด์‹œ๋˜์–ด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์–ด์š”.
    • ๊ผญ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. React 18 ์ด์ƒ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • flushSync๋Š” React 18 ๋ฒ„์ „๋ถ€ํ„ฐ ์ง€์›๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„์ „์„ ํ™•์ธํ•˜์„ธ์š”.

 

๐ŸŒŸ ํ•œ ์ค„ ์š”์•ฝ

**flushSync**๋Š” React์—์„œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜๊ณ  ํ™”๋ฉด์— ๋ฐ”๋กœ ๋ฐ˜์˜ํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

 

๐ŸŽ‰ ๋งˆ๋ฌด๋ฆฌ

React๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์„œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜์ง€๋งŒ,
๋•Œ๋กœ๋Š” ์ƒํƒœ๊ฐ€ ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธฐ์ฃ .
๊ทธ๋Ÿด ๋•Œ **flushSync**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด React๊ฐ€ ๊ฐ•์ œ๋กœ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

๋‹ค๋งŒ ๋„ˆ๋ฌด ์ž์ฃผ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์— ๋ถ€๋‹ด์ด ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ผญ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ ์ถ”์ฒœ๋“œ๋ ค์š”! ๐Ÿ˜Š

728x90
๋ฐ˜์‘ํ˜•

'web > react dom' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

prefetchDNS  (1) 2024.12.16
preconnect  (2) 2024.12.16
hydrate  (0) 2024.12.16
findDOMNode  (0) 2024.12.16
createPortal  (0) 2024.12.16
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/01   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•
250x250