๐ 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์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
- GraphQL + Relay ์ฌ์ฉ
- React์์๋ GraphQL๊ณผ Relay๋ฅผ ํ์ฉํด ๋ฐ์ดํฐ ์์ฒญ์ ์ต์ ํํ ์ ์์
- GraphQL์ Fragment ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด ๊ฐ ์ปดํฌ๋ํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ง ์์ฒญํ ์ ์์
- Relay๋ ์ฌ๋ฌ ๊ฐ์ Fragment๋ฅผ ์กฐํฉํ์ฌ ํ ๋ฒ์ ์์ฒญ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ก ์ต์ ํ
- ๋จ์ : GraphQL + Relay๋ ๊ฐ๋ ฅํ์ง๋ง ์ค์ ๊ณผ ํ์ต์ด ์ด๋ ต๊ณ , ์๋ฒ ์๊ตฌ์ฌํญ๊ณผ ์ฑ๋ฅ ๊ณ ๋ ค๊ฐ ํ์ํจ!
- 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
'Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ํธํ์ ๋ณด์: ๋ฐ์ดํฐ ๋ณดํธ์ ์ฒซ๊ฑธ์ (0) | 2024.12.13 |
---|---|
JavaScript ์๋ฃ ๊ตฌ์กฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ (3) | 2024.11.15 |
CSS - Flex Box๋ก ๋ ์ด์์ ๋์์ธํ๊ธฐ (0) | 2024.11.04 |
์น ํ์ค๊ณผ ์น ์ ๊ทผ์ฑ์ด๋? (8) | 2024.10.29 |