Redux: ํ† ๋ก  ์š”์ฒญ: Redux "๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ", ํ•™์Šต ๊ณก์„ , ์ถ”์ƒํ™” ๋ฐ ๋…์ฐฝ์„ฑ

์— ๋งŒ๋“  2017๋…„ 03์›” 19์ผ  ยท  108์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: reduxjs/redux

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Redux ์Šคํƒ€ํ„ฐ ํ‚คํŠธ ์‚ฌ์šฉ

์ด ์Šค๋ ˆ๋“œ์˜ ์•„์ด๋””์–ด๋Š” ๊ฒฐ๊ตญ ์ƒˆ๋กœ์šด Redux Starter Kit ํŒจํ‚ค์ง€ ๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์Šคํ† ์–ด ์„ค์ •, ๋ฆฌ๋“€์„œ ์ •์˜, ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์—…๋ฐ์ดํŠธ ๋กœ์ง, ์‹ฌ์ง€์–ด ์•ก์…˜ ์ƒ์„ฑ์ž๋‚˜ ์•ก์…˜ ์œ ํ˜•์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์ž๋™์œผ๋กœ ์ƒํƒœ์˜ ์ „์ฒด "์Šฌ๋ผ์ด์Šค"๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋“ฑ ๋งŽ์€ ์ผ๋ฐ˜์ ์ธ Redux ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Redux ์Šคํƒ€ํ„ฐ ํ‚คํŠธ๊ฐ€ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ(๋ฐ ํ•ด๊ฒฐํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ)์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ "Vision for Redux Starter Kit" ์„ ์–ธ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š” .

Redux์— ๋Œ€ํ•ด ๊ฐ€์žฅ ๋งŽ์ด ๋ณธ ๋ถˆ๋งŒ์€ "๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๋‹ค"๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐฐ์šธ ๊ฒƒ์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค๋Š” ๋ถˆ๋งŒ, ์œ ์šฉํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‹ค๋ฅธ ์• ๋“œ์˜จ์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค๋Š” ๋ถˆ๋งŒ, Redux์— ์˜๊ฒฌ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ์ œ๊ณต ์ง€์นจ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ์ธก๋ฉด์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค๋Š” ๋ถˆ๋งŒ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ธก๋ฉด ์ค‘ ๋ช‡ ๊ฐ€์ง€์— ๊ด€ํ•ด @tannerlinsley ์™€ ๋ฐฉ๊ธˆ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Redux ์ฃผ๋ณ€์˜ ์ถ”์ƒํ™” ๊ณ„์ธต์ธ Jumpstate ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•™์Šต ๊ณก์„ ์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ๋ฐ "์ข‹์€" Redux ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ฒ ํ•™์  ์˜๊ฒฌ์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์ค‘์—์„œ ์šฐ๋ฆฌ๋Š” ๋” ๋„“์€ ํ† ๋ก ์„ ์œ„ํ•ด ์ œ๊ธฐํ•˜๊ณ  ์‹ถ์€ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์„ ์ƒ๊ฐํ•ด ๋ƒˆ์Šต๋‹ˆ๋‹ค.

ํ‚ค ํฌ์ธํŠธ

์ƒ์šฉ๊ตฌ / ์žฅํ™ฉํ•จ

  • Redux๋Š” "๊ฐ€์žฅ ๊ฐ„๊ฒฐํ•œ ๋ฐฉ๋ฒ•"์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ช…ํ™•ํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋ฌธ์„œ๋Š” ๋ช…ํ™•์„ฑ๊ณผ ํ•™์Šต์„ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ์žฅํ™ฉํ•œ ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ "Redux ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•"์œผ๋กœ ํŠน๋ณ„ํžˆ ์˜๋„๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ๊ทธ ์Šคํƒ€์ผ์ด ๋‹ค์†Œ ๋งน๋ชฉ์ ์œผ๋กœ ์ฑ„ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(๋˜๋Š” ๋•Œ๋•Œ๋กœ Redux๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ด).
  • "ํŒŒ์ผ์ด ๋„ˆ๋ฌด ๋งŽ์Œ", "์•ก์…˜ ์ž‘์„ฑ์ž ์‚ฌ์šฉ" ๋“ฑ๊ณผ ๊ฐ™์€ "๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ"์— ๋Œ€ํ•œ ๋นˆ๋ฒˆํ•œ ๋ถˆ๋งŒ

์ถ”์ƒํ™”์™€ ํ•™์Šต

  • ํ•ต์‹ฌ Redux ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๋Š” ์‚ฌ์‹ค์ƒ ๊ธฐ๋Šฅ์ด ์™„๋ฒฝํ•˜์ง€๋งŒ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ตฌ์ถ• ์ค‘์ธ ํฅ๋ฏธ๋กœ์šด ์• ๋“œ์˜จ๊ณผ ๋„๊ตฌ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ์ถ”์ƒํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ "ํ•™์Šต ๊ณก์„ ์„ ์‰ฝ๊ฒŒ" ๋˜๋Š” "๋”์šฑ OOP๋กœ ๋งŒ๋“ค๊ธฐ" ์œ„ํ•ด ๊ตฌ์ถ•๋˜์—ˆ์ง€๋งŒ ์ด๋“ค ๋Œ€๋ถ€๋ถ„์€ ์‹ค์ œ๋กœ "๊ด€์šฉ์ ์ธ" Redux ์‚ฌ์šฉ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • Redux ํ•™์Šต ๊ณก์„ ์€ ๊ฐ€ํŒŒ๋ฅด์ง€๋งŒ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋ฉด ์ถ”์ƒํ™” ๊ณ„์ธต์˜ ํ•„์š”์„ฑ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋ฌธ์ œ

  • ๋Œ€๋ถ€๋ถ„์˜ "๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ" ๋ถˆ๋งŒ ์‚ฌํ•ญ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • ์ƒˆ๋กœ์šด ํ•™์Šต์ž๋ฅผ ์œ„ํ•œ Redux์˜ ๊ฐ€์žฅ ์–ด๋ ค์šด ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” "์˜๊ฒฌ ์—†์Œ" ์˜์—ญ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ž ์žฌ์  ์†”๋ฃจ์…˜

  • "์ ์€ ์ƒ์šฉ๊ตฌ"๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ด€์šฉ์  Redux ์‚ฌ์šฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ๋ถˆ๋งŒ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ์–ด๋–ป๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ํ•™์Šต ๋ฐ ์‚ฌ์šฉ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ Redux๋ฅผ ์ˆจ๊ธฐ์ง€ ์•Š๊ณ (๊ทธ๋ฆฌ๊ณ  "๊ธฐ๋ณธ" Redux๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜/ํ•™์Šต ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š”) ๊ฐ€๋Šฅํ•œ ์ถ”์ƒํ™”๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ์–ด๋–ค ์‹์œผ๋กœ๋“  ๊ฐœ์„ ๋œ ๋ฌธ์„œ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์–ผ๋งˆ๋‚˜ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ปค๋ฎค๋‹ˆํ‹ฐ์— Redux ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋ถˆ๋งŒ, ๋ฌธ์ œ์  ๋ฐ ์šฐ๋ ค ์‚ฌํ•ญ์„ ์ œ์•ˆํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ œ์•ˆ๊ณผ ์•„์ด๋””์–ด๋„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ทธ๊ฒƒ์ด ๋‚˜์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ๋‹ค๋ฉด ๋‚˜๋Š” ์ด๊ฒƒ์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค :

  • ๋ฐ”๋‹๋ผ Redux๋ณด๋‹ค ํƒ€์ดํ•‘ํ•˜๊ธฐ ์‰ฌ์šด Flow/TypeScript ์นœํ™”์  ํ•˜์œ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.
  • ์ƒ์ˆ˜๋ฅผ ๊ทธ๋‹ค์ง€ ๊ฐ•์กฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋‹จ์ง€ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์‹ญ์‹œ์˜ค).
  • React ๋˜๋Š” ๋‹ค๋ฅธ ๋ทฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์„ฑ์„ ์œ ์ง€ํ•˜์ง€๋งŒ ๊ธฐ์กด ๋ฐ”์ธ๋”ฉ์„ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: mapStateToProps ๊ตฌํ˜„ ์ œ๊ณต).
  • Redux ์›์น™ ์œ ์ง€(์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ์ž‘์—…, ์‹œ๊ฐ„ ์—ฌํ–‰ ๋ฐ ํ•ซ ์žฌ๋กœ๋”ฉ์ด ์ž‘๋™ํ•ด์•ผ ํ•˜๊ณ  ์ž‘์—… ๋กœ๊ทธ๊ฐ€ ์˜๋ฏธ๊ฐ€ ์žˆ์–ด์•ผ ํ•จ).
  • ๋ณด๋‹ค ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฝ”๋“œ ๋ถ„ํ• ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ๋“€์„œ์™€ ์„ ํƒ๊ธฐ๋ฅผ ํ•จ๊ป˜ ๋ฐฐ์น˜ํ•˜๋„๋ก ์žฅ๋ คํ•˜๊ณ  ํ•จ๊ป˜ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋œ ์–ด์ƒ‰ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค(์ž‘์„ฑ โ€‹โ€‹๋ฐ ๊ตฌ์„ฑ์ด ์‰ฌ์šด ๋ฆฌ๋“€์„œ-์„ ํƒ๊ธฐ ๋ฒˆ๋“ค ์ƒ๊ฐ).
  • ์•ก์…˜ ์ƒ์„ฑ์ž๋ฅผ ๋ฆฌ๋“€์„œ์™€ ํ•จ๊ป˜ ๋ฐฐ์น˜ํ•˜๋Š” ๋Œ€์‹  ์•ก์…˜ ์ƒ์„ฑ์ž๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๊ณ  ์•ก์…˜ ๋Œ€ ๋ฆฌ๋“€์„œ์˜ ๋‹ค๋Œ€๋‹ค ๋งคํ•‘์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ํ”ผํ•˜๋Š” ๋Œ€์‹ ).
  • ํ•ฉ๋ฆฌ์ ์ธ ์„ฑ๋Šฅ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด Reselect๋ฅผ ํ†ตํ•œ ๋ฉ”๋ชจํ™”๊ฐ€ "๊ทธ๋ƒฅ ์ž‘๋™"ํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์‹ฑ, ์ •๊ทœํ™”, ์ปฌ๋ ‰์…˜ ๋ฐ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ์ œ๊ณต ๋„์šฐ๋ฏธ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๋น„๋™๊ธฐ ํ๋ฆ„ ์ง€์›์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ํ•ต์‹ฌ ์™ธ์—๋„ ๊ณต์‹ Redux๋กœ ๋ธŒ๋žœ๋“œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ, ๋‚˜๋Š” ์ด๊ฒƒ์„ ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  108 ๋Œ“๊ธ€

๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด:

  • redux, react-redux, redux-thunk๊ฐ€ ์ด๋ฏธ ํ•จ๊ป˜ ์—ฐ๊ฒฐ๋œ ๊ณต์‹ redux-preset ํŒจํ‚ค์ง€
  • dispatch(actionType, payload) ๋Š” ์•ก์…˜ ํฌ๋ฆฌ์—์ดํ„ฐ์˜ ํ•„์š”์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚ด์žฅ๋œ jumpstate ์Šคํƒ€์ผ ๊ฐ์†๊ธฐ ์ƒ์„ฑ๊ธฐ, ์˜ˆ: createReducer({[actionType]: (state, payload) => state}, initState)

redux๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋‚ด๊ฐ€ ์•„๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ํ™•์žฅ์„ฑ์ด ์ข‹์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์–ด redux-thunk์—์„œ ๋ฉ€์–ด์ง€๊ณ  ๊ฒฐ๊ตญ ๋„ˆ๋ฌด ๋งŽ์€ ์ผ์„ ์‹œ์ž‘ํ•˜๋Š” ์•ก์…˜ ์ œ์ž‘์ž๋กœ ์ด์–ด์ง€๋ฉฐ ์˜คํžˆ๋ ค ์ธก๋ฉด ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. - redux-observable ๋˜๋Š” redux-saga์™€ ๊ฐ™์€ ํšจ๊ณผ.

ํŠนํžˆ redux๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๊ทธ ๋งค๋ ฅ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ '๋ชจ๋ฒ” ์‚ฌ๋ก€ ์ƒ์šฉ๊ตฌ ํŒจํ‚ค์ง€'์˜ ์ผ๋ถ€๋กœ ๋ฒˆ๋“ค๋งํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ์•„์ด๋””์–ด์ธ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๋ถ€๋ถ„์€ ๋‚˜์—๊ฒŒ ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์•„๋‹ˆ๋ผ ์ ์–ด๋„ ๋‚˜์—๊ฒŒ ์ค‘์š”ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค).

Redux๋Š” "๊ฐ€์žฅ ๊ฐ„๊ฒฐํ•œ ๋ฐฉ๋ฒ•"์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ช…ํ™•ํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Redux์˜ ์ข‹์€ ์ ์€ ๊ทธ๊ฒƒ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ธฐ๋ณด๋‹ค ๋””์ž์ธ ํŒจํ„ด์— ๊ฐ€๊น๊ณ  ๋‹น์‹ ์ด ๋ณด๋Š” ๋ชจ๋“  ์ฝ”๋“œ(์Šคํ† ์–ด์™€ react-redux ์ œ์™ธ)๊ฐ€ ๋‹น์‹ ์˜ ๊ฒƒ์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค.

Jumpstate๋ฅผ ์‚ดํŽด๋ณด๋ฉด(์ง€๊ธˆ๊นŒ์ง€๋Š” ์ด์— ๋Œ€ํ•ด ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค) Redux์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ๋ณธ ์ฒซ ๋ฒˆ์งธ ์ถ”์ƒํ™” ๊ณ„์ธต ์ค‘ ์ข‹์•„ ๋ณด์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ฌ์ง€์–ด ์ข‹์•„! ๊ทธ๋Ÿฌ๋‚˜ ๋™์‹œ์— MobX์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋ฒ—์–ด๋‚˜๊ฒŒ ํ•˜๊ณ  ๋™์ผํ•œ ๊ฒƒ์„ ํ…Œ์ด๋ธ”์— ๊ฐ€์ ธ์˜ค๋Š” ์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Redux๊ฐ€ ๋‹ค๋ฅธ ๋„๊ตฌ์™€ ๋™์ผํ•œ ํ™˜๊ฒฝ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง„๊ณต ์ƒํƒœ์—์„œ Redux๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Redux๊ฐ€ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ๋‹ค๋ฅธ ์ ์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์‚ฌ์‹ค์€ ์‹ ๊ทœ ์‚ฌ์šฉ์ž๊ฐ€ Redux๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฒช๋Š” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ Redux ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ JavaScript๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Angular์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํฐ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” JavaScript ์ž์ฒด๋ฅผ ์ถ”์ƒํ™”ํ•ฉ๋‹ˆ๋‹ค. Redux ๊ฐ์†๊ธฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์ดˆ๋ณด์ž์—๊ฒŒ ์ต์ˆ™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ "๋””์ž์ธ ํŒจํ„ด"์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ์‚ฌ๋žŒ๋“ค์ด ๋Œ€์‹  ๋ธ”๋ž™๋ฐ•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋งŽ์€ ์ƒ์šฉ๊ตฌ ๊ฐ์†Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ตฌ์„ฑ ์š”์†Œ, ๊ฐ์†๊ธฐ ๋ฐ ์ž‘์—… ์ƒ์„ฑ์ž ์‚ฌ์ด์— 1:1:1 ๊ด€๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค(3๊ฐœ ๋ชจ๋‘๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ข…์ข… 2๊ฐœ). , ์—ฌ๋Ÿฌ ๋ฆฌ๋“€์„œ์˜ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ ๋“ฑ. ๊ทธ๊ฒƒ์€ ์ง์žฅ๊ณผ ๋‹ค๋ฅธ ์žฅ์†Œ์—์„œ ๋‚ด๊ฐ€ ๋Œ€๋‹ตํ•˜๋Š” #1 ์งˆ๋ฌธ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ์˜์—ญ์—์„œ ๋„์›€์ด ๋˜๋Š” ๋„๊ตฌ๋Š” ์ด๊ฒƒ์„ ์žƒ์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋˜ํ•œ "์Šค์œ„์น˜๊ฐ€ ์ด์ƒํ•˜๋‹ค"๋Š” ์„ธ๊ณ„ ์ตœ๊ณ ์˜ ์ฃผ์žฅ์ด ์•„๋‹™๋‹ˆ๋‹ค).

๋”ฐ๋ผ์„œ IMO, CTA์—๋Š” ์ข‹์€ ๋ฐ”๋‹๋ผ JavaScript ๋ฆฌ์†Œ์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  "์‹œ์ž‘ํ•˜๊ธฐ" ๊ฐœ๋…์— ๋”ฐ๋ผ "์ด์œ "๋ฅผ ๋” ๋งŽ์ด ๋ฌธ์„œํ™”ํ•˜๊ณ  ์ž‘์—…์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ์ „ํ˜€ ๋ฐฐ์šฐ์ง€ ์•Š๊ณ ๋„ Redux์—์„œ ๊ฑฐ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” redux๋ฅผ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด์ง€๋งŒ ๋ฌธ์ œ ์—†์ด Thunk๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ˆ˜์‹ญ๋งŒ ์ค„์˜ ์ฝ”๋“œ ์•ฑ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค(์ž‘์€ ์•ฑ์ด ์ฝํฌ๋กœ ์ธํ•ด ์‚ฌ๊ณ ๋ฅผ ์น˜๋Š” ๊ฒƒ๋„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค). ์•„์ฃผ ์ ์€ ์ˆ˜์˜ "ํ•ต์‹ฌ" ๊ฐœ๋…์„ ์†Œ๊ฐœํ•˜๊ณ  ๊ทธ๊ฒƒ๋“ค์ด ์–ด๋–ป๊ฒŒ ์ˆ˜๋งŽ์€ ๊ฐœ๋…์— ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์€ ๋งŽ์€ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

"๋น„์šฉ์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ์ƒ์šฉ๊ตฌ๋Š” ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค"๋Š” ์˜ค๋Š˜๋‚  ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์ปค๋ฎค๋‹ˆํ‹ฐ ์ „์ฒด์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํ•ด๊ฒฐํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ๋ถ€ํ„ฐ redux๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋Š” ์ฝ”๋“œ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ N๊ฐœ์˜ ํŒŒ์ผ ์‚ฌ์ด๋ฅผ ์ด๋™ํ•ด์•ผ ํ–ˆ์œผ๋ฉฐ ๋‹จ์ผ UI ๋ถ€๋ถ„์˜ b/c ๋กœ์ง์ด ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์— ๊ฑธ์ณ ์ž‘์—…, ์ž‘์—… ์œ ํ˜• ๋ฐ ์—ฌ๋Ÿฌ ๊ฐ์†๊ธฐ. UI์˜ ๋ชจ๋“  ์œ„์น˜์—์„œ ์ƒํƒœ ํŠธ๋ฆฌ์˜ ์–ด๋Š ๋ถ€๋ถ„์—๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹จ์ผ ์ž‘์—…(๋‚ด๊ฐ€ redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ์ด์œ )์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ƒํƒœ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์ •๋ง ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ๋‹จ์ผ ํ–‰๋™์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋ ์ˆ˜๋ก ๋‚ด ๋…ผ๋ฆฌ๊ฐ€ ๋” ํ๋ ค์ง‘๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ด๊ฒƒ ๋˜๋Š” ์ €๊ฒƒ์„ ํ–ˆ์„ ๋•Œ ์ผ์–ด๋‚œ ์ผ์„ ๋‹จ์ˆœํžˆ ์ฝ๊ฑฐ๋‚˜ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// meta code
dispatch(ACTION);

onAction = {
  ACTION: [
    // handler 1: hide spinner here,
    // handler 2: change status there,
    // handler 3: update entity
  ],
};

๊ฒฐ๊ตญ ๋‚˜๋Š” redux-interactions + redux-tree ๋ฅผ ์ƒ๊ฐํ•ด ๋ƒˆ๊ณ  ์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ฝค ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ์ ‘๊ทผ ๋ฐฉ์‹:

์ฐธ๊ณ , ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋งค์šฐ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :) ์‹ค์‹œ๊ฐ„ ๊ฐœ์ฒด ์—…๋ฐ์ดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์•„๋งˆ๋„ sagas ๋˜๋Š” observable์ด thunk/promise๋ณด๋‹ค ์ด์ ์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • redux-thunk
  • ์•ฝ์† ๋ฏธ๋“ค์›จ์–ด
  • ํด๋ผ์ด์–ธํŠธ ํŽ˜๋” ์•ฑ ์ฃผ์œ„์˜ ๋ž˜ํผ์ธ "api ๋ž˜ํผ", ํŽ˜์ด๋กœ๋“œ๊ฐ€ API ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์•ฝ์†์ธ ์•ก์…˜ ์ƒ์„ฑ์ž service(name, method, ...opts) (์˜ˆ: ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์ด๋ฅผ ์„ ํƒํ•˜๊ณ  x_FULFILLED , x_PENDING ๋ฐ x_REJECTED ). ์ด ์ž‘์—…์˜ ์ด๋ฆ„์„ ๋ฎ์–ด์“ธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € componentDidMount() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑ ์š”์†Œ ์ƒํƒœ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฅผ ์œ„ํ•ด API ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ž‘์—…์ด ๊ณ„์† ์ „์†ก๋˜๊ณ (์š”์ฒญ ์ •๋ณด์ธ ๋ฉ”ํƒ€๋ฅผ ํฌํ•จํ•˜์—ฌ ๋กœ๊ฑฐ ๋ฏธ๋“ค์›จ์–ด์— ์˜ํ•ด ๊ธฐ๋ก๋จ) ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฆฌํŒฉํ† ๋งํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. to๋Š” ์ž‘์—…์„ ์ˆ˜์‹ ํ•˜๋Š” ๊ฐ์†๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ƒํƒœ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์ž‘ํ•˜๊ณ  ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ƒํƒœ๋ฅผ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์•ก์„ธ์Šค/์ˆ˜์ •ํ•ด์•ผ ํ•  ๋•Œ redux๋กœ ๋ฆฌํŒฉํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ์ข…์ด ํ”์ ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ณณ์—์„œ redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งค๋ ฅ์„ ๋ด…๋‹ˆ๋‹ค. ํ˜„์žฌ ํŒ€๊ณผ ์ง€์› ์ผ์ •์„ ๊ฐ์•ˆํ•  ๋•Œ atm์— ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

redux-saga๋ฅผ ์กฐ๊ธˆ ์‚ฌ์šฉํ•ด ๋ณด์•˜์ง€๋งŒ ๊ฐ€์žฅ ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ํ๋ฆ„์€ ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ์ด๋ฏ€๋กœ ์ž‘๋™ํ•˜๋ฏ€๋กœ(์ฝ”๋“œ๊ฐ€ ํฌ๊ฒŒ ๋ณต์žกํ•˜์ง€ ์•Š์Œ) ์ „ํ™˜ํ•  ํฐ ์ด์œ ๋Š” ์—†์Šต๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ). ์ด์œ  - iterable + mock์€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ์— ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค). redux-observable ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฒคํŠธ๋ฅผ ๋ฉ‹์ง€๊ฒŒ ๋‘ ๋ฒˆ ํด๋ฆญํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ๊ด€์ฐฐ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์ด ์ž์ฒด์ ์œผ๋กœ ์ด์ ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ํ•œ ์ฆ‰๊ฐ์ ์ธ ์ด์ ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ฆฌ๋“€์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž์ฒด ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๊ฐ–๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ ๊ธฐ๋Šฅ ์œ„์— ์ž์ฒด ๊ณ ์ฐจ ๋ฆฌ๋“€์„œ๋ฅผ ๊ฐ–์ถค์œผ๋กœ์จ ์ƒ์šฉ๊ตฌ์—์„œ ์•ฝ๊ฐ„ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์„ ์ˆ˜์ •ํ•˜๋Š” ์ž‘์—…).

๋‚ด๊ฐ€ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ๋ณธ ๋ฐ˜์‘ ์•ฑ์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ํŠœํ† ๋ฆฌ์–ผ์ด๋ฉฐ, ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„ ํ†ต์‹ ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ์‹œ์—ฐํ•œ ๋‹ค์Œ, redux๋ฅผ ๋„์ž…ํ•˜๊ณ , ๊ณ„์† ์ง„ํ–‰ ํ•˜์—ฌ ํŠน์ • ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์‹œ์—ฐํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. redux-x๋กœ ๋„์›€์„ ๋ฐ›์œผ์„ธ์š” . ์ฆ‰, ์–ธ์ œ, ๋ฌด์—‡์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์•ˆ๋‚ด์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ํ† ๋ก ์ด ์žˆ๋Š” ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์ด ๋ถ„๋ช…ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ด€๋ จ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์€ gothinkster/react-redux-realworld-example-app ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์— ๋Œ€ํ•ด ์š”์•ฝ์ž…๋‹ˆ๋‹ค.

redux๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋‚ด๊ฐ€ ์•„๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ํ™•์žฅ์ด ์ž˜ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์–ด ๊ฒฐ๊ตญ redux-thunk์—์„œ ๋ฉ€์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์— ๋‚ด ์ด๋ฉด์ ์ธ ์šฐ๋ ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฑฐ๋Œ€ํ•œ JS ๊ฐœ๋ฐœ์ž ๊ทธ๋ฃน์ด ์•„์ง _ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ_ ๋ฐ ๊ธฐํƒ€ ๊ธฐ๋ณธ ES(6|2015) ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ผํ™”์ ์ธ ์ฆ๊ฑฐ๋ฅผ ์ ์  ๋” ๋งŽ์ด ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. , ์ดํ•ด ๋ถ€์กฑ, ํ˜‘๋ฐ• ๋“ฑ์œผ๋กœ ์ธํ•ด. Redux๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๊ณผ Redux๊ฐ€ ์†Œ๊ฐœํ•˜๋Š” _patterns_ ํ•™์Šต์œผ๋กœ ํ˜œํƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋จผ์ € Observable์ด๋‚˜ Generator๋ฅผ ๋ฐฐ์šฐ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์„ ์š”๊ตฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

Redux-thunk๋Š” ๋˜ํ•œ ์ผ๋ฐ˜์ ์œผ๋กœ redux ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๋‘๋‡Œ๋ฅผ ๊ตฌ๋ถ€๋ฆฐ๋‹ค๋Š” ์ ์—์„œ ์•ฝ๊ฐ„ ๋ณต์žกํ•˜์ง€๋งŒ ์ตœ์†Œํ•œ JS๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์„ ํƒํ•˜๊ธฐ ์‰ฌ์šด ํ•จ์ˆ˜/์ฝœ๋ฐฑ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. "best-practice-always-redux"๊ฐ€ ์•„๋‹Œ "learn-redux"๋กœ ํ‘œ์‹œ๋˜๋”๋ผ๋„ ๋‹จ์ผ ๋‹ค์šด๋กœ๋“œ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ด€๋ จ ๋„๊ตฌ์˜ ์™„์ „ํ•œ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ–๋Š” ์•„์ด๋””์–ด๊ฐ€ ์ •๋ง ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. create-react-app์ด ์„ค์ •ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ๋ฐฐ์šธ ๋•Œ ์กฐ์ •์ด ํ•„์š”ํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ, ์ด๊ฒƒ์€ ์ž์‹ ์˜ ์กฐ์ •์„ ์žฅ๋ คํ•  ์ˆ˜ ์žˆ๊ณ , ์•„๋งˆ๋„ ๊ฐ„๋‹จํ•œ redux-thunk ์„ค์ •์„ saga ๋“ฑ์„ ์ž์ฒด ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "ํƒˆ์ถœ"์˜ ...

