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

web/react hook

useSyncExternalStore

dev_been94 2024. 12. 14. 15:48
728x90
๋ฐ˜์‘ํ˜•

useSyncExternalStore

 

๐ŸŽฏ useSyncExternalStore๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

**useSyncExternalStore**๋Š” **์™ธ๋ถ€ ์ €์žฅ์†Œ(๋ฐ์ดํ„ฐ)**์˜ ์ƒํƒœ๋ฅผ React ์ปดํฌ๋„ŒํŠธ์— ๋™๊ธฐํ™”์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ›…์ด์—์š”.

์ด ํ›…์€ ์ฃผ๋กœ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: Redux, Zustand ๋“ฑ)๋ฅผ React ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•ด์š”.
์™ธ๋ถ€ ์ €์žฅ์†Œ์—์„œ ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ํ™”๋ฉด์— ์ฆ‰์‹œ ๋ฐ˜์˜๋˜๋„๋ก ๋„์™€์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์š”.

 

๐Ÿ  ์‹ค์ƒํ™œ ๋น„์œ : ๋‰ด์Šค ์•Œ๋ฆผํŒ

๋™๋„ค์— ๋‰ด์Šค ์•Œ๋ฆผํŒ์ด ํ•˜๋‚˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ด์š”. ๐Ÿ“ฐ

  • ์ด ์•Œ๋ฆผํŒ์€ ์™ธ๋ถ€ ์ €์žฅ์†Œ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๊ด€๋ฆฌ๋ผ์š”.
  • ์‚ฌ๋žŒ๋“ค์ด ์•Œ๋ฆผํŒ์˜ ๋‚ด์šฉ์„ ๋ณด๊ณ  ์ตœ์‹  ์†Œ์‹์„ ํ™•์ธํ•˜์ฃ .
  • ๋‰ด์Šค๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์•Œ๋ฆผํŒ์— ์ฆ‰์‹œ ๋ฐ˜์˜๋˜๊ณ , ์‚ฌ๋žŒ๋“ค์€ ์ƒˆ ์†Œ์‹์„ ํ™•์ธํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ **useSyncExternalStore**๋Š” ์•Œ๋ฆผํŒ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•˜๊ณ , ๋‚ด์šฉ์ด ๋ฐ”๋€Œ๋ฉด ํ™”๋ฉด์— ๋ฐ”๋กœ ๋ณด์—ฌ์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์š”!

 

๐Ÿ› ๏ธ useSyncExternalStore ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

React ์ฝ”๋“œ๋กœ ์˜ˆ์‹œ๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ๊ฒŒ์š”.
์™ธ๋ถ€ ์ €์žฅ์†Œ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์ฆ‰์‹œ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

 

1. ๊ฐ„๋‹จํ•œ ์™ธ๋ถ€ ์ €์žฅ์†Œ ๋งŒ๋“ค๊ธฐ

// ์™ธ๋ถ€ ์ €์žฅ์†Œ (store)๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
const store = {
  value: 0, // ์ดˆ๊ธฐ ์ƒํƒœ
  listeners: new Set(), // ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ์‹คํ–‰ํ•  ๋ฆฌ์Šค๋„ˆ๋“ค

  // ์ƒํƒœ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ํ•จ์ˆ˜
  subscribe(listener) {
    this.listeners.add(listener);
    return () => this.listeners.delete(listener); // ๊ตฌ๋… ํ•ด์ œ
  },

  // ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜
  getSnapshot() {
    return this.value;
  },

  // ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜
  setValue(newValue) {
    this.value = newValue;
    this.listeners.forEach((listener) => listener()); // ๋ชจ๋“  ๋ฆฌ์Šค๋„ˆ ์‹คํ–‰
  },
};

export default store;

 

2. useSyncExternalStore๋กœ ์™ธ๋ถ€ ์ƒํƒœ ์‚ฌ์šฉํ•˜๊ธฐ

import React, { useSyncExternalStore } from "react";
import store from "./store";

function Counter() {
  // ์™ธ๋ถ€ ์ €์žฅ์†Œ์˜ ์ƒํƒœ๋ฅผ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค.
  const value = useSyncExternalStore(
    store.subscribe, // ์ƒํƒœ๊ฐ€ ๋ฐ”๋€” ๋•Œ ์‹คํ–‰๋  ๊ตฌ๋… ํ•จ์ˆ˜
    store.getSnapshot // ํ˜„์žฌ ์ƒํƒœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜
  );

  const increment = () => {
    store.setValue(value + 1); // ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ
  };

  return (
    <div>
      <h1>์นด์šดํ„ฐ: {value}</h1>
      <button onClick={increment}>+1 ์ฆ๊ฐ€</button>
    </div>
  );
}

export default Counter;

 

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

  1. ์™ธ๋ถ€ ์ €์žฅ์†Œ (store)
    • store๋Š” ๊ฐ’(value)์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๊ตฌ๋…(subscribe)๊ณผ ์ƒํƒœ ์กฐํšŒ(getSnapshot) ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์š”.
    • setValue๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ’์ด ๋ฐ”๋€Œ๊ณ , ๊ตฌ๋…ํ•œ ๋ฆฌ์Šค๋„ˆ๋“ค์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  2. useSyncExternalStore ์‚ฌ์šฉ
    • useSyncExternalStore๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ์ €์žฅ์†Œ๋ฅผ React ์ปดํฌ๋„ŒํŠธ์™€ ์—ฐ๊ฒฐํ•ด์š”.
    • store.subscribe๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์‹คํ–‰๋  ๊ตฌ๋… ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • store.getSnapshot์€ ํ˜„์žฌ ์ƒํƒœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  3. ์ƒํƒœ ์—…๋ฐ์ดํŠธ
    • ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ store.setValue๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์™ธ๋ถ€ ์ €์žฅ์†Œ์˜ ๊ฐ’์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
    • ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด useSyncExternalStore๊ฐ€ ์•Œ์•„์„œ ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ ค์ค˜์š”.

 

๐Ÿงฉ ์–ธ์ œ useSyncExternalStore๋ฅผ ์‚ฌ์šฉํ• ๊นŒ์š”?

  1. ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ
    • Redux, Zustand, MobX ๊ฐ™์€ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ React๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ์œ ์šฉํ•ด์š”.
  2. ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ
    • ์™ธ๋ถ€์—์„œ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋ฉด React ์ปดํฌ๋„ŒํŠธ๋„ ๋ฐ”๋กœ ๋ฐ˜์‘ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•ด์š”.
  3. ์„ฑ๋Šฅ ์ตœ์ ํ™”
    • useSyncExternalStore๋Š” ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์ตœ์ ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ๊ฐ์ง€ํ•ด์„œ React ๋ Œ๋”๋ง์„ ์ตœ์†Œํ™”ํ•ด์š”.

 

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

useSyncExternalStore๋Š” ์™ธ๋ถ€ ์ €์žฅ์†Œ์˜ ์ƒํƒœ๋ฅผ React ์ปดํฌ๋„ŒํŠธ์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋™๊ธฐํ™”ํ•˜๋Š” ํ›…์ด์—์š”.

728x90
๋ฐ˜์‘ํ˜•

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

useTransition  (0) 2024.12.14
useState  (0) 2024.12.14
useRef  (0) 2024.12.14
useReducer  (0) 2024.12.14
useOptimistic  (0) 2024.12.14
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•
250x250