๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Web

React์˜ Data Flow

 

๐Ÿ“Œ React์˜ Data Flow 

React์—์„œ **๋ฐ์ดํ„ฐ ํ๋ฆ„(Data Flow)**์€ ๋‹จ๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค.
์ฆ‰, ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ → ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ง์ ‘ ๋ถ€๋ชจ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”น React์˜ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„ (One-Way Data Flow)

  • React์—์„œ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ(props)ํ•˜๋ฉฐ, ์ž์‹์—์„œ ๋ถ€๋ชจ๋กœ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋Š” ์—†์Œ
  • ์ฆ‰, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋จผ์ € ๋ Œ๋”๋ง๋˜๊ณ , ์ดํ›„ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋จ
  • ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถ€๋ชจ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋ฏ€๋กœ Network Waterfall ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ“Œ Network Waterfall์ด๋ž€?

ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ์ดํ„ฐ ์š”์ฒญ์ด ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ์ดํ„ฐ ์š”์ฒญ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ํ˜„์ƒ

  • ์˜ˆ๋ฅผ ๋“ค์–ด, C ์ปดํฌ๋„ŒํŠธ์—์„œ D์™€ E ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ,
  • C์—์„œ ๋ฐ์ดํ„ฐ fetching์ด ๋๋‚˜์•ผ๋งŒ D์™€ E์˜ fetching์ด ์‹œ์ž‘๋จ
  • ๋น„ํšจ์œจ์ ์ด๋ฉฐ, ์ „์ฒด ๋ Œ๋”๋ง ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ด
network waterfall

 

๐Ÿ”ฅ ๊ทธ๋Ÿผ, React๋Š” ๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”๊ฐ€?

 

โŒ ์•„๋‹˜! React ์ž์ฒด๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ, ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ํ๋ฆ„์ด ์ƒ์œ„ → ํ•˜์œ„๋กœ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

๋™๊ธฐ์ (Synchronous)

  • ๋ถ€๋ชจ์˜ fetching์ด ๋๋‚˜์•ผ๋งŒ ์ž์‹์˜ fetching์ด ์‹œ์ž‘๋˜๋Š” ๊ตฌ์กฐ (Network Waterfall)
  • ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ Œ๋”๋ง๋  ์ˆ˜ ์—†์Œ

๋น„๋™๊ธฐ์ (Asynchronous)

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ fetchingํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ
  • ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ fetching์„ ์ˆ˜ํ–‰

๐Ÿ›  React์—์„œ Network Waterfall์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. GraphQL + Relay ์‚ฌ์šฉ
    • React์—์„œ๋Š” GraphQL๊ณผ Relay๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Œ
    • GraphQL์˜ Fragment ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Œ
    • Relay๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ Fragment๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ํ•œ ๋ฒˆ์˜ ์š”์ฒญ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ์ตœ์ ํ™”
    • ๋‹จ์ : GraphQL + Relay๋Š” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์„ค์ •๊ณผ ํ•™์Šต์ด ์–ด๋ ต๊ณ , ์„œ๋ฒ„ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์„ฑ๋Šฅ ๊ณ ๋ ค๊ฐ€ ํ•„์š”ํ•จ! 
  2. Props Drilling ํ™œ์šฉ
    • ๋ฐ์ดํ„ฐ fetching์„ ์ตœ์ƒ๋‹จ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‹คํ–‰ํ•˜๊ณ , props๋กœ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌ
    • ์žฅ์ : ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์‹œ์— ๋ Œ๋”๋ง๋  ์ˆ˜ ์žˆ์–ด Network Waterfall ๋ฌธ์ œ ํ•ด๊ฒฐ
    • ๋‹จ์ : ๋„ˆ๋ฌด ๋งŽ์€ props๊ฐ€ ์ „๋‹ฌ๋˜๋ฉด ์ฝ”๋“œ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€

๐Ÿ’ก React์—์„œ Data Flow๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•

React๋Š” View๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž์˜ ๋ชซ
๋”ฐ๋ผ์„œ, ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์™€ ๋ทฐ๋ฅผ ๋ Œ๋”๋งํ•˜๋ ค๋ฉด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋Œ์–ด์˜ฌ๋ ค์•ผ ํ•จ

 

โœ… ๊ฒฐ๋ก 

  • React๋Š” ๋ทฐ(View)๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ , ์ตœ์ƒ๋‹จ ์ปดํฌ๋„ŒํŠธ์—์„œ fetching ํ›„ props๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์„ ๊ถŒ์žฅ
  • ์ด๋ฅผ ํ†ตํ•ด ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ Network Waterfall ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€
  • React๋Š” ์ƒ์œ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ณ , props๋กœ ์ž์‹์—๊ฒŒ ๋‚ด๋ ค์ฃผ๋Š” ๋ฐฉ์‹(props drilling)์„ ๊ถŒ์žฅ
  • ํ•˜์ง€๋งŒ, props drilling์ด ๊ณผ๋„ํ•  ๊ฒฝ์šฐ Context API, Redux, Recoil ๋“ฑ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•จ

๐ŸŽฏ React์˜ ์˜ฌ๋ฐ”๋ฅธ Data Flow ์„ค๊ณ„ ๊ฐ€์ด๋“œ

1๏ธโƒฃ ๊ฐ€๋Šฅํ•œ ํ•œ ์ตœ์ƒ๋‹จ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ fetching
2๏ธโƒฃ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ props๋ฅผ ๋ฐ›์•„์„œ ์‚ฌ์šฉ (props drilling ํ™œ์šฉ)
3๏ธโƒฃ ํ•„์š”ํ•  ๊ฒฝ์šฐ Context API๋‚˜ Redux ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ์ตœ์ ํ™”
4๏ธโƒฃ GraphQL + Relay๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ fetching์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ ค


๐Ÿ”ฅ ์ตœ์ข… ์š”์•ฝ

  • React๋Š” **๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„(One-Way Data Flow)**์„ ๋”ฐ๋ฅธ๋‹ค.
  • ๋ถ€๋ชจ → ์ž์‹์œผ๋กœ๋งŒ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ž์‹์ด ๋ถ€๋ชจ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Network Waterfall ๋ฐœ์ƒ ๊ฐ€๋Šฅ
  • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด GraphQL + Relay ์‚ฌ์šฉ ๋˜๋Š” ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ fetching ํ›„ props๋กœ ๋‚ด๋ ค์ฃผ๋Š” ๋ฐฉ์‹(props drilling) ํ™œ์šฉ
  • React๋Š” ๋ทฐ ๋ Œ๋”๋ง์„ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ fetching์„ ์ตœ์ƒ๋‹จ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ , props๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์„ ๊ถŒ์žฅ
  • ํ•˜์ง€๋งŒ props drilling์ด ๊ณผ๋„ํ•ด์ง€๋ฉด Context API, Redux, Recoil ๋“ฑ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ’ก ์ฆ‰, React๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋น ๋ฅด๊ฒŒ View๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์ตœ์ ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค! 

 
 
 

 

์ฐธ๊ณ ์ž๋ฃŒ

https://velog.io/@hyunjine/Data-Flows-in-React