๊ทธ๋ƒฅ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์— ๋‚ด ์ด๋ฉด์ ์ธ ์šฐ๋ ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฑฐ๋Œ€ํ•œ JS ๊ฐœ๋ฐœ์ž ๊ทธ๋ฃน์ด ์•„์ง ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ ๋ฐ ๊ธฐํƒ€ ๊ธฐ๋ณธ ES(6|2015) ๊ธฐ๋Šฅ์กฐ์ฐจ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ผํ™”์ ์ธ ์ฆ๊ฑฐ๋ฅผ ์ ์  ๋” ๋งŽ์ด ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. , ์ดํ•ด ๋ถ€์กฑ, ํ˜‘๋ฐ• ๋“ฑ์œผ๋กœ ์ธํ•ด. Redux๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์–ดํ•˜๊ณ  Redux๊ฐ€ ๋„์ž…ํ•œ ํŒจํ„ด์„ ํ•™์Šตํ•˜์—ฌ ํ˜œํƒ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด Observable์ด๋‚˜ Generator๋ฅผ ๋จผ์ € ๋ฐฐ์šฐ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์„ ์š”๊ตฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๋น™๊ณ ! ์šฐ๋ฆฌ๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด JS๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ํ™˜๊ฒฝ์— ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๊ทธ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค๋ฅธ ์ƒํƒœ๊ณ„(์ž๋ฐ”, ๋ ˆ์ผ ๋“ฑ)์˜ ์ˆ™๋ จ๋œ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ผ๋ฉด ๋ชจ๋ฅด๋Š” ๊ฐœ๋…์„ ๋ฐฐ์šฐ๊ธฐ ์ „์— ์•Œ๊ณ  ์žˆ๋Š” ๊ฐœ๋…์„ ๋น ๋ฅด๊ฒŒ ์‹œ๋„ํ•˜๊ณ  ์ ์šฉํ•  ๊ฒƒ์ด๊ณ  ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ๋ง‰ํžˆ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์ ์ธ UX ๋””์ž์ธ ํŒจํ„ด์— ๋›ฐ์–ด๋“ค๊ธฐ ์ „์— ์‚ฌ๋žŒ๋“ค์ด JS๋ฅผ ๊นŠ์ด ์ดํ•ดํ•˜๋„๋ก ์„ค๋“ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Redux ๋ฌธ์„œ์—๋Š” ์ง€๊ธˆ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฐพ๊ณ  ์žˆ๊ณ  Redux ์œ„์— ์ „์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๋…์ž๋ฅผ ์œ„ํ•ด Reducing Boilerplate์— ๋Œ€ํ•œ ์„น์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด ๋…ผ์˜์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•˜๋ฉฐ ์ด๊ฒƒ์ด ์•„๋งˆ๋„ ์ด๋ฏธ ๋งŽ์ด ์ž์ „๊ฑฐ๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. Redux ํŒ€์€ ์—ฌ๊ธฐ์—์„œ ์ œ์•ˆ๋  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๊ฒƒ๋“ค์„ ๋“ฃ๊ณ , ๊ณ ๋ คํ•˜๊ณ , ๊ฑฐ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๋…ผ์˜๋œ ๊ฒƒ๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ์‹ธ์šฐ๋ฉด ์ด ํ† ๋ก ์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ๋‚˜์˜ค์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

์ฆ‰, ๋ชจ๋“  ์‚ฌ๋žŒ(์‹ ๊ทœ ๋ฐ ๊ฒฝํ—˜์ž)์ด ํ”„๋ ˆ์ž„์›Œํฌ์— ๋” ์‰ฝ๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ œ์•ˆํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์€ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ถ”์ƒํ™” ์•„๋ž˜์˜ ํ•ญ๋ชฉ์œผ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ƒํ™” ์ž‘์„ฑ์ž๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•œ ํ•œ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์‚ฌํ•ญ์ด ํ•„์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์ค‘์— ํ•˜์œ„ ์ˆ˜์ค€์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ ์œ„ํ•ด ์ถ”์ƒํ™”๋ฅผ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์€ ์žฌ๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Redux ํ•™์Šต ๊ณก์„ ์€ ๊ฐ€ํŒŒ๋ฅด์ง€๋งŒ ์ผ๋‹จ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋ฉด
์ถ”์ƒํ™” ๊ณ„์ธต์€ ์ข…์ข… ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ Redux์˜ ์–ด๋–ค ๋ถ€๋ถ„์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ œ์•ˆํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰์‹œ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ถ”์ƒํ™”ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์•ฝ 1๋…„ ์ „ ์ง์žฅ์—์„œ ๊ฐ•์—ฐ์„ ์œ„ํ•ด ๋งŒ๋“  ์ „์ฒด ๋ฐ˜์‘/๋ฆฌ๋•์Šค ์ˆ˜๋ช… ์ฃผ๊ธฐ์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.
React Redux Lifecycle

์—ฌ๊ธฐ์—๋Š” ๊ฝค ๋งŽ์€ ๋ถ€๋ถ„์ด ์žˆ์ง€๋งŒ, ๊ทธ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์—†์ด Redux๊ฐ€ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ๋•Œ๋•Œ๋กœ ์„ฑ๊ฐ€์‹  ์ผ์ด์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋ทฐ ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ ๋ ˆ์ด์•„์›ƒ์ด ๊ธด๋ฐ€ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ž‘์—…์„ ์ œ๊ฑฐํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ Redux๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‚ฌ์šฉํ•˜๋Š” ์š”์ ์„ ๋†“์น˜๋Š” MVC๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋‹ค์ด์–ด๊ทธ๋žจ์˜ "๋ณด๊ธฐ"๋Š” ์ €์žฅ์†Œ๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ๋ฐ˜์‘ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ๊ฑฐ์˜ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ „์ฒด ํ”„๋ ˆ์ž„์›Œํฌ ์ž์ฒด์—์„œ ์ œ๊ฑฐํ•ด์•ผ ํ•  ์ƒ์šฉ๊ตฌ๊ฐ€ ๋งŽ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์•ก์…˜ ์ƒ์„ฑ์ž, ๋ฆฌ๋“€์„œ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ฐœ๋ณ„ ๋ถ€๋ถ„์— ์žˆ๋Š” ์ƒ์šฉ๊ตฌ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ƒ์šฉ๊ตฌ ์ค„์ด๊ธฐ ํŽ˜์ด์ง€์˜ ํŒ์€ ์ด๋ฏธ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์˜ ๋Œ€๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ "๋” ๋‚˜์€"๊ฒƒ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ทธ ์œ„์— ์•„๋ฌด๊ฒƒ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์ฐธ๊ณ : ๋” ๋‚˜์€ ๊ฒƒ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ๊ฐœ๋ฐฉ์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹จ์ง€ ์•„์ง ๋ณด์ง€ ๋ชปํ–ˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.)

์•„๋งˆ๋„ ์ด๊ฒƒ์€ ์ƒ์šฉ๊ตฌ ๊ฐ์†Œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ Redux ๊ต์œก์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฌธ์ œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ดˆ๋ณด์ž์—๊ฒŒ ์–ด๋ ต๋‹ค๋ฉด Redux ๋ฌธ์„œ๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ๋” ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ฐ์†Œํ•˜๋Š” ์ƒ์šฉ๊ตฌ ํŒ ์ค‘ ์ผ๋ถ€๋Š” ๋ฌธ์„œ์—์„œ ๋” ์ ๊ทน์ ์œผ๋กœ ๊ด‘๊ณ ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๋‹จ๊ณ„(๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ)์˜ ์–‘์„ ์ค„์ด๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด ๊ฒŒ์‹œ๋ฌผ์˜ ๋งจ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‚ด ์š”์ ์„ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ํ๊ธฐ๋  ์ถ”์ƒํ™”๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ์ข‹์€ ํ† ๋ก . ์ œ๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ "๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ" ๊ด€๋ จ ๋ถˆ๋งŒ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • "๊ฐ์ฒด๋ฅผ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด '์•ก์…˜ ์ƒ์„ฑ๊ธฐ' ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?"
  • "๊ฐ„๋‹จํ•œ ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋„ˆ๋ฌด ๋งŽ์€ ํŒŒ์ผ์„ ํ„ฐ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! ๋˜ํ•œ ์ƒ์ˆ˜ ๋ฐ ํ•จ์ˆ˜ ์ด๋ฆ„์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ณ„์† ๋ฐ˜๋ณตํ•˜๊ณ ..."
  • "AJAX ํ˜ธ์ถœ์„ ์œ„ํ•ด ์ด๋Ÿฌํ•œ '๋ฏธ๋“ค์›จ์–ด'๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?"
  • "์™œ ๋ชจ๋“  ๊ฒƒ์— switch ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?"
  • "์ด dispatch ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ž‘๋™ํ•˜๋ ค๋ฉด ์ด ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋งˆ๋ฌด๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?"

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ฃผ์„์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ "๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ" ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ผ๋ถ€ ์‘๋‹ต์„ ์ฆ‰์‹œ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋‚˜์—ด๋œ 5๊ฐ€์ง€ ๋ฒ”์ฃผ ์ค‘ " dispatch "๋งŒ ์‹ค์ œ๋กœ _ํ•„์ˆ˜_๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€:

  • ์•ก์…˜ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•  _๊ฐ€์ง€๋Š”_ ์—†์ง€๋งŒ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค(๋‚ด ๊ฒŒ์‹œ๋ฌผ Idiomatic Redux: Why use action creators? )
  • ์•ก์…˜ ์ƒ์„ฑ์ž, ์•ก์…˜ ์ƒ์ˆ˜, ๋ฆฌ๋“€์„œ์— ๋Œ€ํ•ด ์™„์ „ํžˆ ๋ณ„๋„์˜ ํŒŒ์ผ์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. "ducks" ํŒจํ„ด ์€ ๋ชจ๋“  ๊ฒƒ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ๋ชจ์œผ๋Š” ๋ฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฆฌ๋“€์„œ๊ฐ€ ํ•˜๋‚˜์˜ ์ž‘์—…์„ ์ˆ˜์‹ ํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์„ "์ˆจ๊ธฐ๊ธฐ"ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Redux๋Š” ๊ถ๊ทน์ ์œผ๋กœ ํŒŒ์ผ ๊ตฌ์กฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ์—์„œ์ฒ˜๋Ÿผ Redux ์™ธ๋ถ€์—์„œ ์™„์ „ํžˆ ๋น„๋™๊ธฐ ์ž‘์—…์„ _ํ•  ์ˆ˜_ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Redux์—์„œ ๋น„๋™๊ธฐ ํ๋ฆ„์„ ์œ„ํ•œ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์—์„œ Dan์˜ ์„ค๋ช…์— ๋”ฐ๋ผ , ์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ ์™ธ๋ถ€์—์„œ ํ•ด๋‹น ๋…ผ๋ฆฌ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ ๋ฏธ๋“ค์›จ์–ด๋Š” Redux ์ €์žฅ์†Œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋™์•ˆ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ "ํ—ˆ์ "์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜๋“œ์‹œ ๊ฐ์†๊ธฐ์—์„œ switch ๋ฌธ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” _์—†์Šต๋‹ˆ๋‹ค_. ์ฃผ์–ด์ง„ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ "๋ช…๋ฐฑํ•œ" ๋ฐฉ๋ฒ•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์กฐํšŒ ํ…Œ์ด๋ธ”, if/else ๋ฌธ ๋ฐ ์›ํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค( FAQ์— ๋”ฐ๋ผ: switch ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? )
  • ์œ ์šฉํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜๋ ค๋ฉด ์‹ค์ œ๋กœ store.dispatch() ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ _ํ•ด์•ผ_ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Redux์˜ ๊ธฐ๋ณธ ์„ค๊ณ„ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค. ์•ก์…˜ ์ƒ์„ฑ์ž๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋ฉด ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ์ž์‹ ๊ตฌ์„ฑ ์š”์†Œ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์—ฌ์ „ํžˆ ๋””์ŠคํŒจ์น˜๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ „๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ "๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ" ๋ฌธ์ œ์—์„œ _ํ•„์ˆ˜_์ธ ๊ฒƒ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ์˜ ์˜ˆ์ œ์™€ ์ค‘๋ณต ์ œ๊ฑฐ ์ฝ”๋“œ ๋ฐ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ์™€ ๊ฐ™์€ "์ข‹์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•"์˜ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.

@markerikson ์ด ์ œ๊ธฐํ•œ ์งˆ๋ฌธ์€ ์ •๋ง ๊ณต์ •ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๊ณผ๊ฑฐ ์–ด๋Š ์‹œ์ ์— ๋‚˜ ์ž์‹  ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Redux๋Š” ์–ด๋–ค ์˜๋ฏธ์—์„œ๋Š” ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์„ ์œ„ํ•œ "์ €์ˆ˜์ค€" ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์ €์ˆ˜์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์‰ฝ๊ฒŒ ์ถ”์ƒํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๊ฒƒ์„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. @gaearon ์ด ์›๋ž˜ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ตœ๋Œ€ํ•œ ์ž‘๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ์ • ๋•๋ถ„์— ์šฐ๋ฆฌ๋Š” Redux ์ฝ”์–ด์— ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ€์งˆ ํ•„์š” ์—†์ด Redux ์œ„์— ๋‹ค์–‘ํ•œ ๊ฒƒ๋“ค์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Redux ์œ„์— ์ข‹์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์•ˆ์ •ํ™”ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ(์˜ˆ: Jumpstate?)๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ด๋ฅผ ๊ฐ€๋ฅด์น˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ํ•„์š”ํ•  ๋•Œ Redux๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‰ฌ์šด ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Redux๋Š” ํ•ต์‹ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ฒƒ์„ ํ•„์š”๋กœ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์œผ๋ฉฐ ์˜๊ตฌ์ ์œผ๋กœ ์ถ”์ƒํ™”ํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๊ทธ๋ ‡๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š” :smile:) ์ œ โ€‹โ€‹์ƒ๊ฐ์—๋Š” Redux ์ฝ”์–ด์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์•ˆ์ •์ ์ด๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ์˜ต์…˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งํ–ˆ๋“ฏ์ด "๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ"๋Š” ์‹ค์ œ๋กœ ๋งŽ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Redux ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋Œ€์‹  Redux ์ƒ๋‹จ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•ฉ์‹œ๋‹ค.

๋‹ค๋ฅธ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ๋Š” Rust ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. "mio" ๋ผ๋Š” Rust ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์œ„ํ•œ ๋น„์ฐจ๋‹จ IO ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Redux์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž‘๊ณ  ๋‚ฎ์€ ์ˆ˜์ค€์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ •๋ง ์–ด๋ ต๊ณ  ์ƒ์šฉ๊ตฌ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๋„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ mio๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ๋งค์šฐ ์œ ์šฉํ•˜๊ณ  ์ธ์ฒด๊ณตํ•™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” tokio ๋ผ๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ mio์˜ ๋ฐฐ๊ด€์ด ํ•„์š”ํ•œ ์‚ฌ๋žŒ์€ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋นจ๋ฆฌ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์€ tokio๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์œ ์‚ฌํ•œ ๋ชจ๋ธ์„ ์ฑ„ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@sunjay ์˜ ๋ช‡ ๊ฐ€์ง€ ์˜๊ฒฌ์„ ํ™•์žฅํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

์ตœ๊ทผ #775์— ๋‚ด์šฉ์„ ์ž˜ ํฌ์ฐฉํ•˜๋Š” ๋Œ“๊ธ€์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Redux๋Š” ์ถฉ๋ถ„ํ•œ ๊ตฌ์กฐ์™€ ์œ ์—ฐ์„ฑ์˜ ๊ท ํ˜•์„ ์ œ๊ณตํ•˜๋Š” ์ผ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ทธ๋ž˜ํ”ฝ ๋””๋ฒ„๊ฑฐ ๋˜๋Š” ๋ฏธ๋“ค์›จ์–ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋™์‹œ์— ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, Redux๋Š” ์—ฌ๋Ÿฌ ๋ฉด์—์„œ "๋‹จ์ง€ ํŒจํ„ด"์ž…๋‹ˆ๋‹ค. ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์ด ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฐ˜์ฏค ๊ณ„ํš๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ œ์•ˆ๋œ ์ธํ•ธ์„œ ๊ตฌ์กฐ ์กฐ์ •( #1702, #2214 ) ๋ฐ combineReducers ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ( #1768 , #1792 ๋“ฑ)๊ณผ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ).

Redux๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ์ง€ ๊ฑฐ์˜ 2๋…„์ด ์ง€๋‚ฌ๊ณ  ์ด์ œ ์‚ฌ๋žŒ๋“ค์ด Redux๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, @jimbolla ๋Š” #2214์—์„œ ์•Œ๋ ค์ง„ ๋ชจ๋“  ์ƒ์  ๊ฐ•ํ™” ์žฅ์น˜ ๋ชฉ๋ก์„ ์ˆ˜์ง‘ํ•˜๊ณ  ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์šฉ๋„๋ฅผ ๋ถ„๋ฅ˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์—ฌ์ „ํžˆ Redux์˜ ๋‹จ์ˆœ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์— ๋Œ€ํ•œ ์—ด๋ ฌํ•œ ํŒฌ์ด์ง€๋งŒ Redux๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ผ๋ฐ˜ ์‚ฌ์šฉ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ์ „ํžˆ ๊ด€์šฉ์ ์ธ ์ถ”์ƒํ™”๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ค€ ๊ด€๋ จ ์ฃผ์ œ์˜ ๋˜ ๋‹ค๋ฅธ ์„ธํŠธ์™€ ๊ฐœ์ธ์ ์œผ๋กœ ๋šœ๋ ทํ•œ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒƒ์€ "์บก์Šํ™”๋œ ๋…ผ๋ฆฌ/๊ตฌ์„ฑ ์š”์†Œ"( @slorber ์˜ "Elm/Redux๋ฅผ ์‚ฌ์šฉํ•œ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ" ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ๊ธฐ์ค€) ๋ฐ "ํ”Œ๋Ÿฌ๊ทธ"์— ๋Œ€ํ•œ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. -and-play Redux ์„ค์ •"(https://github.com/brianneisler/duxtape/issues/1 , https://github.com/jcoreio/redux-features/issues/7 ๋“ฑ์˜ ์‹คํ—˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Œ). ์ „์—ญ ์ƒํƒœ ๋ฐ ์•ฑ ์„ค์ •์€ ์ผ๋ถ€ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กœ์šด ๊ด€๋ จ ์‚ฌํ•ญ์œผ๋กœ @toranb ๋Š” https://github.com/ember-redux/ember-redux ์—์„œ Redux์šฉ Ember ๋ž˜ํผ๋ฅผ ๋งŒ๋“œ๋Š” ํ›Œ๋ฅญํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. Ember ์„ธ๊ณ„๋Š” _์ •๋ง__ "๊ตฌ์„ฑ๋ณด๋‹ค ๊ด€๋ก€"์ด๋ฏ€๋กœ ember-redux ๋Š” redux-thunk ๋“ฑ์„ ํฌํ•จํ•˜์—ฌ ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ ์ €์žฅ์†Œ ๊ตฌ์„ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค, ์ €๋Š” ์—ฌ๊ธฐ์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹ค์–‘ํ•œ ์ƒ๊ฐ์„ ์Ÿ์•„๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ๋“ค์€ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ Redux๋ฅผ ๋ฐฐ์šฐ๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋Œ€ํ•œ ์žฅ๋ฒฝ์„ ๋‚ฎ์ถ”๊ณ  ์ „๋ฐ˜์ ์œผ๋กœ ๊ณ ๊ธ‰ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Redux๋Š” ์ „๋ฌธํ™”๋˜์ง€ ์•Š์€ ์ผ๋ฐ˜ API์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋” ๋งŽ์€ ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃจ๋ฉด์„œ ๋” ์žฅํ™ฉํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ ํž˜์€ ๋ณต์žกํ•œ ์†Œํ”„ํŠธ์›จ์–ด์— ์žˆ๋Š” ๋ฐ˜๋ฉด, ์ƒˆ๋กญ๊ฑฐ๋‚˜ ๋‹จ์ˆœํ•œ ํ”„๋กœ์ ํŠธ๋Š” ํ•„์š” ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜ API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ „๋ฌธํ™”๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์— ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋Š” https://github.com/acdlite/redux-actions ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ redux์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๋‚ด ์š”๊ตฌ ์‚ฌํ•ญ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ์—„์ฒญ๋‚˜๊ฒŒ ๋ณต์žกํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณ ํ†ต์„ ๊ฒฝํ—˜ํ•˜์ง€ ์•Š์€ ์ƒˆ๋กœ์šด ์‚ฌ๋žŒ๋“ค์ด ์š”์ ์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธ€์Ž„, ๊ทธ๋“ค์—๊ฒŒ ๊ทธ๋“ค์€ ๊ณ ํ†ต์„ ๊ฒฝํ—˜ํ•  ๋•Œ๊นŒ์ง€ redux๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Dan์˜ egghead ์‹œ๋ฆฌ์ฆˆ๋Š” ์ด ์ง€์ ์„ ์•„์ฃผ ์‰ฝ๊ฒŒ ์ง€๋‚˜์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://egghead.io/courses/getting-started-with-redux
https://egghead.io/series/building-react-applications-with-idiomatic-redux

์ฐธ์กฐ: ์ถ”์ƒํ™”์˜ ์ŠคํŽ™ํŠธ๋Ÿผ: https://www.youtube.com/watch?v=mVVNJKv9esE

์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด redux-actions ๋Š” ์ผ๋ถ€ ์ƒ์šฉ๊ตฌ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์ƒ๋‹นํžˆ ๋Šฅ์ˆ™ํ•ฉ๋‹ˆ๋‹ค. .toString ๋ฅผ ์ฒจ๋ถ€ํ•˜์—ฌ ๋ฐฉ์ •์‹์—์„œ ์ƒ์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์ข‹์€ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ redux-actions ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด ๋…ผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

Imho ๋””์ŠคํŒจ์น˜๋œ ์ž‘์—… ์ŠคํŠธ๋ฆผ์„ ๊ด€์ฐฐํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ์ œ๊ณต ๋ฉ”์ปค๋‹ˆ์ฆ˜( subscribe ์˜ ์ฝœ๋ฐฑ ์ธ์ˆ˜?)์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋ฏธ๋“ค์›จ์–ด์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์ƒ๋‹นํžˆ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€, ์ฆ‰ ๊ตฌ์„ฑ ์š”์†Œ ๋˜๋Š” connect )

๋‚˜๋Š” ์ข…์ข… redux๋ฅผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฐ€๋ฅด์น˜๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์ƒ๋‹นํžˆ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋งŽ์€ ์›€์ง์ด๋Š” ๋ถ€๋ถ„: ์ €์žฅ, ์ƒํƒœ, ๊ฐ์†๊ธฐ, ์ž‘์—… ์ƒ์„ฑ์ž, ์ž‘์—…, ๋น„๋™๊ธฐ ์ž‘์—…, ๋ฏธ๋“ค์›จ์–ด, ์—ฐ๊ฒฐ๋œ ๊ตฌ์„ฑ ์š”์†Œ
  • ๋„์„œ๊ด€. REST API์™€ ํ†ต์‹ ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์•ฑ์˜ ๊ฒฝ์šฐ redux, react-redux, redux-thunk(๋˜๋Š” ๊ธฐํƒ€) + ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์•ผ ํ•˜๋Š” ์œ„์น˜์˜ ์–‘(_์›€์ง์ด๋Š” ๋ถ€๋ถ„_ ์ฐธ์กฐ)

๋‚˜๋Š” redux๊ฐ€ ๊ทธ ์ž์ฒด๋กœ ์ด์ฒด์ ์œผ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ํ›Œ๋ฅญํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ, ๊ทธ๊ฒƒ์ด ํ›Œ๋ฅญํ•œ ์ถ”์ƒํ™”๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉ๋  ๋•Œ ํ™•์žฅ์„ฑ์ด ๋งค์šฐ ๋›ฐ์–ด๋‚˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ redux๋Š” ๋ชจ๋“  UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ฐ˜์‘๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์€ ์ขŒ์ ˆ๊ฐ์ด ์›€์ง์ด๋Š” ๋ถ€๋ถ„์—์„œ ๋น„๋กฏ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๊ฐ€์กŒ๋˜ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์€ redux ์œ„์— ๊ตฌ์ถ•๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‚ด์žฅ๋œ ๋น„๋™๊ธฐ ์ž‘์—…์— ๋Œ€ํ•œ ์ง€์›๊ณผ ํ•จ๊ป˜ ์ถ”๊ฐ€๋กœ ์ œ๊ณต๋˜๋Š” react redux์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŽ์€ ๋น„๋™๊ธฐ ์ž‘์—…์ด REST API์™€ ํ†ต์‹ ํ•˜๋ฏ€๋กœ ์ด์— ๋Œ€ํ•œ ๊ด€์šฉ์  ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์Šค๋งˆํŠธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‹ค์ œ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ render ๋ฉ”์„œ๋“œ์—์„œ ๋ฉ์ฒญํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • _container components_, _smart components_, _dumb components_, _action creators_ ๋ฐ _reducers_์— ๋Œ€ํ•ด ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ ๋ ˆ์ด์•„์›ƒ์„ ๊ทœ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • redux action loadUsers ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด _redux-cli_๋ฅผ ์ œ๊ณตํ•˜์„ธ์š”.
  • redux-saga ๋˜๋Š” redux-observable๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ ๊ณ„์ธต์—์„œ ํ‘œ์ค€ํ™”ํ•˜๊ณ  ๋ฌธ์„œ์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„์˜ redux ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ƒ๋‹ดํ•  _one_ ์žฅ์†Œ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค)
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™•์žฅ ์–ธ์–ด ๊ธฐ๋Šฅ(์˜ˆ: ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(@connect)) ๋˜๋Š” TypeScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • mapStateToProps ๋ฐ mapDispatchToProps(mobx์—๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ๊ตฌ๋ฌธ์€ ๊ฐ„๋‹จํ•จ)์—์„œ ๋œ ์žฅํ™ฉํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

NS

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. redux-actions ๋Š” ์ƒ์šฉ๊ตฌ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ ์ถ”์ƒํ™”์˜ ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฌป๊ฒ ์Šต๋‹ˆ๋‹ค. Create-React-App์—๋Š” ๋ฏธ๋ฆฌ ๋นŒ๋“œ๋œ Babel ๋ฐ Webpack ๊ตฌ์„ฑ์ด ํฌํ•จ๋œ react-scripts ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ’์ด ๋งŽ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น redux-scripts ํŒจํ‚ค์ง€๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ?

redux-thunk ๋Œ€ํ•œ ๋‹ค๋ฅธ (๋ถ€์ •์ ์ธ) ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๋ณด์ž์—๊ฒŒ๋Š” ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋” ์ด์ƒ ๊ถŒ์žฅํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

  1. ๋งˆ๋ฒ•์ด ์‹œ์ž‘๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  2. ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ๋งŽ์€ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃผ์–ด์ง€๋ฉด props์—์„œ dispatch ๋ฅผ ๊ฐ€์ ธ์™€ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ฝ”๋“œ์˜ ์ž‘์€ ๋ถ€๋ถ„์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.
  3. ๊ทธ ๊ฒฐ๊ณผ ๋” ํฐ ์›Œํฌํ”Œ๋กœ๋กœ ํ•จ๊ป˜ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†๋Š” ์ž‘์—… ์ž‘์„ฑ์ž๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  4. redux ์Šคํƒ€์ผ์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ณด๋‹ค ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ฐ€๊น๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์—†๋Š” ๋งˆ์ง€๋ง‰ ์š”์ : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜์กดํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

React-Native ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ฝค ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๊ณ  ๋Œ€๋ถ€๋ถ„ ์œ ์šฉํ–ˆ์ง€๋งŒ redux-thunk ์ž‘์—… ์ƒ์„ฑ์ž๊ฐ€ void ํšจ๊ณผ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…์„ ํ•จ๊ป˜ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค("๋กœ๊ทธ์ธ ์„ฑ๊ณต ํ›„ ํ”„๋กœํ•„ ๋กœ๋“œ" ์ฐธ์กฐ)

