Data Flows in React - team-yaza/mozi-client GitHub Wiki

๊ฐœ์š”

์ด ๊ธ€์€ React์˜ Data Flow๋ฅผ 3000๋ฏธํ„ฐ ์œ„์—์„œ ๋ฐ”๋ผ๋ณด๋Š” ๊ธ€ ์ž…๋‹ˆ๋‹ค. ๊ธ€์˜ ์‹œ์ž‘์œผ๋กœ React์™€ ๊ฐ™์€ SPA๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์œ ์ €๊ฐ€ ์„œ๋ฒ„์— ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  2. ์„œ๋ฒ„๋Š” React bundle์ด ๋“ค์–ด์žˆ๋Š” HTML ํŒŒ์ผ์„ ๋ณด๋‚ด์ค๋‹ˆ๋‹ค.
  3. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ React bundle์„ fetchingํ•ด์™€์„œ React code๋กœ ํŽ˜์ด์ง€๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
  4. ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ์œ ์ €์—๊ฒŒ ๋ฐ˜ํ™˜๋˜๊ณ  React๊ฐ€ ๊ทธ ๋ฐ์ดํ„ฐ๋กœ DOM์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ ์ด์•ผ๊ธฐํ•  ๋‚ด์šฉ์€ 4๋ฒˆ๊ณผ ๊ด€๋ จ์ด ๊นŠ์Šต๋‹ˆ๋‹ค.

Data Flow in React

React์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค.(useEffect, redux..๋“ฑ)

์šฐ๋ฆฌ๊ฐ€ ์œ„์™€ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ–ˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

React๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์„ ํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋Š” ๋ถ€๋ชจ์—์„œ ์ž์‹์œผ๋กœ ํ๋ฆ…๋‹ˆ๋‹ค.

C, D, E์— ๊ฐ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ fetchingํ•˜๋Š” ๋กœ์ง์ด ๋‹ด๊ฒจ์ ธ ์žˆ๋‹ค๊ณ  ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(B๋Š” ์ œ์™ธ)

function PageA({ userId }) {
	return (
      <C userId={userId}>
      	<D userId={userId} />
        <E userId={userId} />
      </C>   
    )
}

C์˜ ๋ฐ์ดํ„ฐ fetching์ด ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€. ๋‹ค์‹œ๋งํ•˜๋ฉด C์ปดํฌ๋„ŒํŠธ์—์„œ D์™€ E๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์ „๊นŒ์ง€ D์™€ E๋Š” fetching์„ ์‹œ์ž‘์กฐ์ฐจ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ„ ๊ทธ๋ฆผ์—์„œ ๋” ์œ„์—์žˆ๋Š” React ๋กœ๊ณ ๋ฅผ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ํ•˜๋ฉด ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ fetching์ด ์‹œ์ž‘๋˜๊ณ  ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๋‹ค์Œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ data fetching์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ง  ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ๋™์‹œ์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ฃ .

์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ Network Waterfall์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํŽ˜์ด์Šค๋ถ์—์„œ๋Š” ์ด ๋ฌธ์ œ๋ฅผ GraphQL๊ณผ Relay๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. (๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ GraphQL Frament๋ฅผ ํ†ตํ•ด ๊ตฌ์ฒดํ™”ํ•˜๊ณ , Relay๋Š” fragments๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ ์„œ๋ฒ„์™€ ํ•œ๋ฒˆ์˜ ํ†ต์‹ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ fetching ํ•ฉ๋‹ˆ๋‹ค.)

GraphQL์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฐฑ์—”๋“œ๋ฅผ GraphQL๋กœ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š” ์ œ์•ฝ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ์š”?

์ •๋ง ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.(props drilling)

Props Drilling

useDataFor*() ํ›…์€ ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ fetchingํ•˜๋Š” ํ›…์ž…๋‹ˆ๋‹ค.

useDataForD()์™€ useDataForE()๊ฐ€ useDataForC()๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ์†์„ฑ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด useDataForD()์™€ useDataForE()๋ฅผ C ์ปดํฌ๋„ŒํŠธ์— ๋Œ์–ด์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.

๊ทธ ํ›„ props drilling์œผ๋กœ ์•„๋ž˜ ์ปดํฌ๋„ŒํŠธ์— ๋‚ด๋ ค์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.(ํ•œ๋ฒˆ์— ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ชจ๋“  ์š”์ฒญ์„ ํ•˜๊ณ  props๋กœ ๋‚ด๋ ค์ค๋‹ˆ๋‹ค.)

ํ•˜์ง€๋งŒ ์œ„ ๊ฒฝ์šฐ๋Š” ์ด์ƒ์ ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. D์™€ E๋Š” C๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋ง์ด์ฃ .

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ useDataForC() ํ›…์ด ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

c: {
	d: "dID"
  	e: "eID"
}

๊ทธ๋ฆฌ๊ณ  D์™€ E๋Š” ๊ทธ ์•„์ด๋””๋ฅผ ์ด์šฉํ•œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

// D๊ฐ€ ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ
d: {
	friends: [...]
}
// E๊ฐ€ ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ
e: {
   songs: [...]      
}

์ด ์ƒํ™ฉ์„ ๋‹ค์‹œ ์ด์ƒ์ ์ธ data fetching์œผ๋กœ ๋ฐ”๊ฟ”๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฒซ๋ฒˆ์งธ fetch์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด Join์„ ํ™œ์šฉํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒ€์›๋“ค(๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด)๊ณผ ๋Œ€ํ™”๋ฅผ ํ†ตํ•ด ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง์„ ์ƒ๋‹จ ์ปดํฌ๋„ŒํŠธ๋กœ ์˜ฌ๋ฆฌ๊ณ  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋Šฆ๊ฒŒ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด useDataForC() ํ›…์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ํ†ตํ•ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๊ณ  props drilling์œผ๋กœ ๋‚ด๋ ค์คŒ์œผ๋กœ์จ Network Waterfall์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Example

