elice/WIL

[week_09] React ์ƒํƒœ ๊ด€๋ฆฌ

1. ์ƒํƒœ ๊ด€๋ฆฌ

  • ์•ฑ ์ƒ์—์„œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์— ์ €์žฅํ•˜๊ณ  ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ
  • ํ•œ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ์˜ ์ƒํƒœ, ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ƒํƒœ, ์ „์ฒด ์•ฑ์˜ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ชจ๋‘ ํฌํ•จ

1-1. MPA์™€ SPA์—์„œ์˜ ์ƒํƒœ ๊ด€๋ฆฌ

  • MPA: ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง โžก ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ์™€ ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํฐ ์ฐจ์ด๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค.
  • SPA: ์ž์ฒด์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–๊ณ , ์„œ๋ฒ„์™€์˜ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ์„ ์ฒ˜๋ฆฌ. ๊ทธ ์™ธ์˜ ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ๋งŒ์˜ ๋ฐ์ดํ„ฐ๋กœ ์œ ์ง€.

1-2. ์ƒํƒœ ๊ด€๋ฆฌ ๊ธฐ์ˆ ์ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ๋“ค

1) ๋ฐ์ดํ„ฐ ์บ์‹ฑ๊ณผ ์žฌํ™œ์šฉ

  • SPA์—์„œ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ๋งˆ๋‹ค ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋”ฉํ•œ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ธก๋ฉด์—์„œ MPA๋ฅผ ํฌ๊ฒŒ ๋„˜์–ด์„œ๊ธฐ ํž˜๋“ค๋‹ค.
  • ๋ณ€๊ฒฝ์ด ์žฆ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜๊ณ  ์žฌํ™œ์šฉ
  • ๋ณ€๊ฒฝ์ด ์žฆ๋‹ค๋ฉด, ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ ์‹œ์ ์„ ํŒŒ์•…ํ•ด ์ตœ์ ํ™”

2) Prop Drilling

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณต์žกํ•ด์ง€๋А ๊ฒฝ์šฐ, ์ƒ์œ„ ๋ถ€๋ชจ์™€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊นŠ์ด๊ฐ€ ์ปค์ง„๋‹ค.
  • Context API ๋“ฑ์„ ํ™œ์šฉํ•ด์„œ, ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฒฐํ•ฉ์„ฑ์„ ๋‚ฎ์ถ˜๋‹ค.

 

2. Flux Pattern

  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด
  • Unidirectional(์ผ๋ฐฉํ–ฅ) data flow๋ฅผ ํ™œ์šฉ, ๋ฐ์ดํ„ฐ์˜ ์—…๋ฐ์ดํŠธ์™€ UI ๋ฐ˜์˜์„ ๋‹จ์ˆœํ™”
  • ํ•˜๋‚˜์˜ Action์ด ํ•˜๋‚˜์˜ Update๋งŒ์„ ๋งŒ๋“ค๋„๋ก ํ•œ๋‹ค.
  • data์™€ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅด๋ฏ€๋กœ UI์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฝ๋‹ค.

2-1. Flux ๊ตฌ์กฐ

  • Action โžก Dispatcher โžก Store โžก View ์ˆœ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ํ๋ฅธ๋‹ค.
  • store๋Š” ๋ฏธ๋ฆฌ dispatcher์— callback์„ ๋“ฑ๋กํ•ด, ์ž์‹ ์ด ์ฒ˜๋ฆฌํ•  action์„ ์ •์˜
  • action creator๋Š” action์„ ์ƒ์„ฑํ•˜์—ฌ dispatcher๋กœ ๋ณด๋ƒ„
  • dispatcher๋Š” action์„ store๋กœ ๋„˜๊น€
  • store๋Š” action์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ›„, ๊ด€๋ จ view๋กœ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ ๋ฐœ์ƒ
  • view๋Š” ๊ทธ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๋ฐ›์•„์™€ ์ƒˆ๋กœ์šด UI๋ฅผ ๋งŒ๋“ฆ
  • ์œ ์ € ์ธํ„ฐ๋ ‰์…˜์ด ๋ฐœ์ƒํ•˜๋ฉด view๋Š” action์„ ๋ฐœ์ƒ

 

3. useState, useRef, useContext, useReducer

  • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ๋ฅผ ๋‘๊ณ , ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ์™€ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ํ•จ์ˆ˜๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

3-1. useState

const [state, setState] = useState(initState | initFn)
  • ๋‹จ์ˆœํ•œ ํ•˜๋‚˜์˜ ์ƒํƒœ ๊ด€๋ฆฌ์— ์ ํ•ฉ
  • state๊ฐ€ ๋ฐ”๋€Œ๋ฉด, state๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”
  • useEffect์™€ ํ•จ๊ป˜ state์— ๋ฐ˜์‘ํ•˜๋Š” ํ›… ๊ตฌ์ถ•

3-2. useRef

  • ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๋ฆฌ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ๋ฅผ ์ •์˜
  • ์ฆ‰, ์ƒํƒœ๊ฐ€ UI์˜ ๋ณ€๊ฒฝ๊ณผ ๊ด€๊ณ„์—†์„ ๋•Œ ์‚ฌ์šฉ ex) setTimeout์˜ timerId ์ €์žฅ
  • uncontrolled component์˜ ์ƒํƒœ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋“ฑ, ๋ฆฌ๋ Œ๋”๋ง์„ ์ตœ์†Œํ™”ํ•˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ์— ์‚ฌ์šฉ ex) Dynamic Form

3-3. useContext

  • ์ปดํฌ๋„ŒํŠธ์™€ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•  ๋•Œ ์‚ฌ์šฉ
  • ๋ถ€๋ถ„์ ์ธ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์ƒํƒœ ๊ด€๋ฆฌ, ์ „์ฒด ์•ฑ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ชจ๋‘ ๊ตฌํ˜„
  • Context Provider ์•ˆ์—์„œ ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š”, useContext๋ฅผ ์ด์šฉํ•ด ๋ฐ”๋กœ context value๋ฅผ ๊ฐ€์ ธ์˜ด
  • context value๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ชจ๋‘ ๋ฆฌ๋ Œ๋”๋ง

3-4. useReducer

const [state, dispatch] = useReducer(reducer, initState)
  • useState๋ณด๋‹ค ๋ณต์žกํ•œ ์ƒํƒœ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ
  • ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด flux pattern์— ๊ธฐ๋ฐ˜ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๊ตฌํ˜„
  • nested state ๋“ฑ ๋ณต์žกํ•œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒํƒœ์˜ ํ•œ๊บผ๋ฒˆ์— ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, ์–ด๋–ค ์ƒํƒœ์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์ ์šฉํ•  ๋•Œ ์œ ์šฉ
  • ์ƒํƒœ๊ฐ€ ๋ณต์žกํ•˜๋‹ค๋ฉด, useState์— ๊ด€ํ•œ callback์„ ๋‚ด๋ ค์ฃผ๋Š” ๊ฒƒ๋ณด๋‹ค dispatch๋ฅผ prop์œผ๋กœ ๋‚ด๋ ค ๋ฆฌ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