๊ทธ๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด "๋ฌด์—‡์ด๋“  ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ React ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ/์ฝœ๋ฐฑ์—์„œ ์ฆ‰์‹œ dispatch ํ•˜๋Š” ๊ฒƒ"์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋„๋ก ๋ถ€์ถ”๊ธฐ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  connect from react-redux ํ•˜๊ณ  mapDispatchToProps ์— ํฌ๊ฒŒ ์˜์กดํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๊ฐ€ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ผ

(์œ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋Œ€๋ถ€๋ถ„ ์ž‘๋…„ ์ดˆ์— ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ๋” ํฐ Redux ์ƒํƒœ๊ณ„์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ œ๋Œ€๋กœ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์‹  ๋ฒ„์ „์ด ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

@bodhi : ์ ‘์„ ์˜ _๋„ˆ๋ฌด_ ๋งŽ์ด ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ณ , ๋‚˜๋Š” ๊ทธ ๊ฒฐ๋ก ๋“ค ์ค‘ ์ผ๋ถ€์— ๋™์˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. redux-thunk ๋Š” 11 ์ค„์ด๋ฉฐ "Thunk๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”?" ์™€ ๊ฐ™์€ ๋ฉ‹์ง„ ์„ค๋ช… Idiomatic Redux: Thoughts on Thunks, Sagas, Abstraction, and Reusability ์—์„œ thunks(๊ทธ๋ฆฌ๊ณ  ์–ด๋Š ์ •๋„๋Š” sagas)์˜

์ผ๋ถ€ ๊ฐ€์ƒ ์ถ”์ƒํ™” ๊ณ„์ธต์—์„œ ๋ถ€์ž‘์šฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” _some_ "์ถ•๋ณต๋ฐ›์€" ๋˜๋Š” "๋‚ด์žฅ๋œ" ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. Sagas์™€ Observable์€ ๋‘˜ ๋‹ค ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•œ๋‹ค๋ฉด _if_์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์˜ ์ž ์žฌ์ ์ธ ๋ชฉํ‘œ๊ฐ€ Redux๋ฅผ ๋ฐฐ์šฐ๊ณ  ์‚ฌ์šฉํ•˜๋Š” ์‰ฌ์šด ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ ์ ˆํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

redux-thunk ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ˜„์žฌ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ๊นจ๋—ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์•ก์…˜ ์ƒ์„ฑ์ž์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

Bodhi: ์ฃผ์ œ์—์„œ ์กฐ๊ธˆ ๋ฒ—์–ด๋‚œ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, dispatch๊ฐ€ void๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์„ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ž‘์—…์„ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ์–ด๋ณด๊ธฐ์—์„œ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
https://github.com/gaearon/redux-thunk/blob/master/README.md

๊ทธ ์™ธ์— ์ด ๊ณต๊ฐœ ํ† ๋ก ์„ ์ œ๊ณตํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ฐ์‚ฌ์˜ ๋ง์„ ์ „ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์ƒ๊ฐ๊ณผ ์•„์ด๋””์–ด๋ฅผ ๋“ฃ๋Š” ๊ฒƒ์ด ๋งค์šฐ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค.
๊ฐœ์ธ์ ์œผ๋กœ ์ง€๊ธˆ๊นŒ์ง€ ์ฝํฌ๋ฅผ ๊ณ ์ˆ˜ํ–ˆ์ง€๋งŒ "๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€"์™€ "์ƒํƒœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š”์ง€"๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ ์ฝ”๋“œ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ˆ˜๋ฅผ ํ•˜๋Š” ๊ฝค ๋งŽ์€ ๊ฒฝ์šฐ๋ฅผ ๋ด…๋‹ˆ๋‹ค(๋ฆฌ๋“€์„œ๊ฐ€ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ๋ฐ˜์‘ํ•˜๋Š” ๋Œ€์‹ ์— ๋ฌด์—‡์„ ํ•ด์•ผํ• ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์•ก์…˜์„ ์‚ฌ์šฉ) do (์•„์ง sagas์—์„œ ํŒ๋งค๋˜์ง€ ์•Š์Œ).

2017๋…„ 3์›” 19์ผ 23:48์— Bodhi [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

redux-thunk์— ๋Œ€ํ•œ ๋‹ค๋ฅธ (๋ถ€์ •์ ์ธ) ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๋ณด์ž์—๊ฒŒ๋Š” ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋” ์ด์ƒ ๊ถŒ์žฅํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๋งˆ๋ฒ•์ด ์‹œ์ž‘๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ๋งŽ์€ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์†Œํ’ˆ์—์„œ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹๊ฐ€์ ธ์™€ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ฝ”๋“œ์˜ ์ž‘์€ ๋ถ€๋ถ„์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.
๊ทธ ๊ฒฐ๊ณผ ๋” ํฐ ์›Œํฌํ”Œ๋กœ๋กœ ํ•จ๊ป˜ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†๋Š” ์ž‘์—… ์ž‘์„ฑ์ž๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
redux ์Šคํƒ€์ผ์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ณด๋‹ค ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ฐ€๊น๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์—†๋Š” ๋งˆ์ง€๋ง‰ ์š”์ : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜์กดํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
React-Native ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฝค ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๊ณ  ๋Œ€๋ถ€๋ถ„ ์œ ์šฉํ–ˆ์ง€๋งŒ redux-thunk ์•ก์…˜ ์ƒ์„ฑ์ž๊ฐ€ ํšจ๊ณผ์ ์œผ๋กœ void(์ฆ‰, ๋‹ค์Œ ์ž‘์—…์˜ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์•ฝ์†๊ณผ ๊ฐ™์€ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด "๋ฌด์—‡์ด๋“  ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ React ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ/์ฝœ๋ฐฑ์—์„œ ์ฆ‰์‹œ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ"์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋„๋ก ๋ถ€์ถ”๊ธฐ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  react-redux์˜ connect๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  mapDispatchToProps์— ํฌ๊ฒŒ ์˜์กดํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

(์œ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋Œ€๋ถ€๋ถ„ ์ž‘๋…„ ์ดˆ์— ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ๋” ํฐ Redux ์ƒํƒœ๊ณ„์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ œ๋Œ€๋กœ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์‹  ๋ฒ„์ „์ด ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์„ธ์š”.

(ํƒ„์  ํŠธ๋ฅผ ๊ณ„์†ํ•ด์„œ ์ฃ„์†กํ•˜์ง€๋งŒ...)

๋””์ŠคํŒจ์น˜๋Š” void๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์„ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ—ˆ, ๋Œ€๋‹จํ•ด! ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ ์ „์— ๋ฌธ์„œ๋ฅผ ๋„ˆ๋ฌด ์ž์„ธํžˆ ์‚ดํŽด๋ณธ ์ ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Redux๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค€ ๊ฐ€์žฅ ๊ฐ€์น˜ ์žˆ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” ์ž‘์—…์„ ๋ช…๋ น์ด ์•„๋‹Œ ์ด๋ฒคํŠธ ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž‘์—…์„ ๋””์ž์ธํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ž‘์—…์— ๋„ฃ์„ ๋‚ด์šฉ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ ์ƒํƒœ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค, ๊ทธ๋“ค์€ ๋‹จ์ง€, ์˜ˆ๋ฅผ ๋“ค๋ฉด "๋ฒ„ํŠผ X๋ฅผ ํด๋ฆญ"๊ทธ ์•ˆ์— ์žˆ์—ˆ๋‚˜์š” ๋ฌด์—‡์„ ์™ธ๋ถ€ ์„ธ๊ณ„๋ฅผ ๋งํ•œ๋‹ค. ์ž‘์—…์„ ๋ช…๋ น์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์ƒํƒœ ๊ฐ„์— ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ๋“€์„œ๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ตฌ์„ฑ ์š”์†Œ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ "์ƒํƒœ๋กœ ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ๊ฐ€" ๋ผ๋Š” ๋ฌธ์žฅ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๋ฆฌ๋“€์„œ์—์„œ ๋‹จ์ผ ์•ก์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ธ์ง€์  ์žฅ๋ฒฝ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™๊ธฐ์ ์œผ๋กœ ๋””์ŠคํŒจ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์œ„์น˜์—์„œ ๋‹จ์ผ ์ž‘์—…์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ž‘์—… ์ƒ์„ฑ์ž๋ฅผ ๊ตฌ์„ฑ ์š”์†Œ ๊ทผ์ฒ˜์— ๋‘์–ด ์ž‘์—…์„ ์ „๋‹ฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DevTools์˜ ์ž‘์—… ๋กœ๊ทธ๋ฅผ ๋ณด๋ฉด ์•ฑ ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•œ ์ผ ์˜ ์ „์ฒด ๊ธฐ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์—…์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ตฌ์ฒด์ ์ธ ์ƒํƒœ ์กฐ๊ฐ์„ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ญ์‚ฌ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€์žฅ ์งง์Šต๋‹ˆ๋‹ค.

์ด ํ’€ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ง„์ •ํ•œ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ๋งŒ๋“ค๊ณ  redux-saga ๋˜๋Š” redux-observable ์™€ ๊ฐ™์€ ๋ถ€์ž‘์šฉ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์Šคํƒํ•ฉ๋‹ˆ๋‹ค.

@aikoven ์ด ๋ง์— ์ „์ ์œผ๋กœ ๋™์˜ํ•˜์ง€๋งŒ(๊ณผ๊ฑฐ์—๋Š” redux๋ฅผ ์ด๋ฒคํŠธ ์†Œ์‹ฑ๊ณผ ๋น„๊ตํ•˜๋Š” ๋ฐ ํ™•์‹คํžˆ ๋งŽ์€ ํ† ๋ก ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค), ๋งค์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” FETCH_USER ์™€ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๋ฌด์—‡์„ ํ•ฉ๋‹ˆ๊นŒ? ์ˆ˜ํ–‰ํ•ด์•ผ ํ•จ). ๊ทธ๊ฒƒ์€ "์ด๋ฒคํŠธ์™€ ๊ฐ™์€"๋ณด๋‹ค "๋ช…๋ น๊ณผ ๊ฐ™์€"๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@blocka ๋„คํŠธ์›Œํฌ ์š”์ฒญ์œผ๋กœ FETCH_USER_STARTED ๋ฐ FETCH_USER_DONE / FETCH_USER_FAILED ์ž‘์—…์œผ๋กœ ๋ž˜ํ•‘๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ์ด ์š”์ฒญ ๊ฒฐ๊ณผ๊ฐ€ ์ƒํƒœ๋กœ ๋๋‚˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๐Ÿ‘ redux-actions

์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ ์™ธ์—๋„ ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์€ redux์˜ ๋งค์šฐ ์ž์—ฐ์Šค๋Ÿฌ์šด ํ™•์žฅ์ฒ˜๋Ÿผ ๋Š๊ปด์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. jumpstate ๊ฐ™์€ ๊ฒฝ์šฐ ๊ตฌํ˜„์ด ์กฐ๊ธˆ ๋” ๋ฉ€์–ด์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๋Š๋ผ๊ณ  ์ด์ œ ํ•˜๋‚˜๊ฐ€ ์•„๋‹Œ ๋‘ ๊ฐ€์ง€๋ฅผ ๋ฐฐ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ œ ์š”์ ์€ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ํ•˜๋Š” ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋œ ์žฅํ™ฉํ•œ API๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ redux๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ํก์‚ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งŽ์€ ์ƒ์šฉ๊ตฌ๋Š” ๋ชจ๋“  ํ™˜๊ฒฝ์— ์žˆ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ƒ์šฉ๊ตฌ์ž…๋‹ˆ๋‹ค. ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ์ถ”์ƒํ™”๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ถ”์ƒํ™”๋Š” ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์™ธ๋ถ€์—์„œ๋Š” ์œ ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฉฐ "์€์ƒ‰ ์ด์•Œ"์€ ์กด์žฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

redux๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. FETCH_X_STARTED ์•ก์…˜๊ณผ fetchX() ์•ก์…˜ ์ƒ์„ฑ๊ธฐ, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฆฌ๋“€์„œ ๋“ฑ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ž์œ ๋กญ๊ฒŒ ์ถ”์ƒํ™”๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”!

์ƒ์šฉ๊ตฌ์— ๋Œ€ํ•œ redux๋ฅผ ๋น„๋‚œํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์€ ๋‹ค์Œ ๋„ˆ๋ฌด ๋งŽ์€ ์ƒ์šฉ๊ตฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋น„๋‚œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

redux-thunk๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ˜„์žฌ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ๊นจ๋—ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์•ก์…˜ ์ƒ์„ฑ์ž์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋™๊ธฐ ์ฝ”๋“œ์— redux-thunk๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ฉฐ ๋ฌธ์„œ์—์„œ ์–ธ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋งŽ์€ ๊ธฐ๋Šฅ์„ ํ•จ๊ป˜ ๊ตฌ์„ฑํ•˜๋ฉด ๋””์ŠคํŒจ์น˜ ํ๋ฆ„์ด ์ˆœ์„œ์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ถ”๋ก ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ˆœ์ˆ˜ํ•œ ์•ก์…˜ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๊ณ  ๋” ๋ณต์žกํ•œ ์ƒํƒœ ์ˆ˜์ •์„ ์œ„ํ•ด ๋‹จ์ˆœํžˆ ์•ก์…˜ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ…Œ์ŠคํŠธํ•  ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋งŒ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ์ดํ•ด๋ฅผ ์œ„ํ•ด ์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. http://blog.isquaredsoftware.com/2017/01/idiomatic-redux-thoughts-on-thunks-sagas-abstraction-and-reusability/

@Machiaweliczny ๊ธฐ์‚ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ œ ์งˆ๋ฌธ์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์–ด๋””์— ๋‘๋Š”๊ฐ€์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค( https://medium.com/@jeffbski/where -do-i-put-my-business-logic-in-a-์—์„œ ๋…ผ์˜๋จ). react-redux-application-9253ef91ce1#.3ce3hk7y0). ๋””์ŠคํŒจ์น˜ ํ๋ฆ„(thunk, epic, saga ๋“ฑ)์ด ํ˜„์žฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ƒํƒœ์— ์ ˆ๋Œ€ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ?

@dfbaskin

Redux๋Š” ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์ด ์•„๋‹˜์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค. "๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ"๋Š” ์—ฌ๊ธฐ์—์„œ ํ›จ์”ฌ ๋ชจํ˜ธํ•œ ๊ด€์‹ฌ์‚ฌ์ด๋ฉฐ "์–ด๋–ค ๊ฐœ๋…์˜ ๊ธฐ๋Šฅ ์„œ๋ช…์ด ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๋…ผ๋ฆฌ์— ๊ฐ€์žฅ ์ž˜ ๋งž๋Š”์ง€"์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ "๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง"์€ ๊ท€ํ•˜๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์— ๋”ฐ๋ผ ์„ ํƒ๊ธฐ, ๊ฐ์†๊ธฐ, ์ž‘์—… ์ƒ์„ฑ๊ธฐ ๋ฐ "์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ"(์ด์— ๋Œ€ํ•ด ๋” ๋‚˜์€ ๋‹จ์–ด๊ฐ€ ์•„์ง ์žˆ์Šต๋‹ˆ๊นŒ?)์— ๊ฑธ์ณ ๋ถ„์‚ฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

(state, action) => state ๊ฐ์†๊ธฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ "์ƒํƒœ์— ์˜์กดํ•˜๋Š” ๋…ผ๋ฆฌ"๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ™•์‹คํžˆ Elm Architecture์™€ ๊ฐ™์€ ๊ฒƒ์—์„œ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋…ผ๋ฆฌ๋Š” "์—…๋ฐ์ดํŠธ" ๊ธฐ๋Šฅ(์šฐ๋ฆฌ์˜ ๊ฐ์†๊ธฐ์™€ ๋™์ผ)์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ Redux์—์„œ ๊ฐ์†๊ธฐ๋Š” ๋™๊ธฐ ๋…ผ๋ฆฌ๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒํƒœ์— ์˜์กดํ•˜๋Š” ๋น„๋™๊ธฐ์‹ "๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง"์€ ๋””์ŠคํŒจ์น˜(๊ตฌ์„ฑ ์š”์†Œ์— ํ•ด๋‹น ์ •๋ณด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹˜)๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์„ ํƒํ•œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ๊ฐœ๋…(thunk, sagas, epic)์„ ํ†ตํ•ด ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ƒํƒœ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์†๊ธฐ์˜ ํ•œ๊ณ„๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค๋ฉด ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด redux-saga ๋˜๋Š” redux-observable์„ ์‚ฌ์šฉํ•  ๋•Œ ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์•ก์…˜/์•ก์…˜ ์ƒ์„ฑ์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฑฐ์˜ ์‚ฌ์†Œํ•ด์ง€๋ฉฐ(๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ •๊ทœํ™” ๋˜๋Š” ํ˜•์‹ํ™”์— ํ”Œ๋Ÿฌ์Šค ๋˜๋Š” ๋งˆ์ด๋„ˆ์Šค), ์‚ฌ๊ฐ€/์—ํ”ฝ์€ ๊ฑฐ์˜ "๋Œ€์ฒด ๋ฆฌ๋“€์„œ"์ž…๋‹ˆ๋‹ค. , ์ด์ œ ์•ก์…˜๊ณผ ์ƒํƒœ์— ์•ก์„ธ์Šคํ•˜๊ณ  "์‚ฌ๋ฌผ"์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ์œผ๋ฉฐ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‹ค์ œ ๊ฐ์†๊ธฐ์˜ ๋ณต์žก์„ฑ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๋ฆฌ๋“€์„œ์™€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋Š” ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

@Machiaweliczny : "

๋” ์ข‹์€ ํ† ๋ก ์ด์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์ฃผ์ œ์—์„œ ์กฐ๊ธˆ ๋ฒ—์–ด๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. (์ €์ชฝ์— ๋ณด์ด๋Š” ์ž์ „๊ฑฐ ๋ณด๊ด€์†Œ์ธ๊ฐ€์š”? :) )

์›๋ž˜ ์งˆ๋ฌธ์œผ๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • "์ ์€ ์ƒ์šฉ๊ตฌ"๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ด€์šฉ์  Redux ์‚ฌ์šฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ๋ถˆ๋งŒ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ์–ด๋–ป๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ํ•™์Šต ๋ฐ ์‚ฌ์šฉ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ Redux๋ฅผ ์ˆจ๊ธฐ์ง€ ์•Š๊ณ (๊ทธ๋ฆฌ๊ณ  "๊ธฐ๋ณธ" Redux๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜/ํ•™์Šต ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š”) ๊ฐ€๋Šฅํ•œ ์ถ”์ƒํ™”๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ์–ด๋–ค ์‹์œผ๋กœ๋“  ๊ฐœ์„ ๋œ ๋ฌธ์„œ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์–ผ๋งˆ๋‚˜ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๊ตฌ์ฒด์ ์ธ ๋‹จ๊ณ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์—†๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋‹จ๊ธฐ ๋‹จ๊ณ„์˜ ์˜์—ญ์—์„œ ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

1) ์Šคํ† ์–ด๋ฅผ ๋” ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ ๊ตฌ์„ฑ์ผ ์ˆ˜๋„ ์žˆ๋‚˜์š”? ์—ฌ์ „ํžˆ ๊ทธ๋Ÿฐ ๊ฒƒ์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ Elm์—๋Š” "์Šคํƒ€ํ„ฐ ์•ฑ" ์œ ํ˜•๊ณผ ์ผ๋ฐ˜ ์•ฑ ์œ ํ˜•์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ€ํ„ฐ ์•ฑ์ด ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์•ฑ๊ณผ ๊ต์œก ์ž๋ฃŒ์—์„œ ์‚ฌ๋žŒ๋“ค์ด ๋ง‰ ๋ฐฐ์šฐ๋Š” ๊ฒฝ์šฐ์˜ 90%๋ฅผ ์ปค๋ฒ„ํ•˜๊ธฐ ์œ„ํ•ด ์ง€๊ธˆ๊นŒ์ง€ ์„œ๋ช…์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ๋ฏธ๋“ค์›จ์–ด(devtools, thunks)๋กœ Redux ์Šคํ† ์–ด๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‹ ๊ทœ ์ด๋ฏผ์ž๋“ค์ด Redux ํ•ต์‹ฌ ๊ฐœ๋…์„ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•ด ์ƒ์ ์˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

2) ์ด๊ฒƒ์€ ์ด๋ฏธ ํ•ด๋‹น๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. create-react-app์— ์œ„์˜ "์Šคํƒ€ํ„ฐ ์Šคํ† ์–ด"์™€ ํ•จ๊ป˜ Redux๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ํ•œ ์‰ฌ์šด์ง€ ํ™•์ธํ•˜์—ฌ ์‹ ๊ทœ ์‚ฌ์šฉ์ž๊ฐ€ 2๋ถ„ ์•ˆ์— Redux ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๋ฅผ ์•„์ฃผ ๋ฉ€๋ฆฌ ๋ฐ๋ ค๊ฐˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์Šคํƒ€ํ„ฐ ์•ฑ์ด๋ž€ ์•ฑ ์ƒ์šฉ๊ตฌ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ๊ฐ€์ ธ์˜ค๊ณ  ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ๋Š” "createStore"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์„ฑ์žฅํ•˜๋ฉด "์‹ค์ œ" createStore๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ๊ฑฐ๊ธฐ์—์„œ ๊ฝค ํ™˜์ƒ์ ์ธ ๊ฐœ๋…์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

2017๋…„ 3์›” 20์ผ ์›”์š”์ผ ์˜ค์ „ 10:02 Francois Ward [email protected]
์ผ๋‹ค:

๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์—†๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋‹จ๊ธฐ ๋‹จ๊ณ„์˜ ์˜์—ญ์—์„œ ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

1.

์ €์žฅ์†Œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ
๊ตฌ์„ฑ? ์ง€๊ธˆ๋„ ๊ทธ๋Ÿฐ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋Š๋ฆ…๋‚˜๋ฌด๋Š”
"์Šคํƒ€ํ„ฐ ์•ฑ" ์œ ํ˜• ๋ฐ ์ผ๋ฐ˜ ์•ฑ ์œ ํ˜•. ์Šคํƒ€ํ„ฐ ์•ฑ์€ ๋‹ค์Œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ๋žŒ๋“ค์ด 90% ๊ฒฝ์šฐ๋ฅผ ์ปค๋ฒ„ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์•ฑ๊ณผ ๊ต์œก ์ž๋ฃŒ์—์„œ
๊ทธ๋ƒฅ ํ•™์Šต. ์ง€๊ธˆ๊นŒ์ง€ Redux ์Šคํ† ์–ด๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Œ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค.
๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ๋ฏธ๋“ค์›จ์–ด(devtools, thunks)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ
์„œ๋ช…. ๋‚˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ƒˆ๋กœ์šด ์ด๋ฏผ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
Redux ์ฝ”์–ด๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•ด ์ƒ์ ์˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ 
๊ฐœ๋….
2.

์ด๊ฒƒ์€ ์ด๋ฏธ ๊ฒฝ์šฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋‚ด์šฉ์œผ๋กœ Redux๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
react-app์„ ์ƒ์„ฑํ•˜๋Š” "์Šคํƒ€ํ„ฐ ์Šคํ† ์–ด"๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„๋‹จํ•˜๋ฏ€๋กœ ์ดˆ๋ณด์ž
2๋ถ„ ์•ˆ์— Redux ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๋ฅผ ์•„์ฃผ ๋ฉ€๋ฆฌ ๋ฐ๋ ค๊ฐˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธ
https://github.com/reactjs/redux/issues/2295#issuecomment-287806663 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AFUmCQYkUwjkCugevDBWC8TOu0HhWJTnks5rnqMWgaJpZM4MhnVF
.

์šฐ๋ฆฌ ๋ชจ๋“ˆ์€ combineReducers ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ์˜ ๊ฐ ์ƒํƒœ ์Šฌ๋ผ์ด์Šค์— ์ „์šฉ ๋ฆฌ๋“€์„œ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค(์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ "์Šฌ๋ผ์ด์Šค ๋ฆฌ๋“€์„œ"๋ผ๊ณ ๋„ ํ•˜๋Š” ๋ฌธ์„œ์˜ ๊ตฌ์กฐํ™” ๋ฆฌ๋“€์„œ ์„น์…˜์— ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค). ์ด๊ฒƒ์€ switch ๋ฌธ์ด ํ›จ์”ฌ ๋” ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์„ ๋” ์‰ฝ๊ฒŒ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ์ „์ฒด์— ๊ณตํ†ต ๋ฆฌ๋“€์„œ๊ฐ€ ๋“ฑ์žฅํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฆฌ๋“€์„œ๋Š” ์•ก์…˜ ์œ ํ˜•์„ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“ˆ์—์„œ ๋™์ผํ•˜๋ฏ€๋กœ ์•ก์…˜ ์œ ํ˜•๋ณ„๋กœ ์ด๋Ÿฌํ•œ ๋ฆฌ๋“€์„œ๋ฅผ ๋งŒ๋“œ๋Š” ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ(๋ฆฌ๋“€์„œ ํŒฉํ† ๋ฆฌ?)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

const { makeIndicator, makePayloadAssignor } from '../shared/reducers';

const searchModule = combineReducers({
  searching: makeIndicator(c.SEARCH),
  results: makePayloadAssignor(c.SEARCH_RESPONSE, [])
});

์•„๋งˆ๋„ ์ด์™€ ๊ฐ™์€ ๋” ์ผ๋ฐ˜์ ์ธ ์Šฌ๋ผ์ด์Šค ๋ฆฌ๋“€์„œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ ๋ฆฌ๋“€์„œ์˜ ๊ธฐ๋ณธ ๋นŒ๋”ฉ ๋ธ”๋ก์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ƒ์šฉ๊ตฌ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฆฌํŒฉํ† ๋ง์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ „์— ๋งํ–ˆ๋“ฏ์ด ... "์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ"์—๋Š”
์ฝ”๋“œ์— ์ถ”์ƒํ™”์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ ์šฉํ•  ๋•Œ๊นŒ์ง€ ๋งŽ์€ "๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ".

Redux๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋งˆ๋ฒ• ๊ฐ™์€ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

2017๋…„ 3์›” 20์ผ ์›”์š”์ผ ์˜คํ›„ 12์‹œ 44๋ถ„, Markus Coetzee [email protected]
์ผ๋‹ค:

์šฐ๋ฆฌ ๋ชจ๋“ˆ์€ CombineReducers๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์ƒํƒœ ์Šฌ๋ผ์ด์Šค๊ฐ€
๋ชจ๋“ˆ์—๋Š” ์ „์šฉ ๊ฐ์†๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋ฌธ์„œ์˜ Structuring Reducers ์„น์…˜์—์„œ "์Šฌ๋ผ์ด์Šค
๊ฐ์†๊ธฐ"). ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์Šค์œ„์น˜๊ฐ€
์ง„์ˆ ์€ ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฐ์†๊ธฐ๊ฐ€ ๋“ฑ์žฅํ•˜๋„๋ก ํ—ˆ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ์˜ ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ์ „๋ฐ˜์— ๊ฑธ์ณ. ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฐ์†๊ธฐ๋Š” ๋ชจ๋“ˆ ๊ฐ„์— ๋™์ผํ–ˆ์Šต๋‹ˆ๋‹ค.
์•ก์…˜ ์œ ํ˜•์„ ์ œ์™ธํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๋ฆฌ๋“€์„œ๋ฅผ ๋งŒ๋“œ๋Š” ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ(๋ฆฌ๋“€์„œ ํŒฉํ† ๋ฆฌ?)์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ–‰๋™ ์œ ํ˜•๋ณ„:

const { makeIndicator, makePayloadAssignor } from '../shared/reducers';
const searchModule = CombineReducers({
๊ฒ€์ƒ‰: makeIndicator(c.SEARCH),
๊ฒฐ๊ณผ: makePayloadAssignor(c.SEARCH_RESPONSE, [])
});

์•„๋งˆ๋„ ์ด์™€ ๊ฐ™์€ ๋” ์ผ๋ฐ˜์ ์ธ ์Šฌ๋ผ์ด์Šค ๋ฆฌ๋“€์„œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ƒ์šฉ๊ตฌ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•
๊ฐ์†๊ธฐ๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ๋นŒ๋”ฉ ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธ
https://github.com/reactjs/redux/issues/2295#issuecomment-287820595 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AACourLpL5--NJiRzrWmKFJ31cl5DXJrks5rnqzxgaJpZM4MhnVF
.

์ƒ์šฉ๊ตฌ ๊ฐ์†๊ธฐ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ redux ํŒจํ„ด์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ œ ํŒ€์›๋“ค๊ณผ ์ €๋Š” 1.5๋…„ ์ „์— redux๋กœ ์ž‘์—…ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ–ˆ์Šต๋‹ˆ๋‹ค. redux๋Š” ๋Œ€๋ถ€๋ถ„ ์ด๋ฒคํŠธ ์†Œ์‹ฑ์ด๊ณ , ๋™์ผํ•œ ์ž‘์—…์„ ์—ฌ๋Ÿฌ ๋ฆฌ๋“€์„œ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์ž‘์—…์—๋Š” id ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ „์ฒด ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐœ์ฒด๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. , ๊ฐ์†๊ธฐ๋Š” ๊ธฐ๋Šฅ์ผ ๋ฟ์ด๋ฉฐ ์ž‘์„ฑ, ์ƒ์„ฑ, ๋ถ„ํ•  ๋“ฑ ์›ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์ž์œ ๋กญ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›๊ฒฉ ๋ช…๋ น์œผ๋กœ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ ์ „์ ์ธ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ๊ถ๊ธˆํ•ดํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์‹ค์ˆ˜๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๋Œ€ํ•œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋งŒ๋“ค๊ณ  "์ œ๋„ˆ๋ ˆ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์—"(redux-saga๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ!) redux-saga๋ฅผ ํ”ผํ•˜๊ณ  ๊ฑฐ๋Œ€ํ•œ ์Šค์œ„์น˜๋กœ ๊ธด ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌผ๋ก  ํ‰๋ฒ”ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ  ๋•Œ๋ฌธ์ด๊ธฐ๋„ ํ•˜์ง€๋งŒ ๊ตฌ์กฐํ™”๋œ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜ ๋ฌธ์„œ๋Š” ํ›จ์”ฌ ๋” ๋‚˜์•„์กŒ์Šต๋‹ˆ๋‹ค. ์œ ์ง€ ๋ณด์ˆ˜์ž๋“ค ๋•๋ถ„์ž…๋‹ˆ๋‹ค!

์ด๊ฒƒ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ์„œ์˜ Redux์— ๋Œ€ํ•œ ๋งค์šฐ ๊ท€์ค‘ํ•œ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฆฌํŒฉํ† ๋ง์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ „์— ๋งํ–ˆ๋“ฏ์ด ... "์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ"์—๋Š”
์ฝ”๋“œ์— ์ถ”์ƒํ™”์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ ์šฉํ•  ๋•Œ๊นŒ์ง€ ๋งŽ์€ "๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ".
Redux๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋งˆ๋ฒ• ๊ฐ™์€ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

์™„๋ฒฝํ•ด, @blocka! ์ด ๋ฉ”์‹œ์ง€๋Š” ๋„๋ฆฌ ํผ์งˆ ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Redux๋Š” ์ตœ์†Œํ•œ์˜ ์ ‘๊ทผ ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋…ํŠนํ•˜๊ณ  ์ƒ์šฉ๊ตฌ ๊ฐ™์€ ๋Š๋‚Œ์„ ์ค๋‹ˆ๋‹ค. Minimal์€ ์ผ๋ฐ˜์ ์œผ๋กœ "ํ”„๋ ˆ์ž„์›Œํฌ"์— ๋Œ€ํ•ด ์ด์ƒํ•˜๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค(์ตœ์†Œ ์ฝ”๋“œ, ์ตœ์†Œ ์›์น™).

์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ JavaScript ์ž์ฒด๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค "framework-y" ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ธฐ๋ณธ ์ œ๊ณต ๋ฐฉ์‹์ด ์•”์‹œ์ ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ง€์˜ฅ์ฒ˜๋Ÿผ ์Šฌํ”„์ง€๋งŒ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

Redux๊ฐ€ ๊ทธ ์–ด๋Š ๋•Œ๋ณด๋‹ค ์‹œ์ž‘ํ•˜๊ธฐ ์‰ฌ์›Œ์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ Redux๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๋ถ„๋ช…ํžˆ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @gaearon ์€ ํ•ญ์ƒ

์–ด์ œ ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์งง์€ ๊ธฐ์‚ฌ๋ฅผ ์ผ์Šต๋‹ˆ๋‹ค. React๋‚˜ Redux๋ฅผ ํƒ“ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค . ๋ฌผ๋ก  ๋‚˜๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ํ‹€๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๊ณ ๊ธ‰ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ„์— ์ถ”์ƒํ™” ๊ณ„์ธต์„ ๊ฐ–๋Š” ์„ ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ Tensorflow๋Š” ํ•ต์‹ฌ API( http://www.fast.ai/2017/01/03/keras/) ์œ„์— Keras๋ฅผ ์ถ”์ƒํ™”๋กœ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค

TensorFlow๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๊ฐ€ TensorFlow๋ฅผ ์‚ฌ์šฉํ•  ๋งŒํผ ๋˜‘๋˜‘ํ•˜์ง€ ์•Š๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. Keras๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ ๊ฒฝ๋ง์ด ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ TensorFlow์˜ API๊ฐ€ ์žฅํ™ฉํ•˜๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  Keras๊ฐ€ ๋‚ด๊ฐ€ ๊ฒฝํ—˜ํ•œ ๊ฒƒ ์ค‘ ๊ฐ€์žฅ ์‚ฌ๋ ค ๊นŠ๊ฒŒ ๋””์ž์ธ๋˜๊ณ  ํ‘œํ˜„๋ ฅ์ด ํ’๋ถ€ํ•œ API๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฒ˜์Œ ๋ช‡ ์ฐจ๋ก€์˜ ์‹ค๋ง์Šค๋Ÿฌ์šด ์ƒํ˜ธ ์ž‘์šฉ ํ›„์— TensorFlow๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ๋น„ํŒํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ฐฝํ”ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ํˆฌ๋ฐ•ํ•˜๊ณ  ๋ถ€์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋Š๊ปด์กŒ์ง€๋งŒ ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ๋‚ด ์‹คํŒจ์˜€์Šต๋‹ˆ๋‹ค.

Redux๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋น„์Šทํ•œ ๊ฒฝํ—˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Tensorflow ๋ฅผ Redux , Keras ๋ฅผ Jumpstate ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Redux๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ปจํŠธ๋กค์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๋“ค์€ Angular์—์„œ ์˜ค๊ณ  ์žˆ๊ฑฐ๋‚˜ ๋ถ€ํŠธ์บ ํ”„์—์„œ React + Redux๋ฅผ ๋ฐฐ์šฐ๊ฑฐ๋‚˜ ๋‹ค์–‘ํ•œ ํŠœํ† ๋ฆฌ์–ผ์„ ๋ณด๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Redux๋Š” ์‹ ๊ทœ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋ค๋คํ•ด์งˆ ํ•„์š”๋Š” ์—†์ง€๋งŒ ์ž ์žฌ์  ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ 80%๋ฅผ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋” ์‰ฌ์šด ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋„ ์•ˆํ‹ฐ ํŒจํ„ด์ด ์•„๋‹™๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, redux๊ฐ€ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๊ดœ์ฐฎ์•˜๋‹ค๋ฉด ์ด๋Ÿฐ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. redux๊ฐ€ ์œ ์šฉํ•˜๊ฑฐ๋‚˜ ๊ตฌ์กฐ์ ์œผ๋กœ ๊ฑด์ „ํ•œ์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์‚ฌ๋žŒ๋“ค์€ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ ์—ฌ์ „ํžˆ "๋‚˜์˜๋‹ค"๊ณ  ๋Š๋‚๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ์ •์€ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์— ๋Œ“๊ธ€์„ ๋‹ค๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋ชจ๋‘ redux ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์šฐ๋ฆฌ๋Š” redux์— ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ ์ฒ ํ•™์„ ๋‚ด๋ฉดํ™”ํ–ˆ์œผ๋ฉฐ "๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ"๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ž์‹ ์˜ ์ถ”์ƒํ™”๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํŽธ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ œ๊ณตํ•˜๋ ค๋Š” ์ฒญ์ค‘์ด ์•„๋‹™๋‹ˆ๋‹ค. redux๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž, ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ฝ๊ฐ„์˜ ๊ณต๊ฐ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด: ๋‹ค์Œ์€ redux์— ๋Œ€ํ•ด ์ž์ฃผ ๋“ฃ๋Š” ๋ถˆ๋งŒ์ž…๋‹ˆ๋‹ค(์—…์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ์–ธ๊ธ‰๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค): redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. react-redux, redux-thunk, redux-actions ๋“ฑ๋„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. .

๋ง ๊ทธ๋Œ€๋กœ redux๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ์š”.
๋Œ€๋ถ€๋ถ„์˜ redux ์‚ฌ์šฉ์ž๋Š” ์ด๋Ÿฌํ•œ ์ถ”๊ฐ€ ํŒจํ‚ค์ง€์˜ ์ผ๋ถ€ ๋˜๋Š” ์ „์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ์˜ˆ.

package.json ์˜ ํŒจํ‚ค์ง€ ์ˆ˜๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ ์ •๋ง.
package.json ์˜ ํŒจํ‚ค์ง€ ์ˆ˜๊ฐ€ ์‚ฌ๋žŒ๋“ค์˜ ๊ธฐ๋ถ„์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๊นŒ? ์ „์ ์œผ๋กœ.

์ด์ œ redux ์ž์ฒด๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๊ณ  ๋‹ค๋ฅธ ํŒจํ‚ค์ง€( create-redux-app ๋˜๋Š” ๋ฌด์—‡์ด๋“ )๊ฐ€ ์ด๋“ค์„ ํ•จ๊ป˜ ์กฐ๋ฆฝํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋ฏฟ๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž์—๊ฒŒ RTFM์— ์•Œ๋ฆฌ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

redux๊ฐ€ ์œ ์šฉํ•˜๊ฑฐ๋‚˜ ๊ตฌ์กฐ์ ์œผ๋กœ ๊ฑด์ „ํ•œ์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์‚ฌ๋žŒ๋“ค์€ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ ์—ฌ์ „ํžˆ "๋‚˜์˜๋‹ค"๊ณ  ๋Š๋‚๋‹ˆ๋‹ค. ์ด ๊ฐ์ •์€ ์œ ํšจํ•˜๋‹ค

์ „์ ์œผ๋กœ. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋ ‡๊ฒŒ ๋Š๋ผ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ด์•ผ๊ธฐ๋Š” ์ ˆ๋Œ€ ๋“ฃ์ง€ ๋ชปํ•  ๊ฒƒ์ž„์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค. ์งˆ๋ฌธ์„ ํ•˜๊ฑฐ๋‚˜ stackoverflow/reactiflux๋ฅผ ๋ˆ„๋ฅด๋Š” ์‚ฌ๋žŒ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ๋„ ํ•ด๋ณด์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค ์ค‘ ์ผ๋ถ€๋Š” ๋„์›€์ด ํ•„์š”ํ•˜์ง€๋งŒ ์–ด๋–ป๊ฒŒ ์š”์ฒญํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค... ๊ทธ๋ฆฌ๊ณ  ์ผ๋ถ€๋Š” ์ž˜ ์ง€๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๋“ค์„ ๋” ๋‚˜์˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค... ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ทธ๋“ค์€ ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  ํฌ๋Ÿผ์— ์˜ค๋Š” ์‚ฌ๋žŒ์ด ๋˜๋ฉฐ ์ˆœ ์ œ๋กœ ์ด๋“์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Redux๋Š” ์•„๋ฌด ์ด์œ  ์—†์ด ์ธ๊ธฐ๋ฅผ ์–ป์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ๋งŽ์€ ๋ถ„๋“ค์ด ๋ง›์žˆ๋‹ค๊ณ  ํ•˜์…”์„œ ๋‹ค๋ฅธ ๋ถ„๋“ค๊ป˜๋„ ์ถ”์ฒœํ•ด ์ฃผ์…จ์–ด์š” :)

์ด์ œ redux ์ž์ฒด๋Š” ๊ทธ๋Œ€๋กœ ์žˆ์–ด์•ผ ํ•˜๊ณ  ๋‹ค๋ฅธ ํŒจํ‚ค์ง€(create-redux-app ๋˜๋Š” ๋ฌด์—‡์ด๋“ )๊ฐ€ ํ•จ๊ป˜ ์กฐ๋ฆฝํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋ฏฟ๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ์ƒ์šฉ๊ตฌ๊ฐ€ ์ด๋ฏธ ํ•ด๊ฒฐํ–ˆ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, React์— ์ž…๋ฌธํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋„๊ตฌ์— ์••๋„๋˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์‚ฌ๋žŒ๋“ค์ด ๋ถˆํ‰ํ•˜๋˜ ๋‹น์‹œ React์—๋„ ์ƒ์šฉ๊ตฌ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. create-react-app ๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ๋‹ต๋ณ€์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ดˆ๋ณด์ž๊ฐ€ ์ด๋ฏธ React _์ž์ฒด_์— ์ž…๋ฌธํ•˜๊ธฐ ์œ„ํ•œ ๋งŽ์€ ๋‹จ๊ณ„๋ฅผ ์ œ๊ฑฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํ›„๋“œ ์•„๋ž˜์—์„œ ์—ฌ์ „ํžˆ ์ƒ์šฉ๊ตฌ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์‚ฌ๋žŒ๋“ค์ด ์ƒํƒœ๊ณ„๋ฅผ ๊ตฌ๋งคํ•˜๋„๋ก ์žฅ๋ คํ•˜๊ณ  Redux ์ž์ฒด๊ฐ€ ์˜๋„์ ์œผ๋กœ ๋งŽ์€ ๊ฒƒ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค . React๋‚˜ Redux๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ƒํƒœ๊ณ„์—์„œ ๋„๋ง์น  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Redux ์ฝ”์–ด์— redux-thunk ์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์—ฌ๊ธฐ๋กœ ๊ฐ€๋Š” ๊ธธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ๋‚ด๊ฐ€ ๋˜์ง€๊ณ  ์žˆ๋Š” ์•„์ด๋””์–ด์˜ ์ข…๋ฅ˜๋Š” ์‹ค์ œ๋กœ ํ•ต์‹ฌ์— ์ง์ ‘ ํฌํ•จํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ create-react-app ๋ผ์ธ์„ ๋”ฐ๋ผ ๋ณ„๋„์˜ ํŒจํ‚ค์ง€ ๋˜๋Š” CLI ๋„๊ตฌ ๋˜๋Š” ๊ธฐํƒ€๊ฐ€ ๋  ์ผ์ข…์˜ "์‚ฌ์ „ ๊ตฌ์ถ•๋œ ๊ตฌ์„ฑ" ๋˜๋Š” "์‚ฌ์šฉ ์šฉ์ดํ•œ ์ถ”์ƒํ™” ๊ณ„์ธต"์„ ๊ฐ€์ƒ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” Jumpstate/Jumpsuit์˜ ์ €์ž๋กœ ์ฐจ์ž„ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

TL;DR:
Redux๋Š” ๋„ˆ๋ฌด ๋‚ฎ์€ ์ˆ˜์ค€์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ต๊ณ  ๊ตฌ์„ฑ/ํ†ตํ•ฉํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” 90% ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ํ‘œ์ค€ํ™”๋œ ์ƒ์œ„ ์ˆ˜์ค€ redux API์˜ ์ด์ ์„ ํ™œ์šฉํ•˜์—ฌ ํ•™์Šต ๊ณก์„ ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ณ  ๋” ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์†”๋ฃจ์…˜์œผ๋กœ ์šด์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Jumpstate๋Š” ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์ง€๋งŒ ์žฅ๊ธฐ์ ์ธ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด API๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€์— ๋Œ€ํ•œ ๊ฐ€๋Šฅํ•œ ์•„์ด๋””์–ด(์‹ค์ œ ๋˜๋Š” ๋ฉ”ํƒ€ ์ฝ”๋“œ)๋ฅผ ์ œ์•ˆํ•˜๊ธฐ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


Redux๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐฐ์šฐ๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ณ  ๋น„๋™๊ธฐ ๋กœ์ง, ๋ถ€์ž‘์šฉ, ์‚ฌ์šฉ์ž ์ •์˜ ๋ฏธ๋“ค์›จ์–ด ๋“ฑ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ๊ฐœ๋…๊ณผ ํ†ตํ•ฉํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ ์ƒํƒœ๊ณ„์— ์•„์ฃผ ์ƒˆ๋กœ์šด ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘์„ ๋ฐฐ์šฐ๊ณ  ๋ฉฐ์น  ๋งŒ์— ๋‚˜๋Š” ์ฆ‰์‹œ redux๋ฅผ ๋ฐฐ์šฐ๋„๋ก ๊ถŒ์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ถŒ์žฅ ์‚ฌํ•ญ์€ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ(๋˜๋Š” ์ˆ˜ํ–‰ ์ค‘์ธ) ๋งค์šฐ ๊ฒฝํ—˜์ด ๋งŽ์€ ๊ฐœ๋ฐœ์ž์™€ ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž ๋ชจ๋‘์—๊ฒŒ์„œ ๋‚˜์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค. setState ์ด์ƒ์œผ๋กœ ํ™•์žฅ๋œ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ์‚ฌ์‹ค์ƒ์˜ ์†”๋ฃจ์…˜์œผ๋กœ ํ™˜์˜๋ฐ›์•˜์Šต๋‹ˆ๋‹ค(setState ๊ฒŒ์ดํŠธ๋Š” ์—ฌ๊ธฐ์„œ ์ œ์™ธํ•ฉ์‹œ๋‹ค ๐Ÿ˜‰ ). redux๊ฐ€ ํ›Œ๋ฅญํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ชจ๋“  ๊ฒƒ์€ ์ •๋‹นํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ํ•™์Šต ๊ณก์„ ์— ๋ถ€๋”ชํ˜”๊ณ  ๋„์›€์„ ๊ตฌํ–ˆ์„ ๋•Œ Redux์— ๋Œ€ํ•œ ๋งˆ์ผ€ํŒ… ๋ฐ ๋ฌธ์„œํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ด "Redux๋Š” ์–ด๋ ต๊ณ  ๊ฐœ๋…์€ ์ €์ˆ˜์ค€์ด๋ฉฐ API๋Š” ์ž ๊ฒจ ์žˆ์œผ๋ฉฐ ์ „์›์„ ์ผœ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ."

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๋ชจ๋“  ๋™๋ฃŒ๋“ค๊ณผ ํ•จ๊ป˜ ํ•œ ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋„๋ก ๊ต์œก๋ฐ›์€ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ํ†ตํ•ด ํž˜์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์—ฌ์ •์„ ๋”ฐ๋ผ ๋‚˜๋Š” redux๊ฐ€ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ๋ณต์žก์„ฑ๊ณผ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์˜๋„์ ์œผ๋กœ ์ˆจ๊ธฐ๋Š” ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์•„์ฃผ ์ดˆ๊ธฐ์— ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ปค์Šคํ…€ ์•ก์…˜ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์•˜๊ณ , ์•ก์…˜๊ณผ ๋””์ŠคํŒจ์ฒ˜๋ฅผ ์ปดํฌ๋„ŒํŠธ์— ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์•˜๊ณ , ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ switch ๋ฌธ ๋Œ€์‹  ๋œ ์žฅํ™ฉํ•œ ๋ฆฌ๋“€์„œ ๋ ˆ์ด์•„์›ƒ์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ํ™˜์ƒ์ ์œผ๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๋‹ค๋ฅธ ๋™๋ฃŒ๋“ค๊ณผ ํ•™์Šต ๊ณก์„ ์œผ๋กœ ๋น„์Šทํ•˜๊ฒŒ ๊ณ ๊ตฐ๋ถ„ํˆฌํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์„ ์œ„ํ•ด redux๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ณผ์ •์„ ๊ฐ€์†ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ณ ๊ธ‰ ๋˜๋Š” "๊ด€์šฉ์ " redux๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ 90% ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งž๊ฒŒ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ์ฝ” jumpstate๊ฐ€ ๋ชจ๋“  ๊ธฐ๋ฐ˜์„ ํฌ๊ด„ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ jumpstate๊ฐ€ "๊ด€์šฉ์ ์œผ๋กœ" ์ž‘๋™ํ•˜๋ ค๋ฉด ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž ์ง€์ • ๊ฐ€๋Šฅํ•œ ์ž‘์—… ์ƒ์„ฑ๊ธฐ, ์ „์—ญ ์ž‘์—… ๊ฐ€์ ธ์˜ค๊ธฐ ์ œ๊ฑฐ... ๋งŽ์ด) ํ•˜์ง€๋งŒ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ธฐ๋ณธ์„ ๋ฐฐ์šฐ๋Š” ๋ฐ ํ™•์‹คํžˆ ๋„์›€์ด ๋˜์—ˆ๊ณ  ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ˆ˜์ค€์—์„œ redux๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ•ญ์ƒ Jumpstate๊ฐ€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ redux๋ฅผ ๋ฐฐ์šฐ๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ Jumpstate slack ์กฐ์ง์—์„œ ๋ฐ›์Šต๋‹ˆ๋‹ค.