์ง€๊ธˆ๊นŒ์ง€ ์„ค๋ช…ํ•œ ๋‚ด์šฉ์„ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ๋ Œ๋”๋งํ•˜๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด์„œ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ธ”๋กœ๊ทธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์—๋Š” ๊ธ€๋“ค(writings)์ด ์žˆ๊ณ  ๊ธ€ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—๋Š” ์ž‘์„ฑ์ž์˜ profile ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธ€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง์ด ๋˜์—ˆ์ง€๋งŒ profile ์ปดํฌ๋„ŒํŠธ๋Š” ๊ธ€์ด ๋ Œ๋”๋ง์ด ๋œ ์ดํ›„์—์•ผ ๋ฐ์ดํ„ฐ fetching์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ Network Waterfall์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง์„ ์ตœ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค์„œ Props Drilling ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

React๋Š” View๋ฅผ ์ž˜ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง์„ ์ƒ๋‹จ ์ปดํฌ๋„ŒํŠธ๋กœ ๋Œ์–ด์˜ฌ๋ฆผ์œผ๋กœ์จ View์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(FLUX)

์ด๊ฒŒ React๊ฐ€ ์˜๋„ํ•œ Data Flow์ž…๋‹ˆ๋‹ค.

Drastic Props Drilling

๊ณผ๊ฐํ•œ Props Drilling

Props Drilling์ด ๋‚˜์˜๊ธฐ๋งŒ ํ•œ ๊ฒƒ์ผ๊นŒ์š”? ์ €๋Š” React์˜ ํŠน์ง•์ธ ๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์„ ์ž˜ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Props Drilling์„ ํ•˜๋ฉด ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์ด ํ•œ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

Props Drilling์ด ์•ˆ์ข‹๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ์ƒ์œ„ props๋“ค์ด ํ•˜์œ„๋กœ ์ „๋‹ฌ๋˜๋Š” ์œ ํ†ต๊ณผ์ •์—์„œ ์ค‘๊ฐ„์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ทธ props๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์˜ค์ง ์ „๋‹ฌ์„ ์œ„ํ•œ ๋งค๊ฐœ์ฒด๋กœ ์‚ฌ์šฉ๋  ๋•Œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Props Drilling์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ…Œ์ŠคํŒ…ํ•˜๊ธฐ๋„ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. ์˜์กดํ•˜๋Š” ๊ฒƒ์ด props๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.(์ „์—ญ์ƒํƒœ, Context, react-query๋“ฑ์— ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

์ „์—ญ ์ƒํƒœ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ปดํฌ๋„ŒํŠธ๋‹ต๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ(์ปดํฌ๋„ŒํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ), ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค.

๋ชจ๋“  React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ ์ ˆํ•œ deps์˜ Props Drilling๊ณผ ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ€ ์กฐํ™”๋ฅผ ์ด๋ฃจ์–ด์•ผํ•˜๋ฉฐ, ์ ์ ˆํ•œ Data Flow์„ ๊ฐ–์„ ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

React-Query

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐ์ดํ„ฐ fetching์„ ๋งค์šฐ ์‰ฝ๊ฒŒํ•ด์ฃผ๋Š” react-query์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค. react-query๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  Props Drilling์œผ๋กœ ๋‚ด๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

React๋Š” View๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ณ  ReactDOM์€ UI๋ฅผ ์‹ค์ œ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ๋ Œ๋”๋งํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ fetchingํ•˜๋Š” ๊ฒƒ์—๋Š” ๊ด€์‹ฌ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ fetchingํ•œ ๋ฐ์ดํ„ฐ๋ฅผ UI์— ๋ฐ˜์˜์‹œํ‚ค๋Š” ๊ฒƒ์—๋งŒ ๊ด€์‹ฌ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

React์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์—๋Š” useEffect์—์„œ fetch ์š”์ฒญ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ redux์™€ ๊ฐ™์€ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ isLoading, isError, isSuccess์™€ ๊ฐ™์€ ์ƒํƒœ๋ฅผ ์ง์ ‘ ์ •์˜ํ•ด์•ผํ•˜๊ณ  ๋งŽ์€ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ˆ˜๋ฐ˜ํ•˜๋Š” ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

react-query๋Š” ์ด๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋‹ค์ˆ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ชจ๋“  ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ react-query๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•œ ํ›„ ๋‚จ๊ฒจ์ง€๋Š” ์ „์—ญ ์ƒํƒœ๋Š” ๋งค์šฐ ์ ์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํƒœ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

const globalState = {
   projects, // server state
   teams, // server state
   tasks, // server state
   users, // server state
   themeMode, // client state
   sidebarStatus, // client state
 }

์—ฌ๊ธฐ์„œ ์„œ๋ฒ„์ƒํƒœ๋ฅผ react-query๋กœ ์˜ฎ๊ธด๋‹ค๋ฉด ์ „์—ญ ์ƒํƒœ๋Š” ๋งŽ์ด ๊ฑฐ์˜ ๋‚จ์ง€ ์•Š๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

const globalState = {
   themeMode,
   sidebarStatus,
 }

์ด๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋Š” react-query์˜ ์—ญํ• ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ์œ„ํ•ด ํ•„์š”ํ–ˆ๋˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹จ ๋ช‡์ค„์˜ ์ฝ”๋“œ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.