๊ทธ ์‚ฌ๋žŒ๋“ค์ด ์˜ค๋Š˜๋‚ ์—๋„ ์—ฌ์ „ํžˆ jumpstate๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์˜ค๋Š˜๋‚ ์—๋„ ์—ฌ์ „ํžˆ ๊ทธ๊ฒƒ์„ ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค). ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ทธ๋“ค์ด ๊ฐ€์ง„ ๊ฒฝํ—˜๊ณผ redux ์ƒํƒœ๊ณ„์—์„œ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ์ƒ์‚ฐ์„ฑ์„ ๋ฐœํœ˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€์˜€์Šต๋‹ˆ๋‹ค.

์ด ํ† ๋ก ์— ๋Œ€ํ•ด ์ƒ๊ฐ๋‚˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด:

  • ๋‹จ์ˆœํ™”๋œ redux๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€์— ๋Œ€ํ•œ ๋ฉ”ํƒ€ ์˜ˆ์ œ๋ฅผ ์ œ์•ˆํ•˜๊ณ , ํ•œ ๋ฒˆ ์ฐ”๋Ÿฌ๋ณด์„ธ์š”!
  • ์ž์ฃผ ๋ณต์ œ๋˜๊ณ  ๋งค์šฐ ๋…๋‹จ์ ์ธ redux middlewars์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋…ผ์˜ํ•˜๊ณ  ํ‘œ์ค€์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ redux ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋งŽ์€ ๋‹จํŽธํ™”๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋‘์˜ ๋…ธ๋ ฅ์ด redux์˜ ์žฅ๊ธฐ์ ์ธ ์ƒ์กด๊ณผ ์‚ฌ์šฉ์— ๋ณ€ํ™”๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์‹์œผ๋กœ๋“  ๊ฐœ์„ ๋œ ๋ฌธ์„œ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์–ผ๋งˆ๋‚˜ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋งŽ์ด. Redux ๋ฌธ์„œ์— ๊ด€ํ•ด์„œ๋Š” AngularJS์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฅํ™ฉํ•˜์ง€๋งŒ AngularJS์™€ ๋‹ฌ๋ฆฌ "ํ‘œ์‹œํ•˜๊ณ  ๋งํ•˜์ง€ ์•Š๊ธฐ" ์›์น™์— ์‹คํŒจํ•˜๊ธฐ ๋•Œ๋ฌธ์— AngularJS 1์˜ ๋ฌธ์„œ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Redux์˜ ๋ฌธ์„œ๋Š” ์ฝ”๋“œ์˜ ์‹ค์ œ ๋ฐ๋ชจ๋ณด๋‹ค ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, "์—ฌ๊ธฐ์— ์ฝ”๋“œ ์„ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋งํ•˜์ง€ ์•Š๊ฒ ์ง€๋งŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฏฟ์œผ์‹ญ์‹œ์˜ค"๋ผ๋Š” ์ˆœ๊ฐ„์ด ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ์—†๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ์ปฌ์—์„œ ํ•˜๋Š” ์ผ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ณ  ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ์Šค์Šค๋กœ ๊บผ์ง„๋‹ค๋Š” ์ž์‹ ์˜ ๋ณธ๋Šฅ์„ ๋ฏฟ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ Todo List ์•ฑ์กฐ์ฐจ๋„ Redux์˜ "hello world" ์ตœ๊ณ ์˜ ์˜ˆ๋Š” ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋‹ค์ด์–ด๊ทธ๋žจ์ด ํ™•์‹คํžˆ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚˜๋Š” @sunjay ์˜ ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์€ ํŒŒ์ผ์ด ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ๋“ฑ ๋†’์€ ์ˆ˜์ค€์˜ ๋ณด๊ธฐ์—์„œ ํ•  ์ผ ๋ชฉ๋ก ์˜ˆ์ œ ์ž์ฒด๋ฅผ ์œ„ํ•ด ๋””์ž์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋Š” ๊ธด ํ…์ŠคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ๊ฑฐ์˜ ํ•ญ์ƒ ๋” ์ข‹์œผ๋ฉฐ ๋ฌธ์„œ์˜ ์žฅํ™ฉํ•จ์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋Š” ๋˜ํ•œ ์ดˆ๋ณด์ž๊ฐ€ ์ดˆ์ ์„ ์œ ์ง€ํ•˜๊ณ  Redux๋ฅผ ์ „์ฒด์ ์œผ๋กœ ๋” ์ž˜ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋‚ด ๋‘ ์„ผํŠธ: ์ฝ”์–ด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ทธ ๊ด‘์ฑ„๋Š” ๋‹จ์ˆœํ•จ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ „์ฒด์—์„œ ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์นœํ™”์„ฑ๊ณผ ์ถ”๊ฐ€ ์ถ”์ƒํ™”๋Š” ์‚ฌ์šฉ์ž ์˜์—ญ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์‹์ ์œผ๋กœ๋‚˜ ๊ด€์šฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค.

์„ค ์ˆ˜ ์žˆ์–ด Let's be be โค๏ธ

์ฆ‰, ๊ทธ ์œ„์— ๋” ๋งŽ์€ ์˜๊ฒฌ์ด ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ์›ํ•˜๋Š” ๋Œ€๋กœ ํŒจํ‚ค์ง€๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋„ ๊ทธ๋ ‡๊ธด ํ•œ๋ฐ ์ฝ”์–ด๋Š” ๋ฐ”๊พธ์ง€ ๋ง™์‹œ๋‹ค, ์ œ๋ฐœ์š”.

@HenrikJoreteg , ๋‘๋ ค์›Œํ•˜์ง€

๋งŽ์ด. Redux ๋ฌธ์„œ์— ๊ด€ํ•ด์„œ๋Š” AngularJS์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฅํ™ฉํ•˜์ง€๋งŒ AngularJS์™€ ๋‹ฌ๋ฆฌ "ํ‘œ์‹œํ•˜๊ณ  ๋งํ•˜์ง€ ์•Š๊ธฐ" ์›์น™์— ์‹คํŒจํ•˜๊ธฐ ๋•Œ๋ฌธ์— AngularJS 1์˜ ๋ฌธ์„œ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋งค์šฐ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. Redux๊ฐ€ ์ƒˆ๋กœ ๋‚˜์™”์„ ๋•Œ ํ•œ ๊ฐ€์ง€๋Š” ๋ฌธ์„œ๊ฐ€ ๋“œ๋ฌผ์—ˆ์ง€๋งŒ ๊ธฐ๋ณธ ์‚ฌํ•ญ์€ ์žˆ์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด "๋„ˆ๋ฌด ๊ฐ„๋‹จ"ํ•ด์„œ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜จ๋ผ์ธ ๋ฆฌ์†Œ์Šค๋Š” ์ด์ œ "๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด"์™€ "๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์ƒ์šฉ๊ตฌ ๊ฐ์†Œ ๋„๊ตฌ"์ธ "์‹ค์ œ ๊ธฐ์ˆ "์„ ๋ณด์—ฌ์ฃผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์••๋„๋ฉ๋‹ˆ๋‹ค.

"์ ์„์ˆ˜๋ก ์ข‹๋‹ค"๋ผ๋Š” ๋ง์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@Phoenixmatrix , @Sylphony : ๊ทธ๋ ‡๋‹ค๋ฉด ์ž ์žฌ์ ์ธ ๋ฌธ์„œ ๊ฐœํŽธ์€ ์–ด๋–ค ๋ชจ์Šต์ผ๊นŒ์š”?

๊ฐœ์ธ์ ์œผ๋กœ, "์ดˆ๋ณด์ž ์ƒ์ "์ด ์žˆ๋‹ค๋Š” ์œ„์˜ ์ œ์•ˆ๊ณผ ๊ฒฐํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค(2๊ฐœ์˜ ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ/๋ฌธ์„œ๊ฐ€ ์•„๋‹ˆ๋ผ 2๊ฐœ์˜ ๋‹ค๋ฅธ ์„น์…˜).

๊ท€์—ฝ๊ณ  ๋‹จ์ˆœํ•œ ๊ทธ๋ฆผ์ด ๋งŽ์ด ์žˆ๋Š” "Redux ์•„ํ‚คํ…์ฒ˜"๋Š” ์•ก์…˜๊ณผ ๋ฆฌ๋“€์„œ๋ฅผ ์„ค๋ช…ํ•˜๊ณ  react-redux์™€ ์•„๋งˆ๋„ ์ฝํฌ๋ฅผ ์†Œ๊ฐœํ•˜๊ณ  "์Šคํƒ€ํ„ฐ ์Šคํ† ์–ด"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์„ ํ–‰ ๊ตฌ์„ฑ์„ ์ œํ•œํ•˜๊ณ  ์–ผ๋งˆ๋‚˜ ์‰ฌ์šด์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ajax ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ™”๋ฉด์— ๋‚ด์šฉ์„ ๋ Œ๋”๋งํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์•ฑ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ๊ณ ๊ธ‰ ๊ฐœ๋…์ด ํฌํ•จ๋œ "ํƒ์ƒ‰" ์„น์…˜์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ๋„ ์•„๋งˆ ๋งŽ์€ ๊ฒƒ์„ ์ฐข์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚˜์—๊ฒŒ ์•ฑ์— ์—ฌ๋Ÿฌ ์Šคํ† ์–ด๋ฅผ ๊ฐ–๋Š” ์„น์…˜์ด ์žˆ๋‹ค๊ณ  ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•Œ๋ฉด ์ข‹์€๋ฐ ๊ทธ ์“ฐ์ž„์ƒˆ๊ฐ€ ์ •๋ง ๊ณ ๊ธ‰์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ƒˆ๋กœ์šด ์ด๋ฏผ์ž๊ฐ€ ๊ทธ๊ฒƒ์„ ๋ณด์ง€ ์•Š๊ณ  ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ๋ฌธ์„œ๋Š” ํ•ญ์ƒ ์ข‹์€ ์ƒ๊ฐ์ด์ง€๋งŒ ์ด๊ฒƒ์ด ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Redux API์˜ ์ƒ์šฉ๊ตฌ์™€ ์žฅํ™ฉํ•จ ๋•Œ๋ฌธ์— ์ถ”์ƒํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž‘์„ฑ๋˜๊ณ  ์ฑ„ํƒ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํŠน์ • ์ˆ˜์ค€ ๋˜๋Š” ๋‹ค๋ฅธ ์ˆ˜์ค€์—์„œ ๋ถ„๋ช…ํžˆ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Redux ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์กฐ๊ฐํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๊ณ„์— ์ ๊ทน์ ์œผ๋กœ ๊ธฐ์—ฌํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ๋™์ผํ•œ ์ €์ž๋“ค์ด "Redux๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค"๋Š” ์ด์œ ๋กœ ๊ณต๊ฐœ์ ์œผ๋กœ ํ„ํ•˜๋˜๊ณ  ํ•ด๊ณ ๋  ๋•Œ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ React ์ฝ”์–ด์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ์–ด๋Š ์ •๋„ "์ถ•๋ณต๋ฐ›์€" ๋” ๊ฐ„๋‹จํ•œ ์ถ”์ƒํ™”๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ชจ๋‘๊ฐ€ ์ด๊น๋‹ˆ๋‹ค. ํ•˜๋“œ์ฝ”์–ด ์‚ฌ์šฉ์ž๋Š” Redux๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๋” ์‰ฝ๊ณ  ๋œ ์žฅํ™ฉํ•œ API๋กœ ์ถ”์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@derekperkins "์ถ•๋ณต๋ฐ›์€" ๋„์„œ๊ด€์— ๋Œ€ํ•œ ํ•ฉ์˜๋Š” ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋‚˜์š”? ๊ทธ ์•ˆ์— ๋“ค์–ด๊ฐˆ ๋‚ด์šฉ๊ณผ ์ž‘์—…ํ•  ์‚ฌ๋žŒ์„ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด๊ฒƒ์— ๋ชจ๋‘ ์ฐฌ์„ฑํ•˜์ง€๋งŒ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ์ƒํƒœ๊ณ„๋ฅผ ๋”์šฑ ๋ถ„์—ด์‹œํ‚ค๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

๊ด€๋ จ xkcd: https://xkcd.com/927/

๋„ค, redux์˜ ํ•ต์‹ฌ๊ณผ react-redux๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ํ•ฉ์˜์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. redux-thunk์™€ redux-actions์กฐ์ฐจ๋„ ๊ฒฝ๊ณ„์„ ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๊ทธ ์ˆ˜์ค€์—์„œ๋„ ๋Œ€๋‹ค์ˆ˜์˜ ์‚ฌ๋žŒ๋“ค์ด ํ•„์š”๋กœ ํ•˜๋Š” ๋ฐ”๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Redux์—์„œ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์€ "ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ถ”์ƒํ™”ํ•  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์‹ ์ธ์ด๋ผ๋„ "๊ทธ ๋ถ€๋ถ„"์€ ๊ทน๋ช…ํ•˜๊ฒŒ ๋‹ฌ๋ผ์ง„๋‹ค.

์  ์žฅ, ์šฐ๋ฆฌ๋Š” ๋งŽ์€ (์ˆ˜์‹ญ ๊ฐœ) redux ์•ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๋‹ค๋ฅธ ์•ฑ์ด ๋‹ค๋ฅธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณตํ†ต ์ƒ์šฉ๊ตฌ ๊ฐ์†Œ ์Šคํƒ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์•ฑ ๋˜๋Š” ๋™์ผํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ฐ€์ง„ ๋ช‡ ๊ฐœ์˜ ์•ฑ์ด ์žˆ์œผ๋ฉด ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ๊ฒƒ์กฐ์ฐจ๋„ ๊ฝค ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์•„์ด๋””์–ด๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํˆดํ‚ท์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. CRA๋ฅผ ์˜ˆ๋กœ ์‚ฌ์šฉ: Babel, Webpack ๋ฐ ESLint๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์ˆ˜ํžˆ ๋งŽ์Šต๋‹ˆ๋‹ค. CRA๊ฐ€ ํ•˜๋Š” ์ผ์€ ์‚ฌ์šฉ์ž ์ธก์—์„œ ๋ฒˆ๊ฑฐ๋กœ์›€ ์—†์ด ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋…๋‹จ์ ์ธ ๋‹จ์ผ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ํ•™์Šต์ž๋ฅผ ์œ„ํ•ด ๋” ๋‚˜์€ ํ™˜๊ฒฝ์„ ๋งŒ๋“œ๋Š” ์—ฌ๋Ÿฌ ์„ค์ •์„ ์˜๋„์ ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ์ž๊ฐ€ _์›ํ•˜๋Š” ๊ฒฝ์šฐ_ ๊ตฌ์„ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ชจ๋“  ๋‹จ์ผ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. CRA๋Š” ๊ณ ๊ธ‰ ์ฝ”๋“œ ๋ถ„ํ• , ๋‹ค์ค‘ ์ง„์ž…์ , SSR ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CRA ๋ฌธ์„œ _do_๋Š” ๋” ๋งŽ์€ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ณตํ•˜๊ณ  ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋” ์ž˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ ๋ฐ ์˜ต์…˜์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋นจ๋ฆฌ ์ผ์–ด๋‚˜์„œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ
redux์™€ ์ด ๊ฐ€์ƒ ๊ตฌ์„ฑ ๋ ˆ์ด์–ด๋งŒ ์„ค์น˜ํ•˜๋ฉด ๋˜๋‚˜์š”? ์ €๊ฒƒ
๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋˜ ๋‹ค๋ฅธ ์•„์ด๋””์–ด๋Š” ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์ ์ง„์  ํ•™์Šต ๊ธฐํšŒ๋ฅผ ๊ด€์ฐฐํ•˜๊ณ  ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์—
์ด๋Ÿฐ ์‹์œผ๋กœ ์ถ”์ƒํ™” ๊ณ„์ธต์€ ๋Œ€ํ™”ํ˜• ๊ต์œก ๋„๊ตฌ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2017๋…„ 3์›” 20์ผ ์›”์š”์ผ ์˜คํ›„ 4:14 Mark Erikson [email protected]
์ผ๋‹ค:

์—ฌ๊ธฐ์—์„œ ์•„์ด๋””์–ด๋Š” ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํˆดํ‚ท์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด. CRA๋ฅผ ์˜ˆ๋กœ ์‚ฌ์šฉ: ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
Babel ๋ฐ Webpack ๋ฐ ESLint. CRA๊ฐ€ ํ•˜๋Š” ์ผ์€ ๋‹จ์ผํ•œ ์˜๊ฒฌ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž ์ธก์—์„œ ๋ฒˆ๊ฑฐ๋กœ์›€ ์—†์ด ๋ชจ๋‘ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ
์˜๋„์ ์œผ๋กœ ์ƒํ™ฉ์„ ๊ฐœ์„ ํ•˜๋Š” ์—ฌ๋Ÿฌ ์„ค์ •์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
ํ•™์Šต์ž. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ๊ตฌ์„ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๊ทธ๋“ค์€ ์›ํ•œ๋‹ค .

๋˜ํ•œ ๋ชจ๋“  ๋‹จ์ผ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. CRA๋Š” ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ณ ๊ธ‰ ์ฝ”๋“œ ๋ถ„ํ• , ๋‹ค์ค‘ ์ง„์ž…์ , SSR ๋˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
์ €๊ฒƒ. CRA๊ฐ€ ์›Œ๋“œ ํ”„๋กœ์„ธ์„œ๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ ๋ฐ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์˜ต์…˜์— ์ง€์ ์„
๋” ๋งŽ์€ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ์„ฑ๊ณผ ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธ
https://github.com/reactjs/redux/issues/2295#issuecomment-287914805 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AFUmCactFzsw7etmGGP8MFK6kfNaOzTJks5rnvorgaJpZM4MhnVF
.

@sunjay ํด๋ฆญํ•˜์ง€ ์•Š๊ณ ๋„ xkcd ๋งํฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. :)

๋‚˜๋Š” @markerikson์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋“  ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•ต์‹ฌ Redux ๊ฐœ๋ฐœ์ž๊ฐ€ "์ด๊ฒƒ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋Š” ๋…๋‹จ์ ์ธ ์ง„์ˆ ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์ƒ์ ์ธ ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ๊ฐ’์ด ๊ฐœ๋ฐœ์ž์˜ 80%์— ๋Œ€ํ•ด ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์žฅ๋‹ดํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ Redux์— ์ž‘์„ฑ๋˜๊ฑฐ๋‚˜ ์ž‘์„ฑ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ํ•™์Šต ๊ณก์„ ์„ ๊ฐ€์†ํ™”ํ•˜๋Š” ๊ฒƒ ์ด์ƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” Jumpstate์™€ ๊ฐ™์€ ๊ณณ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Redux ํ•™์Šต ๊ณก์„ ์€ ๊ฐ€ํŒŒ๋ฅด์ง€๋งŒ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋ฉด ์ถ”์ƒํ™” ๊ณ„์ธต์˜ ํ•„์š”์„ฑ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์–ด๋Š ์ •๋„๋Š” ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ•ญ์ƒ ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์— C๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ดํ•ดํ•˜์ง€๋งŒ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์ด ์ฒ˜๋ฆฌ๋˜๋Š” Go๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ํ›จ์”ฌ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์˜ Tensorflow ์˜ˆ์ œ์— ๋”ฐ๋ฅด๋ฉด ๋‚ฎ์€ ์ˆ˜์ค€์˜ API์— ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์„ฑ๋Šฅ์ด ์ข‹์ง€๋งŒ Python keras ์ถ”์ƒํ™”์˜ ์‚ฌ์šฉ ํŽธ์˜์„ฑ์— ๋Œ€ํ•ด์„œ๋„ ํ•  ๋ง์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Redux ๋Œ€ Jumpstate(๋˜๋Š” ์ด ๋ฌธ์ œ์—์„œ ํŒŒ์ƒ๋œ ์ถ”์ƒํ™”)์˜ ๊ฒฝ์šฐ ์ƒ์šฉ๊ตฌ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ์›์‹œ Redux์˜ ๋ชจ๋“  ์œ ์—ฐ์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์„ฑ๊ฐ€์‹  ์ผ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋‚˜์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ๋‹ค๋ฉด ๋‚˜๋Š” ์ด๊ฒƒ์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค :

  • ๋ฐ”๋‹๋ผ Redux๋ณด๋‹ค ํƒ€์ดํ•‘ํ•˜๊ธฐ ์‰ฌ์šด Flow/TypeScript ์นœํ™”์  ํ•˜์œ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.
  • ์ƒ์ˆ˜๋ฅผ ๊ทธ๋‹ค์ง€ ๊ฐ•์กฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋‹จ์ง€ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์‹ญ์‹œ์˜ค).
  • React ๋˜๋Š” ๋‹ค๋ฅธ ๋ทฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์„ฑ์„ ์œ ์ง€ํ•˜์ง€๋งŒ ๊ธฐ์กด ๋ฐ”์ธ๋”ฉ์„ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: mapStateToProps ๊ตฌํ˜„ ์ œ๊ณต).
  • Redux ์›์น™ ์œ ์ง€(์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ์ž‘์—…, ์‹œ๊ฐ„ ์—ฌํ–‰ ๋ฐ ํ•ซ ์žฌ๋กœ๋”ฉ์ด ์ž‘๋™ํ•ด์•ผ ํ•˜๊ณ  ์ž‘์—… ๋กœ๊ทธ๊ฐ€ ์˜๋ฏธ๊ฐ€ ์žˆ์–ด์•ผ ํ•จ).
  • ๋ณด๋‹ค ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฝ”๋“œ ๋ถ„ํ• ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ๋“€์„œ์™€ ์„ ํƒ๊ธฐ๋ฅผ ํ•จ๊ป˜ ๋ฐฐ์น˜ํ•˜๋„๋ก ์žฅ๋ คํ•˜๊ณ  ํ•จ๊ป˜ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋œ ์–ด์ƒ‰ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค(์ž‘์„ฑ โ€‹โ€‹๋ฐ ๊ตฌ์„ฑ์ด ์‰ฌ์šด ๋ฆฌ๋“€์„œ-์„ ํƒ๊ธฐ ๋ฒˆ๋“ค ์ƒ๊ฐ).
  • ์•ก์…˜ ์ƒ์„ฑ์ž๋ฅผ ๋ฆฌ๋“€์„œ์™€ ํ•จ๊ป˜ ๋ฐฐ์น˜ํ•˜๋Š” ๋Œ€์‹  ์•ก์…˜ ์ƒ์„ฑ์ž๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๊ณ  ์•ก์…˜ ๋Œ€ ๋ฆฌ๋“€์„œ์˜ ๋‹ค๋Œ€๋‹ค ๋งคํ•‘์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ํ”ผํ•˜๋Š” ๋Œ€์‹ ).
  • ํ•ฉ๋ฆฌ์ ์ธ ์„ฑ๋Šฅ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด Reselect๋ฅผ ํ†ตํ•œ ๋ฉ”๋ชจํ™”๊ฐ€ "๊ทธ๋ƒฅ ์ž‘๋™"ํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์‹ฑ, ์ •๊ทœํ™”, ์ปฌ๋ ‰์…˜ ๋ฐ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ์ œ๊ณต ๋„์šฐ๋ฏธ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๋น„๋™๊ธฐ ํ๋ฆ„ ์ง€์›์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ํ•ต์‹ฌ ์™ธ์—๋„ ๊ณต์‹ Redux๋กœ ๋ธŒ๋žœ๋“œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ, ๋‚˜๋Š” ์ด๊ฒƒ์„ ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋ฅผ ์œ„ํ•ด, ๋ช‡ ๋‹ฌ ์ „์— redux ๋ฐฐ์šธ ๋•Œ ๋ฌธ์„œ๋ฅผ ์ฝ์—ˆ์ง€๋งŒ ์ž˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ src ์ฝ”๋“œ ๋ฅผ ์ฝ๋Š” ๋ฐ 2์ผ์„ ๋ณด๋‚ธ ๋‹ค์Œ api ์— ๋Œ€ํ•œ ๋ชจ๋“  ์„ค๋ช…์„ ๋ฌธ์„œ๊ฐ€ ๋ช…ํ™• ํ•ด

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ, "์ƒํƒœ ๋””์ž์ธ", "๋ฆฌ๋“€์„œ ๋ถ€๋ฌธ", "๋ฏธ๋“ค์›จ์–ด ๋””์ž์ธ", "๋น„๋™๊ธฐ ์†”๋ฃจ์…˜"......์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด ๋‹ค์Œ ๋‹ฌ์— ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์ฑ•ํ„ฐ๋„ ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ src ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด redux ๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋‹จ๊ณ„ ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ทธ redux ์˜ ํ™˜๊ฒฝ์„ ๋ณด๋‹ค ์›ํ™œํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ  ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„๋™๊ธฐ ์ง€์›.

redux-thunk, redux-saga ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„๋™๊ธฐ ์ง€์›

๊ทธ๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ๋” ๋‚˜์€ ๊ฒƒ์„ ์ฐพ๊ธฐ ์ „์— 0.5์ดˆ ๋™์•ˆ ๊ทธ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด์—์„œ API๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ์ฝœ๋ฐฑ/์•ฝ์† ํ•ด๊ฒฐ์—์„œ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์ฆ‰์‹œ ์™ธ๋ถ€ํ™”ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค(์ € ํฌํ•จ). ๊ทธ๋Ÿฌ๋‚˜ ๋ฏธ๋“ค์›จ์–ด ์—†์ด๋„ async๋ฅผ ์ž˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@gaearon ์˜ ์˜๊ฒฌ์€ ์Šค์œ•์ด ์–ผ๋งˆ๋‚˜ ๊ด‘๋ฒ”์œ„ํ•œ์ง€๋ฅผ ๊ฐ•์กฐํ•œ๋‹ค๋Š” ์ ์—์„œ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฐ€ ์ œ์•ˆํ•œ Redux 2.0์˜ ์ •๋ฐ€ํ•จ๊ณผ ์šฐ์•„ํ•จ, ๊ฐ•๋ ฅํ•จ์„ ์ „์ ์œผ๋กœ ์‚ฌ๋ž‘ํ•˜๊ณ  ๊ฐ์‚ฌํ•˜์ง€๋งŒ, ๊ทธ ๊ฐœ์„  ์‚ฌํ•ญ ์ค‘ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์ด ๋‚˜์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค!

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋งค๋ ฅ์ ์ด๋ผ๊ณ  โ€‹โ€‹์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ž์‹ ์˜ Redux ์ถ”์ƒํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋Š” ๊ฑฐ์˜ ์™„์ „ํžˆ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ผ ๊ฐ์†๊ธฐ ๋™์ž‘, ์›์ž ๊ฐ์†๊ธฐ ๊ธฐ๋Šฅ์„ ๋™์ž‘ ์ฝ”๋“œ ๋ฐ ์„ ํƒ๊ธฐ์™€ ๋ฒˆ๋“ค๋กœ ๋ฌถ๋Š” ๊ฒƒ, ๊ฐœ์ฒด ํ‚ค๋ฅผ ์œ„ํ•ด ๋ฌธ์ž์—ด์„ ์™„์ „ํžˆ ์—†์• ๋Š” ๊ฒƒ์—์„œ ์—„์ฒญ๋‚œ ๊ฐ€์น˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚ด ์ž์‹ ์˜ 90% ์†”๋ฃจ์…˜์ด๋ฉฐ ๋‹ค๋ฅธ ๋ฌด์—‡๋ณด๋‹ค ํƒœ๋„์—์„œ CRA์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กœ์šด ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์†”๋ฃจ์…˜ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Dan์ด ๊ทธ๊ฐ€ ์„ค๋ช…ํ•œ ๋Œ€๋กœ Redux 2.0์„ ๊ตฌ์ถ•ํ–ˆ๋‹ค๋ฉด ๋‚˜๋„ ๊ทธ ์œ„์— ๋‚ด ์ž์‹ ์˜ ์ถ”์ƒํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๊ตฌ์ถ•ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

@jbellsey Redux๋Š” ์ „์—ญ์ ์œผ๋กœ ์•ฑ์— ์ž‘์—…๊ณผ ์ƒํƒœ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ํƒ์›” ํ•˜์ง€๋งŒ ์ •์˜๋œ ๋ฒ”์œ„ ๋‚ด์—์„œ redux ์Šคํ† ์–ด์˜ ๋ฌดํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๊ฒƒ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด REDUX์˜ ๋‚ด๋ถ€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ํ˜œํƒ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ...

์šฐ๋ฆฌ๋Š” ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๊นŒ?

์•ฑ์˜ ์ „์—ญ ์ƒํƒœ ์ž…๋‹ˆ๋‹ค. R eliable E sthetics D elivered U nified ์ „์ž X tensible : ๋งˆ์Œ :

์•„๋ฌด๋„ ๊ธ€๋กœ๋ฒŒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ํ•˜๋‚˜๋Š” ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค :tm:

redux๋ฅผ ์ง€๊ธˆ์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค. ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์š”๋ฆฌ ์ฑ…์€ ํ•ญ์ƒ ์•ฝ 100์‹œ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

@markerikson ์ด๋Ÿฌํ•œ ์ƒ๊ฐ์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์„œ/์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ์š”? ์ด๋ฏธ ๋ช‡ ๊ฐ€์ง€ ๋†€๋ผ์šด ์•„์ด๋””์–ด๊ฐ€ ์žˆ์—ˆ๊ณ  48์‹œ๊ฐ„ ๋ฐ–์— ์ง€๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค ๐ŸŽ‰

์ €๋ฅผ ์œ„ํ•ด, ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ฝํฌ๋‚˜ ์‚ฌ๊ฐ€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  JavaScript์—์„œ ์ข…์†์„ฑ ์ฃผ์ž… ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค.

Redux๋Š” ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ทจ๊ธ‰ํ•˜๋ฉด ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

  • Redux์—๊ฒŒ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์•Œ๋ ค์ฃผ๊ณ  ์ž‘์—…(์ด๋ฒคํŠธ)์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ์— ์–ด๋–ป๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋ฐ ์ €์žฅ ํ”„๋กœ์‹œ์ €์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.)
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ Redux๋Š” ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฆฌ์Šค๋„ˆ์—๊ฒŒ ์•Œ๋ฆฌ๊ณ  ์ƒํƒœ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ๋””๋ฒ„๊ทธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ €์—๊ฒŒ ์žˆ์–ด Redux๋Š” ์ €์—๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ HTTP ํ˜ธ์ถœ์„ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค). I/O ๋ฐ ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฝ์šฐ Redux ์™ธ๋ถ€์—์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Redux ์Šคํ† ์–ด๋ฅผ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ์„œ๋ช…์€ ํ•ญ์ƒ store.dispatch(actionObject) ์ž…๋‹ˆ๋‹ค. ๋””์ŠคํŒจ์น˜ ๊ธฐ๋Šฅ์ด ์—†๊ณ  ์ž‘์—… ๋‚ด๋ถ€์— ์ˆจ๊ฒจ์ง„ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(์˜ˆ: ์ž‘์—…์„ ๋””์ŠคํŒจ์น˜ํ•˜๋ฉด API ํ˜ธ์ถœ์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Œ).

@tannerlinsley : ๋„ค,

์ด ๋…ผ์˜๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋‚˜์—๊ฒŒ ํ•œ ๊ฐ€์ง€ ๋‹จ์ ์€ : ๋‚˜๋Š” ์ด๋ฏธ ๋‚ด๊ฐ€ ์•ฝ์— ๋Œ€ํ•œ ์ž‘์—… ๋ฐ ์“ฐ๊ธฐ์— ํ•„์š”ํ•œ ๋ฌผ๊ฑด์˜ ํ†ค์„ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ์ž์ฒด์ ์œผ๋กœ ๋ถ€๊ณผ๋˜์ง€๋งŒ, ๋‚ด๊ฐ€ ์กฐ์‚ฌํ•˜๊ณ  ์‹ถ์€ Redux ๊ด€๋ จ ์ฃผ์ œ ์ค‘ ์ผ๋ถ€์— ๋Œ€ํ•ด ์ž‘์—…ํ•  ์‹œ๊ฐ„์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ• ํ€ด๋‹ค.

๋‚˜๋Š” ์ด๋Ÿฌํ•œ ๊ฐ€๋Šฅํ•œ ๋…ธ๋ ฅ์— ์ ˆ๋Œ€์ ์œผ๋กœ ์ฐธ์—ฌํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ฐธ์—ฌํ•˜๊ณ  ํ•จ๊ป˜ ์ผํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๋ชจ๋“  OSS ๊ด€๋ฆฌ์ž์˜ ์œ ๋ช…ํ•œ ๋งˆ์ง€๋ง‰ ๋ง... :))

Redux๋Š” ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ทจ๊ธ‰ํ•˜๋ฉด ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ถ”์ฒœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค!

  • ์ƒ์ ์„ ์ •์ƒํ™”ํ•˜์‹ญ์‹œ์˜ค.
  • ๋ณด๊ธฐ์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์šฉ ๊ฐ์†๊ธฐ ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด reselect ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณ ๋ คํ•˜๋‹ค.
  • ์ž‘์—…์€ ๋‹ค๋ฅธ ์ž‘์—…์„ ํŠธ๋ฆฌ๊ฑฐํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‰ฌ์›Œ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ componentDidMount ํ›„ํฌ๊ฐ€ ์žˆ์œผ๋ฉด ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๊ณ„์ธต ๊ตฌ์กฐ์—์„œ ์œ„๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ์‰ฌ์šด ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

FWIW, ์ €๋Š” Redux๋ฅผ D3.js (React ์—†์ด)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ ๊ฝค ์ž˜ ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ d3-component ์— ๋‚˜์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

React Redux ๋ฐ”์ธ๋”ฉ์—์„œ ๊ฐ€์žฅ ๊ทธ๋ฆฌ์šด ๊ฒƒ์€ connect ์ž…๋‹ˆ๋‹ค. @gaearon ์˜ ์œ„ ๊ฐœ์š”/๋น„์ „์—์„œ ๋‚ด๊ฐ€ ๊ฐ€์žฅ ๊ด€์‹ฌ์„ mapStateToProps ๊ตฌํ˜„ ์ œ๊ณต"์ž…๋‹ˆ๋‹ค.

๋ณด๊ธฐ์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์šฉ ๊ฐ์†๊ธฐ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์‹œ ์„ ํƒํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ณ ๋ คํ•˜๋‹ค.

์˜ˆ, ์ด๊ฒƒ์€ ํŠธ์œ„ํ„ฐ๊ฐ€ ์ƒ์ ์—์„œ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ œ ์ƒ๊ฐ์—๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋งต์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ID์™€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋ณธ ํ”ผ๋“œ์ธ timeline ๋ณด๊ธฐ๋ฅผ ํฌํ•จํ•˜๋Š” entities ๋ถ„๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—”ํ‹ฐํ‹ฐ ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•œ id ์ฐธ์กฐ๋ฅผ ๋ณด์œ ํ•˜์ง€๋งŒ ์ด๋ฏธ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ๋œ ๊ฒƒ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋™์ ์ธ ๋ชฉ๋ก์„ ๋‹ค์‹œ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ... ๋„ˆ๋ฌด ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๊ฐ€์˜ค๋Š” ๋ฆฌํŒฉํ„ฐ๋ง์—์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.) ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๋‹จ์ ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๋ณต๋˜๊ณ  ๋ทฐ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ ๋ฐ ์‚ญ์ œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ฝ 2๊ฐœ์†Œ(๋˜๋Š” ๊ทธ ์ด์ƒ)๋ฅผ ์ž์ฃผ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์žฅ๊ธฐ์ ์œผ๋กœ ์ƒ๋‹นํžˆ ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค.

@stefensuhat ์Šค์Šค๋กœ Redux๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•  ๋•Œ Promise ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/iddan/delux ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@gaearon ๋‹˜ ์˜ ๋ชฉ๋ก์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค! ์šฐ๋ฆฌ๋Š” ๋‚ด๊ฐ€ ์ผํ•˜๊ณ  ์žˆ๋Š” ์กฐ์ง์—์„œ ๋ชฉ๋ก์˜ 90%๋ฅผ ๋”ฐ๋ฅด๋Š” redux ์ƒ์šฉ๊ตฌ๋ฅผ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(๋˜ํ•œ ducks principes๋ฅผ ๋”ฐ๋ฆ„). ํ˜„์žฌ๋กœ์„œ๋Š” ์ถœ์‹œ ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์€ ์ดˆ๊ธฐ ๋ฆด๋ฆฌ์Šค์ž…๋‹ˆ๋‹ค.

์ด ์ข‹์€ ์•„์ด๋””์–ด์— ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

@markerikson @tannerlinsley

์ด๋Ÿฌํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ๋งŒ๋“  ํ›„ ํ•ด๋‹น ์ €์žฅ์†Œ์— Github ์ด์Šˆ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ฐœ๋ฐœ์„ ์ถ”์ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ๋ฌธ์ œ ๋ชฉ๋ก๊ณผ ํ•จ๊ป˜ ์—ฌ๊ธฐ์— ๋Œ“๊ธ€์„ ๋‹ฌ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํŠน์ • ํ•ญ๋ชฉ์ด redux์™€ ํ•จ๊ป˜ ์ œ๊ณต๋œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์ง€๋งŒ ํŠน์ • ํ•ญ๋ชฉ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ† ๋ก ์„ ๋”ฐ๋ฅด๊ณ  ์ด๋ฅผ ์‹คํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํ•จ๊ป˜ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ œ์•ˆ์„ ํ˜„์‹ค๋กœ ๋งŒ๋“œ๋Š” ๋ถ€๋‹ด์€ ๊ฐ๊ฐ์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ์ ‘๊ทผ ๋ฐฉ์‹์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์šฐ๋ฆฌ ๋ชจ๋‘์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค. Mark๊ฐ€ ํ† ๋ก ์„ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ์•„๋ฌด๋„ ๊ทธ๊ฐ€ ๊ฐ€์„œ ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

๋„ค, @gaearon ์˜ ๋ชฉ๋ก์€ ์ด์ƒ์ ์ด์ง€๋งŒ ์ด๋ฏธ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๊ทธ๊ฒƒ์€ ๋งŽ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ๋˜‘๋ฐ”๋กœ ๋‹ค๋ฃจ๋ ค๊ณ  ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ๋ง๊ฐ์— ๋ฐ”์ดํฌ ์…ฐ๋”ฉ์— ์ง๋ฉดํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ด€๊ณ„์—†์ด ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ ๋งจ ์œ„์— ์ „์ฒด ๋ ˆ์ด์–ด๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ž‘์€ ์กฐ๊ฐ์„ ํ•œ ๋ฒˆ์— ๊ณต๊ฒฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (๋‹ค์‹œ ๋ฏธ๋ฆฌ ๊ตฌ์„ฑ๋œ ์Šคํƒ€ํ„ฐ ์Šคํ† ์–ด์˜ ์˜ˆ๋ฅผ ๋ฐ€์–ด ๋„ฃ์Šต๋‹ˆ๋‹ค ;))

์ฆ‰, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ „์ฒด ๋ชฉ๋ก์„ ๊ณต๊ฒฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ Redux ์™ธ๋ถ€, ์‹ฌ์ง€์–ด React ์™ธ๋ถ€์— ์กด์žฌํ•˜๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ์™€ ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค. React/Redux๋Š” Vanilla Flux, MobX, VueJS ๋ฐ Angular๋ณด๋‹ค ์ƒํƒœ๊ณ„์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋“ , ์•„๋งˆ๋„ ์ด๋Ÿฌํ•œ ์ด์  ์ค‘ ์ผ๋ถ€(์ผ๋ถ€๋Š” @gaearon ๋ชฉ๋ก์˜ ์ผ๋ถ€์ž„)์— ๊ณ„์† ์ดˆ์ ์„ ๋งž์ถ”๊ณ , ๋งจ ์œ„์— ๊ตฌ์ถ•๋˜๋Š” ๋ ˆ์ด์–ด๊ฐ€ ์™„์ „ํžˆ ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ๋ฅผ

๋‚ด๊ฐ€ ๋งŒ๋“ค๊ณ  ์žˆ๋Š” ์˜ˆ: ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์†๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์œ ํ˜น์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋‹จ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด MobX๋ฅผ ๋ณต์ œํ•˜๋ฏ€๋กœ ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@Phoenixmatrix ์˜ˆ ๋‚ด ๋ง์€ redux์— ๊ธฐ๋ณธ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์™ธ๋ถ€ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜„

๋‚˜๋Š” Redux์˜ ํ˜„์žฌ ๊ตฌํ˜„์— ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ƒ์šฉ๊ตฌ๋Š” ์กด์žฌํ•˜์ง€๋งŒ ์œ ํ˜• ์‹œ์Šคํ…œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์‹ค์ œ๋กœ ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ํ•œ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ช‡ ๋…„ ์ „๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ณต์žกํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ํŒ€๊ณผ ํ•จ๊ป˜ ๋” ํฌ๊ณ  ๋” ๋ณต์žกํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒฝ์šฐ ์–ด๋ ค์›€์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•˜๊ณ  ์ƒˆ๋กœ์šด ํŒจํ„ด์ด ๋“ฑ์žฅํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ ์–ด๋ ค์›€์„ ๊ฑฐ๋ถ€ํ•˜๋Š” ๊ฒƒ์ด ์ œ๊ฒŒ๋Š” ์ •์ƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ผ์„ ๋” ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋ ค๊ณ  ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๋ง์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‚ฌ๋žŒ๋“ค์ด Redux๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ ์ƒ์ถฉ ๊ด€๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ณ  ํฐ ๊ทธ๋ฆผ์„ ๋ณด์ง€ ์•Š๊ณ  ๊ด€๋ จ๋œ ์ƒ์šฉ๊ตฌ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

Redux๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์„ ๋•Œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค(์ € ํฌํ•จ)์ด ๊ทธ๊ฒƒ์„ ๊ตฌ์ถ•ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๊ณ  @gaearon ์€ ์ตœ๊ณ ์˜ ๊ตฌํ˜„์„ ์–ป์—ˆ๊ณ  ํˆด๋ง/๋ฐ๋ชจ์—์„œ ์•„์ฃผ ์ข‹์€ ์ž‘์—…์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์‹œ๊ฐ„ ์—ฌํ–‰๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ƒˆ๋กญ์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์ž์—ฐ์Šค๋Ÿฌ์›Œ์ง€๋Š” ๊ฐœ๋… ๋•Œ๋ฌธ์— ์ฒ˜์Œ์— ๋งŽ์€ ๊ด€์‹ฌ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ Redux๋ฅผ ๋ฐ˜์ง์ด๋Š” ์ƒˆ ์žฅ๋‚œ๊ฐ์œผ๋กœ ๋ด…๋‹ˆ๋‹ค(์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡๊ฒŒ ์‰ฝ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๋Ÿฌํ•œ ๊ฐœ๋…์„ ์šฐ์•„ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ์— ์ด์‹ํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ œ์™ธํ•˜๊ณ  Redux์—์„œ ์‹ค์ œ๋กœ ์ƒˆ๋กœ์šด ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. Redux์™€ ๊ทธ ์ƒํƒœ๊ณ„์˜ ํŒจํ„ด์€ ์ด๋ฏธ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ, ์ด๋ฒคํŠธ ์†Œ์Šค ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„์— ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด์— ๋Œ€ํ•œ ๋ฐฐ๊ฒฝ ์ง€์‹์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์€ Redux๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ์‚ฌ๋žŒ๋“ค์€ ๊ด€๋ จ๋œ ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์— ๋Œ€ํ•ด ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•œ ์ฑ„ ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  Redux๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ตœ์†Œํ•œ์˜ ๋ฐฐ๊ฒฝ ์ง€์‹์„ ๊ฐ–์ถ”๊ธฐ ์œ„ํ•ด Redux์—์„œ ์ง„์ง€ํ•œ ๊ฒƒ์„ ๊ตฌ์ถ•ํ•˜๊ณ ์ž ํ•˜๋Š” ์‚ฌ๋žŒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒํ•˜๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฐฐ๊ฒฝ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ํ˜„์žฌ์™€ ์•ž์œผ๋กœ ๋ช‡ ๋…„ ๋™์•ˆ ๋งค์šฐ ์ค‘์š”ํ•œ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ๋•Œ ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

  • ์šฐ๋ฆฌ๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ๊ตฌ์„ฑ์›์„ ๊ตฌ์ถ•
  • ํ•ด๋‹น ๊ตฌ์„ฑ์›์€ ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์‹œ์Šคํ…œ์˜ ๋ฐ์ดํ„ฐ ํ•˜์œ„ ์ง‘ํ•ฉ๋งŒ ๋ณด์œ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ ๊ตฌ์„ฑ์›์€ ์šฉ๋Ÿ‰์ด ์ƒ๋‹นํžˆ ์ œํ•œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(์Šคํ† ๋ฆฌ์ง€, ๋Œ€์—ญํญ, ๋„คํŠธ์›Œํฌ ์•ˆ์ •์„ฑ...).

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋งค์šฐ ๋ณต์žกํ•œ ๊ฒƒ์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ๋ฐœ์ž๋ณด๋‹ค ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋” ์–ด๋ ค์šด ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์ˆ˜๋…„ ๋™์•ˆ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ •๋ง๋กœ ์—ด์‹ฌํžˆ ์ƒ๊ฐํ•œ ์‚ฌ๋žŒ๋“ค์˜ ์ด์ „ ์ง€์‹์„ ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ๋” ๊ฐ„๋‹จํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ DB ๋‚ด๋ถ€์˜ ์ƒํƒœ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์„ ์ฟผ๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•?

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์˜ค๋Š˜๋‚  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹ค์šฉํ™”ํ•˜๊ณ  ํ˜„์žฌ ์ง€์‹์œผ๋กœ ์‹ค์ˆ˜๋ฅผ ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์šฐ๋ฆฌ๊ฐ€ ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๋” ์ด์ƒ ๋‹จ์ˆœํ•˜์ง€ ์•Š๊ณ  ์ถ”๊ฐ€ ์ง€์‹์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ  ์ธ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Redux๋Š” ์ด๋Ÿฌํ•œ ์ง€์‹์„ ์–ป๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ฒ˜์Œ์—๋Š” ์‹ค์šฉ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•ž์œผ๋กœ ๋ช‡ ๋…„ ๋™์•ˆ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ด ์–ผ๋งˆ๋‚˜ ๋‹น์‹ ์„ ๋ถˆํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ๊ณผ์†Œํ‰๊ฐ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋ถˆํ–‰ํžˆ๋„ ์‚ฌ๋žŒ๋“ค์€ ๊ด€๋ จ๋œ ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์— ๋Œ€ํ•ด ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•œ ์ฑ„ ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  Redux๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์ข‹๋“  ๋‚˜์˜๋“  Redux๋Š” ๋ณธ์งˆ์ ์œผ๋กœ React ์ƒํƒœ ๊ด€๋ฆฌ ์ „์Ÿ์—์„œ ์Šน๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ƒํƒœ๊ณ„๋ฅผ ํ˜•์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ์ƒ๊น๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ์›ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ํ•ญ์ƒ ์žˆ์„ ๊ฒƒ์ด๋ฉฐ, ์ด๊ฒƒ๋งŒ ์žˆ์œผ๋ฉด ๋˜๋Š” ๋” ๊ฐ„๋‹จํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ๊ณ„์†ํ•ด์„œ ๋‹ค๋ฅธ ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฐ„๋‹จํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์˜ฌ๋ฐ”๋ฅธ ์ผ๋ฐ˜ ํŒจํ„ด์„ ์†Œ๊ฐœ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ตœ์†Œํ•œ์˜ ๋ฐฐ๊ฒฝ ์ง€์‹์„ ๊ฐ–์ถ”๊ธฐ ์œ„ํ•ด Redux์—์„œ ์ง„์ง€ํ•œ ๊ฒƒ์„ ๊ตฌ์ถ•ํ•˜๊ณ ์ž ํ•˜๋Š” ์‚ฌ๋žŒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒํ•˜๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฐฐ๊ฒฝ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ํ˜„์žฌ์™€ ์•ž์œผ๋กœ ๋ช‡ ๋…„ ๋™์•ˆ ๋งค์šฐ ์ค‘์š”ํ•œ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. Redux as is๋Š” ๊ทธ๊ฒƒ์„ ์ดํ•ดํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ๋‚˜์œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ดํ•ดํ•˜๋ฉด ๋” ๋‚˜์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ๋” ์ด์ƒ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ์‹œ์ž‘ํ•˜๋Š” ๊ณณ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ฃผ์œ„์— ์ข‹์€ ์˜๊ฒฌ์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋” ํƒ๊ตฌํ•  ์ˆ˜ ์žˆ๊ณ  ๋” ํƒ๊ตฌํ•ด์•ผ ํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ž ์žฌ์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋ฅผ ์ƒ๊ฐํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ด…์‹œ๋‹ค. ์ž‘์€ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ๋˜์ ธ์„œ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

redux-starter ๊ฐ™์€ ์ƒˆ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ•ด๋‹น ํŒจํ‚ค์ง€๋Š” redux-actions , redux-thunk ๋ฐ redux-logger , ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ์•ฝ์† ๊ธฐ๋ฐ˜ ๋ฏธ๋“ค์›จ์–ด์— ์˜์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. function createReduxStore({reducers, middleware}) {} ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค( ์ด์ „ @Phoenixmatrix ์˜ ์„ค๋ช…์„ ๊ธฐ๋ฐ˜์œผ๋กœ

createReduxStore() ํ•จ์ˆ˜๋Š” applyMiddleware ๋ฐ ๋ฃจํŠธ ๋ฆฌ๋“€์„œ์— ๋Œ€ํ•œ ํ•ซ ๋ฆฌ๋กœ๋”ฉ ์„ค์ •, Redux DevTools ํ™•์žฅ ๊ตฌ์„ฑ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌํ•จ๋œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ember-redux ์˜ ์ƒ์  ์„œ๋น„์Šค ์„ค์ • ์ฝ”๋“œ ๋˜๋Š” ๋‚ด "Project Mini-Mek" ์ƒ˜ํ”Œ ์•ฑ ์˜ ์žˆ์Šต๋‹ˆ๋‹ค .

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์„ค์ •์˜ ์–‘์„ ์ตœ์†Œํ•œ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ ๋‹นํ•œ ์ˆ˜์ค€์˜ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ์ €๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. (๊ธ€์Ž„์š”, ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ redux-actions ๋ฐ promise ๊ธฐ๋ฐ˜ ๋ฏธ๋“ค์›จ์–ด๋Š” ์ข‹์•„ํ•˜์ง€ ์•Š์ง€๋งŒ, ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด bikeshedding์„ ์ฆ๊ธฐ๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๋ฏธ๋“ค์›จ์–ด ์ˆ˜๋ฝ์„ ๊ท€์ฐฎ๊ฒŒํ•˜์ง€ ์•Š๊ณ  createStarterStore(reducer)๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

CombineReducer๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ„๋‹จํžˆ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const store = createStarterStore({
   foo,
   bar,
   baz
});

foo bar baz๋Š” ๊ฐ์†๊ธฐ์ž…๋‹ˆ๋‹ค.

๋“œ๋ž˜ํŠธ. "๋ฃจํŠธ ๋ฆฌ๋“€์„œ์— ๋Œ€ํ•œ HMR์„ ์„ค์ •ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋Šฅ"์ด ์•„๋งˆ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋ฃจํŠธ ๋ฆฌ๋“€์„œ ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋”๋ผ๋„ module.hot.accept() API ๋ฐ require(path) ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋‹จ๊ณ„๋Š” ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ๋นŒ๋“œ ์‹œ ์ •์ ์œผ๋กœ ๋ถ„์„ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. (์ œ ์ƒ๊ฐ์—๋Š”... ์ œ๊ฐ€ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.) ์•„, ๊ธ€์Ž„์š”.

ํ•˜์ง€๋งŒ createStarterStore() ๋Š” ๋ฃจํŠธ ๋ฆฌ๋“€์„œ๋‚˜ ์Šฌ๋ผ์ด์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ตœ์†Œํ•œ์˜ ๋ฐฐ๊ฒฝ ์ง€์‹์„ ๊ฐ–์ถ”๊ธฐ ์œ„ํ•ด Redux์—์„œ ์ง„์ง€ํ•œ ๊ฒƒ์„ ๊ตฌ์ถ•ํ•˜๊ณ ์ž ํ•˜๋Š” ์‚ฌ๋žŒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒํ•˜๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฐฐ๊ฒฝ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ํ˜„์žฌ์™€ ์•ž์œผ๋กœ ๋ช‡ ๋…„ ๋™์•ˆ ๋งค์šฐ ์ค‘์š”ํ•œ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@slorber ๊ทธ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ์‚ฌ๋žŒ๋“ค์€ ๊ด€๋ จ๋œ ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์— ๋Œ€ํ•ด ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•œ ์ฑ„ ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  Redux๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ Redux์™€ ๊ด€๋ จ๋œ ํŒจํ„ด์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๊ทธ๋“ค์ด Redux๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ์„ ํƒํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ(๋˜๋Š” ์ตœ์†Œํ•œ ๋” ๊ฐ„๋‹จํ•œ) ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ๋” ์–ด๋ ค์šด ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ์ ˆ์•ฝํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ผํ•˜๋Š” ๊ณณ์—์„œ ์šฐ๋ฆฌ๋Š” Redux๋ฅผ 1๋…„ ๋™์•ˆ ์‚ฌ์šฉํ–ˆ๊ณ , ์Šคํ† ์–ด์— ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ(์•ฝ๊ฐ„ ์ˆ˜์ •)ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋Š ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค. ์ด ์ค‘๋ณต๋œ ์ƒ์šฉ๊ตฌ๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ธฐ ์œ„ํ•ด Redux ์œ„์— ๋ ˆ์ด์–ด๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ œ ์ƒ๊ฐ์— ์ด ์•„์ด๋””์–ด๋Š” Redux ์‚ฌ์šฉ์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ react-redux ๋Š” Redux๋ฅผ React์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค).

๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ํ† ๋ก ์ž…๋‹ˆ๋‹ค. ์ดˆ์ฐฝ๊ธฐ๋ถ€ํ„ฐ redux ์‚ฌ์šฉ์ž๋กœ์„œ ๋‘ ์„ผํŠธ:

๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ฒ˜์Œ์—๋Š” redux๋ฅผ ์•ฑ์„ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ธฐ๋ณด๋‹ค ํ”„๋กœํ† ์ฝœ์ด๋‚˜ ํ•ฉ๋ฆฌ์ ์ธ ๊ทœ์น™์˜ ์ง‘ํ•ฉ์œผ๋กœ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์—„๊ฒฉํ•จ์€ redux๊ฐ€ ์ƒˆ๋กœ์šด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์••๋„์ ์ด๊ณ  ์ž์‹ ์˜ ์ถ”์ƒํ™”๋ฅผ ๋กค๋งํ•˜์ง€ ์•Š๊ณ  ํ™•์žฅํ•˜๋Š” ๋ฐ ์ง€๋ฃจํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ  ์ค‘ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 2015๋…„์— ์ƒํƒœ ๊ด€๋ฆฌ์˜ ํ˜ผ๋ž€์„ ๋šซ๊ณ  ๋‚˜์˜จ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๊ทธ๊ฒƒ์ด ์‹œ์ž‘๋œ ์ด์œ ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋‹ˆ๋ฉ€๋ฆฌ์ฆ˜ ๋•๋ถ„์— Apollo์™€ ๊ฐ™์€ ๋†€๋ผ์šด ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ(ํŠนํžˆ ๊ฐœ๋ฐœ ๋„๊ตฌ)์—์„œ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์„ ํŽธ์Šนํ•˜๊ณ  ์นœ์ˆ™ํ•œ ๋ฐฉ์‹์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•  ๋•Œ ์ƒํƒœ ๊ด€๋ฆฌ์—์„œ "๋‚ฎ์€ ์ˆ˜์ค€์œผ๋กœ ๋–จ์–ด๋œจ๋ฆฌ๊ธฐ".

"๋‚ฎ์€ ์ˆ˜์ค€" ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ redux๋Š” ํฐ ์„ฑ๊ณต์„ ๊ฑฐ๋’€๊ณ  ์•ฑ์„ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด ํ’๋ถ€ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์„œ๋Š” ์•„์ง ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์˜ํ•ด์•ผ ํ•  ํ•œ ๊ฐ€์ง€๋Š” redux๊ฐ€ ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ Apollo์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์˜ ์‚ฐ์—… ํ‘œ์ค€ "ํ”„๋กœํ† ์ฝœ"๋กœ์„œ์˜ ์—ญํ• ์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ํ˜„์žฌ redux๋Š” redux-core ์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ redux ์ž์ฒด๊ฐ€ ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ๋†’์—ฌ ๊ถŒ์žฅ๋˜๋Š” ์•ฑ ๋นŒ๋“œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  redux-core๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด redux (Apollo ๋˜๋Š” saga๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ)์— ๋Œ€ํ•œ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๋Œ€์•ˆ์ด ์–ผ๋งˆ๋“ ์ง€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค๋ช…๊ณผ ๊ฐ•์กฐ๋ฅผ ์œ„ํ•ด ๋‹ค์‹œ ์–ธ๊ธ‰:

์ด ์Šค๋ ˆ๋“œ์˜ ์ž‘์—… ์—๋Š” ๊ธฐ์กด Redux ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :) ๋ฌธ์„œ ์ˆ˜์ •์ด ์™„์ „ํžˆ ๊ฐ€๋Šฅํ•˜๊ณ  ์•ฝ๊ฐ„์˜ ์กฐ์ •์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ์กด redux ํŒจํ‚ค์ง€๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ฐฉ๊ธˆ ์„ค๋ช…ํ•œ redux-starter ํŒจํ‚ค์ง€ ๋˜๋Š” Dan์ด ์„ค๋ช…ํ•œ "ํ”„๋ ˆ์ž„์›Œํฌ" ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ๊ฐ™์€ ๊ฒƒ์€ redux ์— ์˜์กดํ•˜๋Š” ์ƒˆ ํŒจํ‚ค์ง€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@markerikson์ด ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์žˆ์œผ๋ฉด API, ์ฝ”๋“œ ์Šค๋‹ˆํŽซ ๋ฐ ๋ณด๋‹ค ์‹ฌ์ธต์ ์ธ ์•„์ด๋””์–ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Delux๋ฅผ ์Šคํƒ€ํ„ฐ(jk)๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@tannerlinsley ์˜ Jumpstate(ํ˜„์žฌ๋Š” ์œ ์ง€ ๊ด€๋ฆฌ ์ค‘ ํ•˜๋‚˜)๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๋กœ์„œ ์ €๋Š” ์ด ์ ์— ๋Œ€ํ•ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ Jumpstate๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” @gaearon ์˜ ์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ์— ๋งค์šฐ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์™„์ „ํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค(์˜๋„ํ•œ ์ ์ด ์—†์Œ). ์˜ค๋Š˜ ์•„์นจ์— ์ด๊ฒƒ ์™ธ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ์ƒ๊ฐํ•˜๋‹ค๊ฐ€ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๊ณ  ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๋ฏธ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์žฅํ™ฉํ•œ ๋งํˆฌ: ๋Œ€๋‹จํ•ด ๋ณด์ด๋„ค์š”. ์ œ๊ฐ€ ์ฐธ์—ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์–ผ๋งˆ๋งŒํผ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์„์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ(๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค) ๋‹น์‹ ์—๊ฒŒ๋Š” ํ™•์‹คํžˆ ์น˜์–ด๋ฆฌ๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” Jumpstate๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Redux๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฐ€๋ฅด์ณค์œผ๋ฉฐ ํ•™์Šต ๊ณก์„ ์„ ์ƒ๋‹นํžˆ ๋‹จ์ถ•ํ–ˆ๋‹ค๊ณ  ์ž์‹  ์žˆ๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HTTP์™€ ๊ฐ™์€ Redux์™€ fetch์™€ ๊ฐ™์€ Jumpstate๋ฅผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” Redux๋ฅผ ์‚ฌ๋ž‘ํ•˜๊ณ  Redux๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ (์šฐ์Šค๊ฝ์Šค๋Ÿฌ์šธ ์ •๋„๋กœ) ๋ณต์žกํ•œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ–ˆ์ง€๋งŒ, 90%์˜ ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒƒ์„ ๊ฐ€๋ฅด์น˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ๊ฒƒ๋„ ์••๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ๋•Œ ์ด๊ฒƒ์€ ์ข‹์€ ๊ณณ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ๋ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ํ•ต์‹ฌ ๋ถˆ๋งŒ ์ค‘ ํ•˜๋‚˜๋Š” "ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ถ€์กฑ"์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ์ƒˆ๋กœ์šด ๊ฒƒ (TM) ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์นจ๋‚ด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์••๋ ฅ์ด ๋†’์•„์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ์žˆ๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

Re: ํ•™์Šต ๊ณก์„ , ๋…์ฐฝ์„ฑ ๋ฐ ์ถ”์ƒํ™”:

Ajax๋Š” ์ฝํฌ(thunk), ์‚ฌ๊ฐ€(saga) ๋˜๋Š” ์„œ์‚ฌ์‹œ(Epics)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋Š” ์ƒˆ๋กœ์šด ํ•™์Šต์ž๊ฐ€ ๋ง‰ํžˆ๋Š” ์˜์—ญ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋‹ค์ง€ ์–ด๋ ค์›€์ด ์—†์–ด ๋ณด์ด๋Š” ์˜์—ญ ์ค‘ ํ•˜๋‚˜๋Š” ์•ก์…˜์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ก์…˜์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ก์…˜์€ ๊ทธ์ € ์˜ค๋ž˜๋œ Javascript ๊ฐ์ฒด์ผ ๋ฟ์ด๊ณ  Flux Standard Actions ์‚ฌ์–‘์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ช…ํ™•์„ฑ์„ ์ถ”๊ฐ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ๊ณ  ๋ฐฉ์‹์€ ๋‚˜๋ฅผ Flux Standard Ajax Action์„ ๊ฐœ๋ฐœํ•˜์ง€ ์•Š๋Š” ์ด์œ ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์œผ๋กœ ์ด๋Œ์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ

function fetchPosts(page) {
  return {
    type: 'FETCH_POSTS_REQUEST',
    // Ajax request setup
    ajax: {
      url: `/api/posts`,
      method: 'GET',
      data: { page },

      // Optional ajax meta attributes
      meta: {
        // Amount of time to debounce the execution of the request
        debounce: 400,
        // Amount of times to retry the request on failure
        retry: 2,
        // Amount of time before timing out
        timeout: 10000,  
        // The action type that cancels the request
        cancelType: 'CANCEL_FETCH_POSTS',
        // Strategy when multiple FETCH_POSTS_REQUESTs are in flight
        resolve: 'LATEST'
      }
    }
  };  
}

ajax ์ž‘์—…์€ ๋ฏธ๋“ค์›จ์–ด์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค(์ž‘์—…์˜ ajax ํ‚ค์— ๋ฐ˜์‘ํ•จ).

๋‚˜๋Š” ์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ์™œ ๋‚˜์œ ์ƒ๊ฐ์ผ์ง€ ์ด์œ ๋ฅผ ์ƒ๊ฐํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์ง€๋งŒ ์•„์ง ๊ฑฐ๋ž˜ ์ฐจ๋‹จ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.
๋‚ด ์ถ”์ •์— ๋ช‡ ๊ฐ€์ง€ ์ด์ :

  • ํ‰๊ท  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์–‘์ด ๊ธ‰๊ฒฉํžˆ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค(Ajax ๊ด€๋ จ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์—).
  • ์šฐ๋ฆฌ๋Š” ํ‰๋ฒ”ํ•œ ์˜ค๋ž˜๋œ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋งŒ์„ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ์„ ์–ธ์ ์ด๋ฉฐ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์„ ์ค‘๋‹จ ์—†์ด ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ด€์šฉ์  Redux์ž…๋‹ˆ๋‹ค(์ž‘์—… ๋กœ๊ทธ๋Š” ์—ฌ์ „ํžˆ ์˜๋ฏธ๊ฐ€ ์žˆ๊ณ  ์ง๋ ฌํ™” ๊ฐ€๋Šฅ ๋“ฑ).

์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด ๊ด€์‹ฌ ๋ถ„๋ฆฌ ์ฃผ์žฅ์„ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์„ ๋“ค์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” ์šฐ๋ฆฌ์˜ ajax ์š”์ฒญ ์ž‘์—…์ด ์ด๋ฏธ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ์ž‘์—…์— ๋Œ€ํ•œ ์ž์—ฐ์Šค๋Ÿฌ์šด ํ™•์žฅ์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ทธ๋“ค์€ 'FETCH_POSTS_REQUEST' ๋ผ๋Š” ๋งค์šฐ ๋ช…ํ™•ํ•œ ์ปจํ…์ŠคํŠธ๋กœ ์ž‘์—…์„ ์„ค์ •ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋„ˆ๋ฌด ์ ์–ด์„œ ajax ์š”์ฒญ ๊ตฌํ˜„์„ ์ถ”์ƒํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ˆ˜๋™์œผ๋กœ ajax ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

๋งˆ์Œ์— ์˜ค๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์€ ์ผ๋ถ€ ๋ฌธ์„œ์—์„œ ๋ณธ ๋น„๋™๊ธฐ ์ž‘์—… ์—ฐ๊ฒฐ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ์„ ์—ฐ๊ฒฐํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์—ฐ๊ฒฐ์ด ์–ผ๋งˆ๋‚˜ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด ์ง๊ฐ์€ ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํ† ๋ก ์—์„œ ์–ธ๊ธ‰๋œ 90% ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์†ํ•˜์ง€ ์•Š์Œ).

๊ฒฐ๋ก ์ ์œผ๋กœ - ์ด์™€ ๊ฐ™์€ ์ถ”์ƒํ™”๋Š” ์ผ๋ฐ˜์ ์ธ Redux ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํ•™์Šต ๊ณก์„ ๊ณผ ์ฝ”๋“œ์˜ ์–‘์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ๋ž˜ ์ฐจ๋‹จ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? @markerikson @gaearon

์„ ํ–‰ ๊ธฐ์ˆ : redux-axios-middleware

์ด ์Šค๋ ˆ๋“œ์—์„œ ๋งŽ์€ ์ผ๋“ค์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Redux ๋ณต์žก์„ฑ์— ๋Œ€ํ•œ ๋…ผ์˜์— ๋Œ€ํ•ด. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด Redux๊ฐ€ ๋ณต์žกํ•˜๊ณ  ์žฅํ™ฉํ•˜๋‹ค๋Š” ๋ถˆํ‰์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Flux ๋ฐ Elm ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ €์ˆ˜์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Redux ํ™ˆ ํŽ˜์ด์ง€ ์— ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜

Redux๋Š” ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ฐพ์Šต๋‹ˆ๋‹ค. ์šด์ด ์ข‹๊ฒŒ๋„ ํ•ต์‹ฌ ํŒ€์€ ๊ธฐ๋Šฅ์ด ์™„๋ฒฝํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ๋ณ€๊ฒฝํ•  ์˜์‚ฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ์œ„์— ๊ตฌ์ถ•๋œ ์ถ”์ƒํ™”๋Š” ํ›Œ๋ฅญํ•˜๊ณ  ๊ฐ๊ฐ ๊ณ ์œ ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•˜๊ณ  ์ž˜ ์„ค๊ณ„๋œ ์ €์ˆ˜์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” Redux ์ž์ฒด์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ๊ฒƒ์„ ํ•™์Šตํ•˜๋Š” ์ ์ง„์ ์ด๊ณ  ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์˜ ๋ถ€์กฑ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด React ์ž์ฒด์—๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  create-react-app ๊ฐ€ ํ•ด๊ฒฐ์ฑ…์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋ฉ‹์ง„ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: Dan์˜ egghead ์‹œ๋ฆฌ์ฆˆ ). ํ•™์Šต ๊ณก์„  ์—†์ด ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ์ด๊ฒƒ์€ ์ด ์Šค๋ ˆ๋“œ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@markerikson ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ด redux-starter ๊ฐœ๋ฐœ์— ๋„์›€์„ ๋“œ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

_์ €๋Š” ๋” ๋ฉ‹์ง„ ์ด๋ฆ„์„ ์›ํ•ฉ๋‹ˆ๋‹ค_ :stuck_out_tongue:

๋งŽ์€ ์ž‘์—…์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ƒ์šฉ๊ตฌ๋Š” ๊ฑฐ์˜ redux์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋‹จ์ ์ž…๋‹ˆ๋‹ค.

๋งค์šฐ ๋‚ฎ์€ ์ˆ˜์ค€์ด์ง€๋งŒ ํ›Œ๋ฅญํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ MobX๋ณด๋‹ค Redux ์Šคํƒ€์ผ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์„ ํ˜ธํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์ง€๋งŒ, ์˜ˆ๋ฅผ ๋“ค์–ด ์œ ์šฉ์„ฑ์„ ์ดํ•ดํ•˜๊ณ  MobX๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Redux๋ฅผ ์ดํ•ดํ•˜๊ฒŒ ๋œ ์ง€๊ธˆ์€ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ํ–‰๋ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Redux(๋˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Redux ํŒจํ„ด) ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋Š” ํŠนํžˆ "๋’ค์—์„œ" ์ง„ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ณณ๋งˆ๋‹ค ์ž‘์„ฑํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์‹œ๊ฐ„์„ ๋“ค์—ฌ ํ•™์Šตํ•œ ๊ฒฝ์šฐ ๋‚˜์ค‘์— ์ž์„ธํžˆ ์„ค๋ช…).

๋ฌธ์ œ๋Š” ์ œ๊ฐ€ Redux๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ ์ดํ•ดํ•˜๊ธฐ ํž˜๋“  ๋ถ€๋ถ„์ด ๋งŽ์•˜์ง€๋งŒ ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋ ค์šด ์ผ๋„ ๊ฐ„๋‹จํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— "์™€, ์ด ์ปจ์…‰์ด ๋„ˆ๋ฌด ๋…ผ๋ฆฌ์ ์ด๋‹ค! ๋‚ด๊ฐ€ ์ง์ ‘ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค!" ๊ทธ๋ž˜์„œ ๋‚ด ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Redux ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋‚˜๋งŒ์˜ ์ž‘์€ Redux ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด Redux์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Javascript ์ž์ฒด์— ๋Œ€ํ•œ ์ดํ•ด๋„ ๋งŽ์ด ๋†’์•„์กŒ์Šต๋‹ˆ๋‹ค! (์ด๊ฒƒ์€ ์ด์ „์— ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…์— ๋Œ€ํ•ด ๊ฑฐ์˜ ์•„๋ฌด๊ฒƒ๋„ ๋ชฐ๋ž๋˜ ์‚ฌ๋žŒ์˜ ๊ด€์ ์—์„œ ๋ณธ ๊ฒƒ์ด๋ฏ€๋กœ ๋งˆ์ผ๋ฆฌ์ง€๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) Redux์˜ ๊ฐœ๋…์€ ๋‹จ์ˆœํ•จ๊ณผ ๋™์‹œ์— ๋ฏฟ์„ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๊ฐ•๋ ฅํ•˜๋‹ค๋Š” ๋ฉด์—์„œ ์ •๋ง ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” Redux๊ฐ€ ๋งค์šฐ ์ธ๊ธฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— "์œ ํ–‰"์ด ์ƒˆ ์‚ฌ์šฉ์ž๊ฐ€ Javascript์—์„œ ์–ผ๋งˆ๋‚˜ ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ฃผ์˜๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋“ค์˜ ์‚ฌ๊ณ  ๋ฐฉ์‹์€ "์ข‹์•„์š”, React, Redux ๋“ฑ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ฉ‹์ง„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋˜์–ด ๋ฉ‹์ง„ ์•ฑ์„ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค!"๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ๋„๊ตฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ์ฑ„ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€์†ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜์ง์ด๋Š” ์ƒˆ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ฐ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋…์ด ์ดํ•ด๋˜๋ฉด Redux(๋˜๋Š” Redux์™€ ์œ ์‚ฌํ•œ ํŒจํ„ด)๊ฐ€ ๋ชจ๋“  ๋ฐฉ์‹์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. ๋‚˜๋Š” Angular์™€ ๊ฐ™์€ ๋‹ค๋ฅธ (์—ฌ์ „ํžˆ ํ›Œ๋ฅญํ•œ) ๋„๊ตฌ๋ณด๋‹ค React๋ฅผ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. _๊ทธ๋ƒฅ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค._ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ด๋ ‡๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!
์–ด๋–ค ํŒจ๋Ÿฌ๋‹ค์ž„์„ ํ†ตํ•ด ํ•„์š”ํ•œ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, Unlimiteddd powaaaaaa์— ๋Œ€ํ•ด ์ง€๋ถˆํ•˜๊ธฐ์—๋Š” ์ž‘์€ ๋Œ€๊ฐ€๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

IMO๋Š” ์ด ๋ชจ๋“  "์žฅํ™ฉํ•จ์€ ์ ˆ์ถฉ์•ˆ"์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ƒ์„ธ๋„ ์•„๋ฌด๊ฒƒ๋„์˜ ์„œ๋น„์Šค๊ฐ€ ์•„๋‹Œ, ๋‹น์‹ ์ด ์ „ํ˜€ ๋Œ์•„ ์˜ค๋Š”์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํฌ์ƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” Redux๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋น„๋‚œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ด๊ฒƒ์ด ๋ณธ์งˆ์ ์ธ ๋ณต์žก์„ฑ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ๋‹ค. Elm์€ Redux๊ฐ€ ๋‹ฌ์„ฑํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋” ์ ์€ ์ˆ˜์˜ ๋ผ์ธ๊ณผ ๋” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ธฐ๊ณ„์ ์œผ๋กœ ์ƒ์šฉ๊ตฌ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. Jumpstate ๋“ฑ์€ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์ง€๋งŒ ๋Ÿฐํƒ€์ž„์— ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์œผ๋ฉฐ typescript/flow๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด jumpstate๊ฐ€ ๋ณ„๋กœ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ codegen์€ ์–ด๋ ต๊ณ  ์ด๋ฏธ ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฐ ๋นŒ๋“œ ์‹œ์Šคํ…œ์— ํ•œ ๊ฐ€์ง€๋ฅผ ๋” ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์Šต๋‹ˆ๋‹ค.

๊ด€์šฉ์ ์ธ Redux๋กœ ๋ฒˆ์—ญ๋œ Elm ์ฝ”๋“œ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด... ์—ฌ์ „ํžˆ ์ œ ์‹ฌ์žฅ์„ ๋›ฐ๊ฒŒ ํ•˜์‹ญ์‹œ์˜ค.

๋‹ค์Œ์€ ๋‚ด ์•„์ด๋””์–ด ์ค‘ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์ด์ „ ์˜๊ฒฌ์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์•ก์…˜ ์ƒ์„ฑ์ž๋ฅผ ์•ก์…˜ ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ก์…˜.js

export function increase() {}

๊ฐ์†๊ธฐ.js

import { increase } from './actions.js';
export default handleActions({
    [increase]: (state) => state + 1
}, 0);

ํ•จ์ˆ˜์—๋Š” ๊ณ ์œ ํ•œ ์ฐธ์กฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ž‘์—…์˜ ์‹๋ณ„์ž๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. FSA์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์ง€๋งŒ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async function a() {

}
async function b() {
}
store.dispatch(a());
store.dispatch(b()); // b() will be dispatched after a() resolves

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ก์…˜ ์ƒ์„ฑ์ž๊ฐ€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฐจ๋ก€๋กœ ๋””์ŠคํŒจ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์ƒํ™ฉ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์‚ฌ๋žŒ๋“ค์€ ๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๋งŽ์€ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๊ฐœ๋…์€ Delux ์˜ Promise Factory์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

redux === ์ƒ์šฉ๊ตฌ

https://github.com/Emilios1995/redux-create-module

ํ•˜์ง€๋งŒ ์ด ๊ธฐ๋Šฅ์ด ๋‹น์‹ ์˜ ์ƒ๋ช…์„ ์™„์ „ํžˆ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์—์„œ ์ง„ํ–‰ ์ค‘์ธ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์•„์ด๋””์–ด ์„ธํŠธ๋ฅผ ๊ตฌ๋ณ„ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • "์ „์ฒด ์„œ๋น„์Šค" redux ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ
  • redux ์ฝ”์–ด์˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ

๋‚˜๋Š” redux ์ฝ”์–ด๊ฐ€ ๊ทธ ์ž์ฒด๋กœ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ํ•˜๋ ค๋Š”์ง€ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ redux ์ฝ”์–ด์—๋Š” ์ƒˆ๋กœ์šด "๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ"์— ๋Œ€ํ•œ ์—ฌ์ง€์™€ ์„ ๋ก€๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Redux๋Š” createStore , applyMiddleware , combineReducers , bindActionCreators , compose ์™€ ๊ฐ™์ด ์ƒ๋‹นํžˆ ์ž‘์€ API ๋…ธ์ถœ ์˜์—ญ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋“ค ๋Œ€๋ถ€๋ถ„์€ ํŽธ์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. Redux๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด createStore ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์™œ ์ด๋“ค ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ•ต์‹ฌ์— ์†ํ•ฉ๋‹ˆ๊นŒ?

  • applyMiddleware ๋Š” ์ธํ•ธ์„œ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ์ˆœํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ applyMiddleware ์ด ๋ฏธ๋“ค์›จ์–ด _interface_๋ฅผ redux ์Šคํ† ์–ด์— ํšจ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ‘œ์ค€ ๋ฐฉ์‹์œผ๋กœ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฏธ๋“ค์›จ์–ด ์ƒํƒœ๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” applyMiddleware ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋น„๊ต์  ๋‹จ์ˆœํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  • combineReducers ๋Š” ํŽธ๋ฆฌํ•œ ๊ฐ์†๊ธฐ ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์†๊ธฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ์ง€๋งŒ ํ™•์‹คํžˆ ๋” ์œ ์šฉํ•œ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ redux ์ฝ”์–ด์— ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ _์œ ๋น„์ฟผํ„ฐ์Šค_ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งŒ๋‚œ ๋ชจ๋“  ์ค‘์š”ํ•˜์ง€ ์•Š์€ Redux ์•ฑ์€ combineReducers ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฃจํŠธ ๊ฐ์†๊ธฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ์ด๋ฉด์€ combineReducers ๊ฐ€ Redux์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ์œ ์ผํ•œ ํ˜•ํƒœ์˜ ๊ฐ์†๊ธฐ ๊ตฌ์„ฑ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ๊ฒƒ์ด ์กด์žฌํ•˜๋Š” ์œ ์ผํ•œ ํ˜•ํƒœ์˜ ๊ฐ์†๊ธฐ ๊ตฌ์„ฑ์ด๋ผ๊ณ  ๋ฏฟ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • bindActionCreators ๋Š” ๋””์ŠคํŒจ์น˜ ์ž‘์—…๊ณผ ๊ด€๋ จ๋œ ์ผ๋ถ€ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜๋Œ€๋กœ bindActionCreators ๋Š” ๋˜ํ•œ ์ƒ์šฉ๊ตฌ์— ๋Œ€ํ•œ Redux์˜ ํ‰ํŒ์— ๊ฐ„์ ‘์ ์ธ ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค. bindActionCreators ์กด์žฌ๋งŒ์œผ๋กœ๋„ ์•ก์…˜ ํฌ๋ฆฌ์—์ดํ„ฐ์˜ ํ™œ์šฉ์„ ๋…๋ คํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๊ฒƒ์€ ์•ก์…˜ ์ƒ์„ฑ์ž( bindActionCreators "๋ณด์ฆ")์™€ ์„ ํƒ์ž(๋ฌธ์„œํ™”๋˜์—ˆ์ง€๋งŒ ๋™๋“ฑํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด ์—†์Œ)์˜ ๋ณด๊ธ‰๋ฅ ์„ ๋น„๊ตํ•  ๋•Œ ํŠนํžˆ ๋‘๋“œ๋Ÿฌ์ง‘๋‹ˆ๋‹ค. mapStateToProps ๋Š” ํ•ญ์ƒ "๋งž์ถคํ˜•" ์„ ํƒ๊ธฐ์ด์ง€๋งŒ mapDispatchToProps ๋Š” ํ•ญ์ƒ ๋ฏธ๋ฆฌ ์ž‘์„ฑ๋œ ์ž‘์—… ์ž‘์„ฑ์ž์˜ ๊ฐœ์ฒด ๋งต์ธ react-redux ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ด๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ Redux์˜ ๊ธฐ๋Šฅ์— ํ•„์ˆ˜์ ์ธ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋ชจ๋‘ ์‚ฌ์šฉ์„ฑ์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ Redux์˜ ๊ณ ์œ ํ•œ ์œ ์—ฐ์„ฑ์„ ์ œํ•œํ•˜์ง€ ์•Š์ง€๋งŒ ๊ณตํ†ต ํŒจํ„ด์„ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋กœ ๊ตฌ์ฒดํ™”ํ•˜์—ฌ ์„ ํƒ์„ ๋œ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๊ฐ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋Š” ์ถ”๊ฐ€ ์งˆ๋ฌธ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์Šคํ† ์–ด ์ธํ•ธ์„œ์˜ ๋‹จ์ˆœํ™”๋ผ๋ฉด ๋„๋ฆฌ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋‹จ์ˆœํ™”๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ๋‹จ์ˆœํžˆ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋Œ€์‹  ์–ด๋–ค ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ๊ฐ์†๊ธฐ ๊ตฌ์„ฑ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์†๊ธฐ ๊ฐœ์ฒด ? ์ข…์† ๊ฐ์†๊ธฐ ? ์„ ํ˜• ๊ตฌ์„ฑ ?
  • reselect๋ฅผ ํ†ตํ•ฉํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด ์ด์ „์— ์—†์—ˆ๋˜ ์„ ํƒ๊ธฐ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ตฌ์„ฑํ•˜๊ฒŒ ๋ ๊นŒ์š”? ์ด๊ฒƒ์ด ์ˆœ ๊ธ์ •์ ์ž…๋‹ˆ๊นŒ?

์ด ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์ด ๋ถ€์ •์ ์ผ์ง€๋ผ๋„, ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋“ค์˜ ์ „์ œ๋ฅผ ๊ณ ๋ ค์กฐ์ฐจ ํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ์šฐ๋ฆฌ ์ž์‹ ๊ณผ ์ง€์—ญ ์‚ฌํšŒ์— ํ•ด๊ฐ€ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@modernserf : ๋จผ์ € Redux์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ๊ณผ ์ตœ๊ทผ ์ƒ๊ฐ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๋ชจ๋‘ _๋งค์šฐ_ ๊ฐ€์น˜ ์žˆ๊ณ  ์œ ์ตํ•˜๋ฉฐ, ์•„๋งˆ๋„ ์ด ์Šค๋ ˆ๋“œ์˜ ๋‹ค๋ฅธ ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ํ•„๋…์„œ์—ฌ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์— ๋งํฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ๋œ ์—ญ์‚ฌ ๋•Œ๋ฌธ์— ๋‹น์‹ ์ด ๊ทธ๊ฒƒ๋“ค์„ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋งค์šฐ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค(์ €๋Š” Redux์˜ Tao, Part 1 - Implementation and Intent . ํŠนํžˆ redux-thunk ๋‚ด ๊ฒŒ์‹œ๋ฌผ์„ ์œ„ํ•ด ์กฐ์‚ฌํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. react-redux ๋„ ๋‚˜์ค‘์— ๋ถ„๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค .

์ด๋Ÿฌํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ์‹ค์ œ๋กœ ํŠน์ • ์‚ฌ์šฉ ํŒจํ„ด์„ ์ฝ”๋“œํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด๋Ÿฌํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ์Šฌ๋ผ์ด์Šค ๊ฐ์†Œ๊ธฐ์˜ ๊ตฌ์„ฑ, ๋น„๋™๊ธฐ ๋™์ž‘ ๋ฐ ๊ธฐํƒ€ ์ค‘์•™ ์ง‘์ค‘์‹ ๋™์ž‘์„ ์œ„ํ•œ ๋ฏธ๋“ค์›จ์–ด ํŒŒ์ดํ”„๋ผ์ธ, ๊ตฌ์„ฑ ์š”์†Œ(ํŠนํžˆ ์ฃผ๋ณ€์— ํ•จ์ˆ˜ ์ „๋‹ฌ ์ž์‹ ๊ตฌ์„ฑ ์š”์†Œ์—). ๋‹ค์†Œ ์œ ์‚ฌํ•˜๊ฒŒ, Reselect๊ฐ€ ํ•ต์‹ฌ์€ ์•„๋‹ˆ์ง€๋งŒ Dan์€ ๋ช…์‹œ์ ์œผ๋กœ ์ƒ์„ฑ์„ ๊ถŒ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค .

์˜ˆ, ๋ˆ„๊ตฌ๋‚˜ "ํ•  ์ˆ˜" ์žˆ์—ˆ์ง€๋งŒ ์ด๋ฅผ ๊ตฌ์ถ•ํ•จ์œผ๋กœ์จ ์‚ฌ๋žŒ๋“ค์ด ํŠน์ • ๋„๊ตฌ๋ฅผ ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ํ™•์‹คํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ์„ธ ๊ฐ€์ง€ ์งˆ๋ฌธ์— ๋Œ€ํ•ด:

  • ๋‹น์‹ ์€ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ "์Šคํ† ์–ด ์ธํ•ธ์„œ์˜ ๋‹จ์ˆœํ™”"๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋น„๋ก ๊ทธ๊ฒƒ์ด ์ •๋‹นํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋Š” ์•Š์ง€๋งŒ์š”. ์˜คํžˆ๋ ค, ๊ทธ๊ฒƒ์€ ๋งค์šฐ ํŠน๋ณ„ํ•œ ๋ชฉ์ ์„ ์œ„ํ•œ ์ƒ์  ๊ฐ•ํ™”์ œ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šคํ† ์–ด ์ธํ•ธ์„œ ๊ด€๋ จ ์ž‘์—…: Dan์€ ๊ทธ๊ฐ€ ์—ฌ์ „ํžˆ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์€ Redux ์ฝ”์–ด์˜ ์ฃผ์š” ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜๋Š” ์ธํ•ธ์„œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋Š” ๋ฐฉ์‹๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋งค์šฐ ์˜ค๋žซ๋™์•ˆ ์—ด๋ ค ์žˆ๋Š” ์Šคํ† ์–ด ์ธํ•ธ์„œ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด "๊ฒฝ์Ÿํ•˜๋Š”" PR์ด ๋‘ ๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค. @acdlite ์˜ ๋ฒ„์ „์€ #1706์ด๊ณ  @jimbolla ์˜ ๋ฒ„์ „์€ #2214์ž…๋‹ˆ๋‹ค. Jim์ด ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ถ„์„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋„๋ก ์•Œ๋ ค์ง„ ๋ชจ๋“  ์Šคํ† ์–ด ์ธํ•ธ์„œ ๋ชฉ๋ก์„ ์ž‘์„ฑ ํ–ˆ๋‹ค๋Š” ์ ๋„ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Jim์˜ ์ œ์•ˆ์ด ์ธํ•ธ์„œ ์ž‘์„ฑ์ž๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ–‰๋™์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋•๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž„์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋” ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉํ–ฅ์ด๋‹ค.
  • ๊ฐ์†๊ธฐ ๊ตฌ์„ฑ ๋ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ํŒจํ„ด์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. "์˜์กด์ " ๋ฆฌ๋“€์„œ๋งŒํผ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํ‹ˆ์ƒˆ ์‚ฌ์šฉ ์‚ฌ๋ก€์ด๊ณ  ์•ฑ์— ํŠน์ •ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ด€๋ จ ์ฐธ๊ณ ๋กœ, Dan์€ ์˜ค๋žซ๋™์•ˆ combineReducers ์ผ์ข…์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์ž๋Š” PR์„ ๋‹ซ์•˜์ง€๋งŒ(๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ค‘ _๋งŽ์€_์ด ์žˆ์Œ) ๋งˆ์นจ๋‚ด #1768์ด ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™์•ˆ. ๊ทธ PR๋„ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์„ ํƒ๊ธฐ์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ƒํƒœ ๋น„ํŠธ๋ฅผ ์ง์ ‘ ์ถ”์ถœํ•˜์—ฌ ๋ช…๋ช…๋œ ์†Œํ’ˆ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ mapState ๋Œ€ํ•œ ๊ฐ์ฒด ์†๊ธฐ ๊ตฌ๋ฌธ ์„ createStructuredSelector ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ ๋งŽ์€ ์š”์ฒญ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

"Redux์˜ Tao" ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋ฌธ์„œํ™”ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ช…์‹œ๋œ ๋ชฉํ‘œ๋Š” Redux ํ•ต์‹ฌ API๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ์ตœ์†Œํ™” ํ•˜๊ณ  ๊ทธ ์œ„์— ์ƒํƒœ๊ณ„๋ฅผ ์žฅ๋ คํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค . ๋˜ํ•œ, Redux ๊ฐœ๋ฐœ ์ดˆ๊ธฐ์— Andrew ๋Š” ํŠน์ • ํ”Œ๋Ÿฌ๊ทธ์ธ์„ "์ถ•๋ณต"ํ•˜๋ ค๋Š” ์˜๋„์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค .

gaearon์ด ํ•œ ๋ฒˆ ๋งํ–ˆ๋“ฏ์ด(์–ด๋””๊ฐ€... ์•„๋งˆ๋„ Slack์ธ์ง€ ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค) ์šฐ๋ฆฌ๋Š” Flux ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ Koa์ฒ˜๋Ÿผ ๋˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋” ์„ฑ์ˆ™ํ•ด์ง€๋ฉด reduxjs GitHub ์กฐ์ง์—์„œ "์ถ•๋ณต๋ฐ›์€" ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ ํ™•์žฅ ๋ชจ์Œ์„ ์œ ์ง€ ๊ด€๋ฆฌํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

์ด์ „์— up-thread์—์„œ ๋‚˜๋Š” ์ผ์ข…์˜ "์‰ฌ์šด Redux ์„ค์ •" ์ถ”์ƒํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒƒ ๋˜๋Š” ์ ์–ด๋„ "์ถ•๋ณต๋ฐ›์€" ์• ๋“œ์˜จ ๋ชฉ๋ก์ด ๋‹น์‹ ์ด ์ƒ๊ฐํ•˜๋Š” ๋ผ์ธ์— ๋”ฐ๋ผ ์ถฉ๋ถ„ํ• ๊นŒ์š”? (์‹ค์ œ๋กœ ์ด ์Šค๋ ˆ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ๋Œ“๊ธ€์—์„œ๋„ ๊ทธ๋ ‡๊ฒŒ ํ•˜์…จ์Šต๋‹ˆ๋‹ค.) ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์ถ”๊ฐ€ ์ œ์•ˆ์ด๋‚˜ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฒฐ๊ตญ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋” ์„ฑ์ˆ™ํ•ด์ง€๋ฉด reduxjs GitHub ์กฐ์ง์—์„œ "์ถ•๋ณต๋ฐ›์€" ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ ํ™•์žฅ ๋ชจ์Œ์„ ์œ ์ง€ ๊ด€๋ฆฌํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ํ•  ์ผ์ด์ง€๋งŒ ์•„๋งˆ๋„ ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ redux ํŒจํ‚ค์ง€๊ฐ€ @redux/core ์™€ ๊ฐ™์€ ๊ฒƒ์ด ๋˜๋Š” ๋‹จ์ผ ์ €์žฅ์†Œ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์žฌ๊ตฌ์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. reselect ๋ฐ redux-action๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” repo ๋ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๊ฐ€์ ธ์˜ค๊ณ  redux ํŒจํ‚ค์ง€ ์ž์ฒด๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ๋‹จ์ผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๋‹ค์‹œ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

_sort of_๋Š” redux ์ฝ”์–ด๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ™•์žฅ ๋ฒ„์ „์€ ์ฝ”์–ด์˜ ์—„๊ฒฉํ•œ ์ƒ์œ„ ์ง‘ํ•ฉ์ด๋ฏ€๋กœ ํ•˜์œ„ ํ˜ธํ™˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ ์ˆœ์ „ํžˆ ์˜ตํŠธ์ธ์ด๋ฉฐ ๋น„๊ณต๊ฐœ ์ƒํƒœ์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. "ํŒฝ์ฐฝ"์— ๊ด€ํ•œ ํ•œ -- ์ด๋Ÿฌํ•œ ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ฒ˜์Œ์—๋Š” ์ž‘์œผ๋ฉฐ ํŠธ๋ฆฌ๋ฅผ ํ”๋“œ๋Š” ๊ฒƒ์ด ์‰ฝ์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ MapState์— ๋Œ€ํ•œ ๊ฐ์ฒด ๋‹จ์ถ• ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด React-Redux์— ๋Œ€ํ•œ ๊ณต๊ฐœ PR์ด ์žˆ์œผ๋ฉฐ Reselect์˜ createStructuredSelector ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ ๋งŽ์€ ์š”์ฒญ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹น์‹ ์—๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์ œ์•ˆํ•˜๋Š” monorepo ๊ตฌ์กฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Lodash์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ž -- Lodash๋Š” ๋ณธ๋ณด๊ธฐ๋กœ ์‚ผ๊ธฐ์— ํฅ๋ฏธ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์—„์ฒญ๋‚œ ํ•จ์ˆ˜ ๋ชจ์Œ์ด ์žˆ์œผ๋ฉฐ, ๊ทธ ์ค‘ ๋งŽ์€ ๋ถ€๋ถ„์ด ์Šค์Šค๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. lodash์˜ ๊ฑฐ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์€ "๋ ˆ์‹œํ”ผ"๋กœ ๋” ์œ ์—ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. groupBy ๋Š” ๊ฒฐ๊ตญ _ํŒจํ„ด_์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์€ ๋ˆ„๊ตฌ์ž…๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  lodash ํ•จ์ˆ˜๋Š” ์ž์ฒด _a la carte_ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. import { groupBy } from "lodash" ๋ณด๋‹ค import groupBy from "group-by" import { groupBy } from "lodash" ์— ๋Œ€ํ•œ _๊ธฐ๋Šฅ์ _ ์ด์ ์€ ์—†์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์™œ ๋‚˜๋ฌด ๋–จ๋ฆผ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋‚˜ Lodash๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝํ—˜์€ ๋ ˆ์‹œํ”ผ๋‚˜ ๋‚˜๋…ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ฐฐ์—ด๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ณ  ์žˆ๊ณ  ์ž์‹ ์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ ๋‹ค๋ฉด ์•„๋งˆ๋„ Lodash ํ•จ์ˆ˜๊ฐ€ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ ˆ์‹œํ”ผ๋ฅผ ์ฐพ์„ ํ•„์š”๋„ ์—†๊ณ , ์•„๋ฌด๊ฒƒ๋„ ์„ค์น˜ํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์— ๋‹ค๋ฅธ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ผ์ธ์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๋„ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„์ฃผ ์ž‘์€ ๋งˆ์ฐฐ๋„ ์ œ๊ฑฐํ•˜์ง€๋งŒ ์šฐ๋ฆฌ์˜ ํ•˜๋ฃจ๋Š” ์ด๋Ÿฐ ์ˆœ๊ฐ„๋“ค๋กœ ๊ฐ€๋“ ์ฐจ์„œ ์Œ“์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ด€์ ์—์„œ ๋‚ด ์ž์‹ ์˜ 2์„ผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

CQRS , ์ด๋ฒคํŠธ ์†Œ์‹ฑ , ๊ทธ๋ฆฌ๊ณ  ๊ถ๊ทน์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๋„๋ฉ”์ธ ์ฃผ๋„ ๋””์ž์ธ ํ•™๊ต๋Š” ์šฐ๋ฆฌ์—๊ฒŒ Flux ์™€ Redux ๋ฅผ ๋‚ณ์€ ์œ„๋Œ€ํ•œ ์กฐ์ƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ํ–ฅ์ด ๊ฐ€๋” ์ธ์šฉ ๋˜์ง€๋งŒ Redux ์™€ ๊ทธ ํ›„์† ๋„๊ตฌ๋Š” ๋Œ€๋ถ€๋ถ„์˜ API ์šฉ์–ด๋ฅผ ๋‹น์‹œ ์œ ํ–‰ํ–ˆ๋˜ Flux ๋ฐ Flux ๊ตฌํ˜„์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ดœ์ฐฎ์ง€๋งŒ ๊ธฐ์กด ๋…ธ์ถœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ์•„์ด๋””์–ด์— ๋Œ€ํ•ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ์—ˆ๋˜ ์ˆ˜์ต์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ๋†“์น˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฐจ์ด์ ์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณธ ๋Œ€๋ถ€๋ถ„์˜ ์ด๋ฒคํŠธ ์†Œ์‹ฑ ํ† ๋ก ์—์„œ Redux Actions ๋Š” Events ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Redux ActionCreators ๋Š” Commands ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ์šฉ์–ด์™€ ํ•จ๊ป˜ ๋ฌด๋ฃŒ๋กœ ์ œ๊ณต๋˜๋Š” ์ถ”๊ฐ€ ๋ช…ํ™•์„ฑ๊ณผ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋Š” ๊ธฐ๋ก ๊ฐ€๋Šฅํ•˜๊ณ  ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ์‚ฌ๊ฑด ์€ ๊ณผ๊ฑฐ ์‹œ์ œ์—์„œ ์ผ์–ด๋‚œ ์ผ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฅผ ์žฌ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋Š” ๋…น์Œ์„ ์ทจ์†Œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ช…๋ น ์—๋Š” ๋ช…๋ น์ ์ธ ๋ถ„์œ„๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์€ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์œผ๋กœ์„œ Event Sourcing ์ด ํ–ฅํ›„ 10๋…„ ๋™์•ˆ ์ธ๊ธฐ๋ฅผ ์–ป์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ, Redux ๋Š” API ๋ฐ ํ† ๋ก ์„ ๋” ๋„“์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๋” ๋ฐ€์ ‘ํ•˜๊ฒŒ ์กฐ์ •ํ•จ์œผ๋กœ์จ ์•ฝ๊ฐ„์˜ ์œ ์šฉ์„ฑ, ๋ช…ํ™•์„ฑ ๋ฐ ์‚ฌ์šฉ ์šฉ์ด์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ํ† ๋ก ์ด ์ด๋ฏธ ์ฃฝ๋„๋ก ๋‘๋“ค๊ฒจ ๋งž์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค: https://github.com/reactjs/redux/issues/351

์•— ๋ชฐ๋ž๋„ค์š” ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! :+1:

๋‹น์‹œ์— ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ์น˜๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— #351์ด ํ์‡„๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ API ๊ฒฐ์ •๊ณผ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด๋ฅผ ์žฌ๊ณ ํ•˜๋Š” ์‹œ์ ์— ์žˆ๋‹ค๋ฉด ์ง€๊ธˆ์ด ์•„์ด๋””์–ด๋ฅผ ๋‹ค์‹œ ํ‘œ๋ฉดํ™”ํ•˜๊ธฐ์— ์ ์ ˆํ•œ ์‹œ๊ธฐ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Event Sourcing ๊ด€์šฉ๊ตฌ์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ API๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๋Œ€ํ•œ ์ œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

๊ฐœ๋…

  • ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ
  • Event Stream์—๋Š” ์ง€์›๋˜๋Š” ์ด๋ฒคํŠธ์˜ ์œ ํ˜•์ด ์ž˜ ์ง€์ •๋œ ์„ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์— ๋ช…๋ น ๋””์ŠคํŒจ์น˜
  • ํ•˜๋‚˜ ์ด์ƒ์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

API

import { createEventStream, createProjection } from 'redux';

// Initialize the event stream separately from the store.  This becomes the one
// true source of truth for your application.
const eventStream = createEventStream({
  // Commands are the only thing that we want to couple to the eventStream.  The 
  // set of events which may end up in an eventStream should be easy to predict.
  //
  // A definition like this supports static analysis inference well for 
  // consumers that can leverage it.
  increment: () => ({ type: 'INCREMENT' }),
  decrement: () => ({ type: 'DECREMENT' }),
});

// Multiple stores with disjoint or overlapping data can be used to consume the 
// same event stream.
const store = createProjection(eventStream, reducer, init);
const adminStore = createProjection(eventStream, adminReducer, init);

// We don't need a jargon term ("Middleware"), or a dedicated hook to handle 
// async anymore.  We just register more subscribers to the eventStream.
eventStream.subscribe(myCustomMiddleWare);
eventStream.subscribe(sendEventsToAnalytics);
eventStream.subscribe(logEventsForPlayback);

// Calls to commands can be wrapped with React Providers or container components 
// in the same way that Redux currently does.  They can also be called directly.
eventStream.increment();

@ajhyndman : ๋‚˜๋Š” ์ œ์•ˆ๊ณผ ํ† ๋ก ์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ, ๊ทธ ์ž์ „๊ฑฐ ๋ณด๊ด€์†Œ๋Š” ์™„์ „ํžˆ ์น ํ•ด์ ธ ์žˆ๊ณ  ๋ง์ด ํ—›๊ฐ„์„ ๋– ๋‚ฌ์Šต๋‹ˆ๋‹ค(์€์œ ๋ฅผ ์™„์ „ํžˆ ํ˜ผํ•ฉํ•˜๊ธฐ ์œ„ํ•ด). Dan์€ CQRS/ES ์šฉ์–ด๊ฐ€ ์•„๋‹Œ Flux ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์œผ๋ฉฐ ํ•ต์‹ฌ API ๋˜๋Š” Redux ๊ฐœ๋…์— ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด๋ฅผ ๋ณ€๊ฒฝํ•  ๊ณ„ํš์€ ์—†์Šต๋‹ˆ๋‹ค.

(๋˜ํ•œ, ์ด๋ฅผ ์ž…์ฆํ•  ํ†ต๊ณ„๋Š” ์—†์ง€๋งŒ ์ ์–ด๋„ JS ์ปค๋ฎค๋‹ˆํ‹ฐ ๋‚ด์—์„œ๋Š” CQRS/ES ์šฉ์–ด๋ณด๋‹ค Redux์˜ "์•ก์…˜" ๋ฐ "์•ก์…˜ ์ž‘์„ฑ์ž" ์‚ฌ์šฉ์— ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ๋“ค์ด ๋” ๋งŽ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. )

๋‚˜๋Š” ํ™•์‹คํžˆ ์ด ๋Œ€ํ™”๊ฐ€ ์ „์— ์žˆ์—ˆ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜๊ณ , ๊ทธ๊ฒƒ์„ ๋‹ค์‹œ ์—ด์ง€ ์•Š์œผ๋ ค๋Š” ๊ฐ•ํ•œ ์—ด๋ง์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„ ์—ฌ๊ธฐ์„œ ๋„ˆ๋ฌด ์„ธ๊ฒŒ ๋ˆ„๋ฅด์ง€๋Š” ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. (๋” ๋‚˜์€ ์ ‘์ ์ด ์žˆ๋‹ค๋ฉด ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ด ๋Œ€ํ™”๋ฅผ ์ฝ๊ฑฐ๋‚˜ ๊ณ„์†ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.)

๋ฌผ๋ก , ํ™•๊ณ ํ•œ ์š”์†Œ๊ฐ€ ์žˆ๊ณ  ์ „์ฒด API ํ‘œ๋ฉด๊ณผ ์šฉ์–ด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ํ˜„ ์‹œ์ ์—์„œ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค๋Š” ๊ฒƒ๋„ ๋งž์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ Event Sourcing ๊ณผ Redux ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์„œ๋กœ์—๊ฒŒ์„œ ๋ฐฐ์šธ ๊ธฐํšŒ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ํ•™์Šต ๋ฐ ์‚ฌ์šฉ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ Redux๋ฅผ ์ˆจ๊ธฐ์ง€ ์•Š๊ณ (๊ทธ๋ฆฌ๊ณ  "๊ธฐ๋ณธ" Redux๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜/ํ•™์Šต ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š”) ๊ฐ€๋Šฅํ•œ ์ถ”์ƒํ™”๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์šฉ์–ด๋ฅผ ์ฐจ์šฉํ•˜๊ฑฐ๋‚˜ API๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ์šฐ๋ฆฌ๊ฐ€ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์Šน๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ €์žฅ์†Œ๋ฅผ "currentState๊ฐ€ ์ถ”๊ฐ€ ์ „์šฉ ๋ชฉ๋ก(๋˜๋Š” ์ŠคํŠธ๋ฆผ)์˜ "์ˆœ์ˆ˜ํ•œ ๊ธฐ๋Šฅ"(์ด๊ฒƒ์€ ํŒŒ์ƒ๋˜๊ฑฐ๋‚˜ ์ถ•์†Œ ๋œ)์ธ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ๋กœ ์„ค๋ช…ํ•˜์—ฌ ์‚ฌ๋žŒ๋“ค์„ Redux ์— ์†Œ๊ฐœํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ํ–‰๋™".

๋ฏธ๋ž˜๋ฅผ ๋‚ด๋‹ค๋ณด๋ฉด redux์™€ ๊ฐ™์€ ์„œ๋ฒ„ ์ธํ”„๋ผ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์ถ”์ƒํ™”ํ•˜๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค( Apache Samza ๋ฐ LinkedIn ์—”์ง€๋‹ˆ์–ด๋ง ํŒ€์˜ ๋‹ค๋ฅธ ์ž‘์—… ์ฐธ์กฐ). ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์—ด๋งํ•œ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์œ ์‚ฌํ•œ ์ถ”์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์™œ ๋™ํ˜•์˜ ์˜๊ตฌ Redux ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹Œ๊ฐ€?

JavaScript์™€ ์ธํ”„๋ผ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ•จ๊ป˜ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ์‰ฝ๊ฒŒ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฐœ๋…์€ ์ด๋Ÿฌํ•œ ๊ธฐํšŒ๊ฐ€ ๋” ๋นจ๋ฆฌ ๋ช…ํ™•ํ•ด์ง€๊ณ  ์ถ”์ƒํ™”๊ฐ€ ๋” ๋งŽ์ด ํ‘œํ˜„๋  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ด๋Ÿฌํ•œ ์•„์ด๋””์–ด ์ค‘ ์ผ๋ถ€์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ํฅ๋ถ„ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”! ๋คํ”„๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์šฉ์„œํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์œ„์—์„œ ์ œ์•ˆํ•œ ํ‘œ๋ฉด์„ ๊ตฌํ˜„ํ•˜๋Š” ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ๊ณผ ๊ฐ™์€ Redux์šฉ ๋ž˜ํผ API๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

https://github.com/ajhyndman/redux-event-stream

@ajhyndman ๋‚˜๋Š” ๋ž˜ํผ๊ฐ€ ๋‹น์‹ ์˜ ์•„์ด๋””์–ด์™€ ํ•จ๊ป˜ ๊ฐ€๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘

๋‹น์‹ ์ด ์–ธ๊ธ‰ํ•œ samza ๋ฐ ๋งํฌ๋“œ์ธ ์—”์ง€๋‹ˆ์–ด๋ง ์ž‘์—…๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋ฉ‹์ง„ ๊ฐ•์—ฐ์„ ์ฝ์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์‹œ์ฒญํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด Apache Samza ๋กœ

๊ทธ ๋น„๋””์˜ค๋Š” ๊ต‰์žฅํ•˜๋‹ค! redux repo์˜ README์— ์žˆ๋Š” ๊ฐ์‚ฌ ๋ชฉ๋ก์˜ ๋‘ ๋ฒˆ์งธ ํ•ญ๋ชฉ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…• ๋ชจ๋‘๋“ค!

์ด ์Šค๋ ˆ๋“œ์˜ ์กด์žฌ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ ์ฑ„ ๋‚˜๋Š” @markerikson ์˜ ์›๋ž˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ๋‹ต๋ณ€์ด๊ณ  @gaearon ์˜ ๋ชฉ๋ก ์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์€ Kea์ž…๋‹ˆ๋‹ค .

screen shot 2017-08-06 at 13 10 03

redux, redux-saga ๋ฐ reselect์— ๋Œ€ํ•œ ์ถ”์ƒํ™”์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•˜๋Š” ์ ‘์ฐฉ์ œ๋ฅผ ์ œ์™ธํ•˜๊ณ  Kea๋Š” ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์ƒ์„ฑํ•˜๋Š” ์ฒ™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•„์š”์— ๋”ฐ๋ผ ์›์‹œ redux ์•ก์…˜ ์ƒ์„ฑ๊ธฐ ๋ฐ ๊ฐ์†๊ธฐ, ์›์‹œ redux-saga ์‚ฌ๊ฐ€ ๋ฐ ์›์‹œ ์žฌ์„ ํƒ ์„ ํƒ๊ธฐ๋ฅผ ๋…ธ์ถœ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ๋ฐœ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Kea๋Š” ๋‹ค์–‘ํ•œ ์ž‘๋™ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋…๋ฆฝ ์‹คํ–‰ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , React ๊ตฌ์„ฑ ์š”์†Œ์— ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜, React ๊ตฌ์„ฑ ์š”์†Œ ์œ„์— ์ธ๋ผ์ธ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ์„ ํƒ๊ธฐ์— ๋Œ€ํ•œ ์ž…๋ ฅ์ด React ๊ตฌ์„ฑ ์š”์†Œ์˜ props์— ์˜์กดํ•˜๋Š” React ๊ตฌ์„ฑ ์š”์†Œ์— ๋™์ ์œผ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ ํฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜ ๋Š” ๊ฐœ์ธ ๋ ˆ์Šจ์šฉ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค ์ด๊ณ  ํ•˜๋‚˜๋Š” ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ์ฐจ๋Ÿ‰ ์ถ”์  ์†Œํ”„ํŠธ์›จ์–ด์ž…๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋‚˜๋Š” ๊ทธ๊ฒƒ์œผ๋กœ ์ž์‹ ์˜ ์•ฑ์„ ๋งŒ๋“  ์‚ฌ๋žŒ๋“ค์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋งค์šฐ ์œ ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์„ ์ •๋ฆฌํ•˜๊ณ  ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.

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

์–ด์จŒ๋“  ์ถฉ๋ถ„ํ•œ ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ "์ธ๋ผ์ธ ์ผ€์•„(inline kea)"๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์˜ ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋กœ์ง์ด ์ปดํฌ๋„ŒํŠธ์— ์ง์ ‘ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ๋Š” ๋ง‰ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ React์˜ setState ์žˆ์Šต๋‹ˆ๋‹ค.

import React, { Component } from 'react'
import PropTypes from 'prop-types'
import { kea } from 'kea'

@kea({
  actions: () => ({
    increment: (amount) => ({ amount }),
    decrement: (amount) => ({ amount })
  }),

  reducers: ({ actions }) => ({
    counter: [0, PropTypes.number, {
      [actions.increment]: (state, payload) => state + payload.amount,
      [actions.decrement]: (state, payload) => state - payload.amount
    }]
  }),

  selectors: ({ selectors }) => ({
    doubleCounter: [
      () => [selectors.counter],
      (counter) => counter * 2,
      PropTypes.number
    ]
  })
})
export default class Counter extends Component {
  render () {
    const { counter, doubleCounter } = this.props
    const { increment, decrement } = this.actions

    return (
      <div className='kea-counter'>
        Count: {counter}<br />
        Doublecount: {doubleCounter}<br />
        <button onClick={() => increment(1)}>Increment</button>
        <button onClick={() => decrement(1)}>Decrement</button>
      </div>
    )
  }
}

์•ฑ์ด ์„ฑ์žฅํ•˜๊ณ  ๋” ๋งŽ์€ ์žฅ์†Œ์—์„œ increment ๋ฐ decrement ์ž‘์—… ๋˜๋Š” counter ์†Œํ’ˆ์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// counter-logic.js
import PropTypes from 'prop-types'
import { kea } from 'kea'

export default kea({
  actions: () => ({
    increment: (amount) => ({ amount }),
    decrement: (amount) => ({ amount })
  }),

  reducers: ({ actions }) => ({
    counter: [0, PropTypes.number, {
      [actions.increment]: (state, payload) => state + payload.amount,
      [actions.decrement]: (state, payload) => state - payload.amount
    }]
  }),

  selectors: ({ selectors }) => ({
    doubleCounter: [
      () => [selectors.counter],
      (counter) => counter * 2,
      PropTypes.number
    ]
  })
})
// index.js
import React, { Component } from 'react'
import { connect } from 'kea'

import counterLogic from './counter-logic'

@connect({
  actions: [
    counterLogic, [
      'increment',
      'decrement'
    ]
  ],
  props: [
    counterLogic, [
      'counter',
      'doubleCounter'
    ]
  ]
})
export default class Counter extends Component {
  render () {
    const { counter, doubleCounter } = this.props
    const { increment, decrement } = this.actions

    return (
      <div className='kea-counter'>
        Count: {counter}<br />
        Doublecount: {doubleCounter}<br />
        <button onClick={() => increment(1)}>Increment</button>
        <button onClick={() => decrement(1)}>Decrement</button>
      </div>
    )
  }
}

๊ทธ๊ฒƒ์„ ์‹œ๋„ ํ•˜๊ณ  ๋ฌธ์„œ ๋ฅผ ์ฝ๊ณ  redux-saga๋ฅผ ํ†ตํ•œ ๋ถ€์ž‘์šฉ ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํƒ€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

Kea์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์€ "๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด Redux ์„ธ๊ณ„๋ฅผ ๋” ๋‚˜์€ ๊ณณ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด KeaJS๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ‘" ๋ผ๋Š” ๋ฌธ์ œ๋ฅผ ์ธ์šฉํ•˜์—ฌ ์ง€๊ธˆ๊นŒ์ง€ ์••๋„์ ์œผ๋กœ ๊ธ์ •์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„์„ ๋‚ด์ฃผ์‹œ๊ณ  ์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! :)

์ข‹์•„ ๋ณด์ธ๋‹ค! 'increment' ๋งˆ๋ฒ•์˜ ๋ˆ์ด ์ •๋ง ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ํ† ๋ก ์ด ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๊นŒ? Kea๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ์ •๋˜๋Š” ๊ฐ€์žฅ ์ •ํ™•ํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๊นŒ?

@lucfranken : ์•„๋‹ˆ์š”, ํ† ๋ก ์ด

Redux๋ณด๋‹ค ๋†’์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”๋ฅผ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด Kea๊ฐ€ ์•„๋งˆ๋„ ์ข‹์€ ์„ ํƒ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์Šคํ† ์–ด ์„ค์ • ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๋Š” "Redux ์Šคํƒ€ํ„ฐ ํŒฉ"์„ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด ๋ช‡ ๊ฐ€์ง€๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•ผ์ƒ์—์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์„ ๋ณธ ์ ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ๊ทธ๋Ÿฐ ๊ณต์‹์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋ง์— ๋‚ด ๋ชจ์ž๋ฅผ ๋˜์กŒ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค: https://github.com/HenrikJoreteg/redux-bundler

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ด๊ฒƒ์ด ์ƒ์šฉ๊ตฌ์˜ ํฐ ๋‹จ์ˆœํ™”์™€ ๊ฐ์†Œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ตœ๊ทผ์— ๋งŒ๋“  ๋ชจ๋“  ๊ฒƒ์„ ๊ทธ๋ ‡๊ฒŒ ์ง“๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์•„์š” :
https://github.com/anish000kumar/redux-box
image

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €ํฌ ํšŒ์‚ฌ์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ๊ณ„์ธต์„ ๊ด€๋ฆฌํ•˜๊ณ  Redux์—์„œ ๋งŽ์€ ์ƒ์šฉ๊ตฌ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์˜คํ”ˆ ์†Œ์Šค๋กœ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ์„ฑ๊ณต์ ์ธ ๊ฒƒ์œผ๋กœ ์ž…์ฆ๋˜์—ˆ์ง€๋งŒ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค: https://github.com/Brigad/redux-rest-easy/ (์ค‘๊ฐ„ ๊ธฐ์‚ฌ: https://engineering.brigad.co/introducing-redux-rest-easy -6e9a91af4f59)

1_327nnvo3cuaqc-dsqpoq7w

redux ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
image

https://github.com/zhDmitry/restate

์Šค๋ ˆ๋“œ์˜ ๋งค์šฐ ๋’ค๋Šฆ์€ ๊ดด์‚ฌ๋กœ, ์–ผ๋งˆ ์ „์— ๋‚˜๋Š” "๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ"๊ฐ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜๋ฏธํ•˜๋Š” ๋ฐ”์— ๋Œ€ํ•ด Twitter์—์„œ ํ”ผ๋“œ๋ฐฑ์„ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค.

https://twitter.com/acemarke/status/969040835508604929

๋„คํฌ๋กœ ์Šค๋ ˆ๋“œ์˜ ๊ท€ํ™˜!

์ด ์Šค๋ ˆ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ฃผ์„์„ ํŽธ์ง‘ํ•œ ๊ฒฐ๊ณผ ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜๋œ ์•„์ด๋””์–ด๊ฐ€ Redux-Starter-Kit ํŒจํ‚ค์ง€ ๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•ด ๋ณด๊ณ  Redux ์‚ฌ์šฉ์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ๋„์›€์ด ๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