Redux: ๋ชจ๋“  ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ ๋ถˆ๋ณ€ ์›์ž์— ์ €์žฅํ•˜๋Š” ๋‹จ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2016๋…„ 02์›” 10์ผ  ยท  91์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: reduxjs/redux

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

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

redux๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Om , datomic ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์—๋„ ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ถ๊ธˆ ํ•ฉ๋‹ˆ๋‹ค .

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

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

์—ฌ๋Ÿฌ๋ถ„์€ ์•„๋งˆ๋„ ์ €๋ณด๋‹ค ๋” ๋งŽ์€ ์ƒ๊ฐ์„ ํ•˜์…จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋ฅผ ์œ„ํ•ด ์ด๊ฒƒ์„ ์„ค๋ช… ํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

discussion docs question

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

Redux๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์†Œ๋น„ ํ•  ๋‹จ์ผ ํ”„๋กœ์ ์…˜์ด์žˆ๋Š” ์ด๋ฒคํŠธ ์†Œ์‹ฑ์ž…๋‹ˆ๋‹ค.

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

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

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

๋˜ํ•œ ImmutableJS์™€ ๊ฐ™์€ ์˜๊ตฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ํฐ ๋ชฉ๋ก์˜ ์ž„์˜ ์ƒ‰์ธ์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์ž‘์—…์—์„œ ํ•ญ์ƒ ์ตœ์ƒ์˜ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค ( ์—ฌ๊ธฐ์—์„œ ํฐ ๋ชฉ๋ก์„ ๋ Œ๋”๋ง ํ•œ ๊ฒฝํ—˜ ์ฐธ์กฐ).

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


@jquense ์—๋„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

  • ํ…์ŠคํŠธ ์ž…๋ ฅ
  • ์Šคํฌ๋กค ์œ„์น˜
  • ๋ทฐํฌํŠธ ํฌ๊ธฐ
  • ๋งˆ์šฐ์Šค ์œ„์น˜
  • ์บ๋Ÿฟ ์œ„์น˜ / ์„ ํƒ
  • ์บ”๋ฒ„์Šค dataUrls
  • ์ง๋ ฌํ™” ๋ถˆ๊ฐ€๋Šฅ ์ƒํƒœ
  • ...

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

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

๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ •๋ง๋กœ ๋“ฃ๊ณ  ์‹ถ์—ˆ๋‹ค.

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

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

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

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋‹จ์  ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์šฐ๋ฆฌ์—๊ฒŒ ํŠน๋ณ„ํžˆ ๊ธˆ์ง€๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. :)

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

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

๋‚ด๊ฐ€ ๊ณ ์ƒ ํ•œ ๊ฒƒ์€ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋กœ์„œ Redux์˜ ๊ทน๋‹จ์  ์ธ (imho) ์ฝ”๋”ฉ ์Šคํƒ€์ผ ๋ณ€ํ™”์™€ ๋™์‹œ์— ๊ฐœ๋…์  ๋ณ€ํ™”๋ฅผ ๊ทน๋ณตํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ๋‹ฌ์ด ์ง€๋‚œ ์ง€๊ธˆ๋„ ์กฐ๊ธˆ ๋ฒ…์ฐจ๊ณ  ๊นŠ์ด ๋“ค์–ด ๊ฐ€๋ ค๊ณ  ์‹œ๋„ํ•œ ํ›„ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด https://github.com/ngrx/store๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์žˆ์ง€๋งŒ ๋” ์นœ์ˆ™ํ•œ ์Šคํƒ€์ผ / ๊ตฌ๋ฌธ๊ณผ ๋‚˜๋จธ์ง€ ํ”„๋ ˆ์ž„ ์›Œํฌ๊ฐ€ ์•”์‹œ / ์ œ๊ณต๋œ ๋” ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

๋‹น์‹ ์˜ ์ž˜๋ชป์€ ์•„๋‹ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ํ•ด๊ฒฐ์„ ๋•๊ณ  ์‹ถ์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. :)

์ด ์‹œ์ ์—์„œ ์—ฌ์ „ํžˆ ๊ฐ€์žฅ ํฐ ์งˆ๋ฌธ์€ ํ•จ์ˆ˜, ์ธ์Šคํ„ด์Šค ๋˜๋Š” ์•ฝ์†๊ณผ ๊ฐ™์€ ์ง๋ ฌํ™” ํ•  ์ˆ˜์—†๋Š” ํ•ญ๋ชฉ์ด ์–ด๋””๋กœ ๊ฐ€์•ผ ํ•˜๋Š”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๋‚œ๋ฐค Reactiflux์—์„œ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•ดํ–ˆ๊ณ  ์ข‹์€ ๋ฐ˜์‘์„ ์–ป์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ http://stackoverflow.com/questions/35325195/should-i-store-function-references-in-redux-store ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์ƒ์ ์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€ (๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ๊ฐ€์žฅ ์ข‹์€ ์ ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค) :

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

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

@gaearon ์šฐ๋ฆฌ๋Š” ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ํ•œ ์ƒ์ ์ด ์šฐ๋ฆฌ์—๊ฒŒ ์ ํ•ฉํ•˜์ง€ ์•Š์€ ์ด์œ ๋ฅผ ํ•œ ๋ฒˆ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค (์ƒํŠธ ํŽ˜ํ…Œ๋ฅด๋ถ€๋ฅดํฌ์—์„œ React.js ๋ฐ‹์—… ์ดํ›„). ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋‹ค์‹œ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค (๋ฏธ๋””์—„ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ?).ํ•˜์ง€๋งŒ ์ œ ์˜์–ด ์‹ค๋ ฅ ๋•Œ๋ฌธ์— ๋„์›€์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. :) ํŠธ์œ„ํ„ฐ์—์„œ ์ง์ ‘ ๊ฒ€ํ† ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์—์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด๋‚˜ ๊ท€ํ•˜์—๊ฒŒ ๋ณด๋‚ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ? ์™„๋ฃŒ ๋  ๋•Œ ๋ฉ”์‹œ์ง€? ์ •ํ™•ํ•œ ๋‚ ์งœ๋ฅผ ์ •ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์กฐ๋งŒ๊ฐ„์ด ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค (์ด๋ฒˆ ๋‹ฌ ๋ง์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋†’์Œ).

๊ทธ๋ฆฌ๊ณ  ์˜ˆ, @timdorr๊ฐ€ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฌธ์„œ์˜ ์ผ๋ถ€ ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ƒ์ ์—์„œ Redux๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (๊ทธ ๋น„์šฉ์œผ๋กœ ๋‹ค์–‘ํ•œ ์ƒ์ ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ react-redux ๋ฅผ ํŽธ์•ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ๋งค์žฅ์˜ ๊ฒฝ์šฐ)

Redux๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์†Œ๋น„ ํ•  ๋‹จ์ผ ํ”„๋กœ์ ์…˜์ด์žˆ๋Š” ์ด๋ฒคํŠธ ์†Œ์‹ฑ์ž…๋‹ˆ๋‹ค.

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

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

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

๋˜ํ•œ ImmutableJS์™€ ๊ฐ™์€ ์˜๊ตฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ํฐ ๋ชฉ๋ก์˜ ์ž„์˜ ์ƒ‰์ธ์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์ž‘์—…์—์„œ ํ•ญ์ƒ ์ตœ์ƒ์˜ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค ( ์—ฌ๊ธฐ์—์„œ ํฐ ๋ชฉ๋ก์„ ๋ Œ๋”๋ง ํ•œ ๊ฒฝํ—˜ ์ฐธ์กฐ).

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


@jquense ์—๋„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

  • ํ…์ŠคํŠธ ์ž…๋ ฅ
  • ์Šคํฌ๋กค ์œ„์น˜
  • ๋ทฐํฌํŠธ ํฌ๊ธฐ
  • ๋งˆ์šฐ์Šค ์œ„์น˜
  • ์บ๋Ÿฟ ์œ„์น˜ / ์„ ํƒ
  • ์บ”๋ฒ„์Šค dataUrls
  • ์ง๋ ฌํ™” ๋ถˆ๊ฐ€๋Šฅ ์ƒํƒœ
  • ...

๋‚ด๊ฐ€ ๋ฐฉ๊ธˆ ๋ณธ์ด ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

http://stackoverflow.com/questions/35328056/react-redux-should-all-component-states-be-kept-in-redux-store

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

๋˜ํ•œ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ˆœ์ˆ˜ํ•˜๊ณ  ์ž์ฒด ์ƒํƒœ์—์„œ ๋ฐœ์–ธ๊ถŒ์ด์—†๋Š” https://github.com/ericelliott/react-pure-component-starter ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ฐฉํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

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

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

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

์ฆ‰, ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ถ€๋ถ„์€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ƒํƒœ๋ฅผ ๋ฌถ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ƒํƒœ๋ฅผ ์—ผ๋‘์—๋‘๊ณ  ์žˆ์ง€๋งŒ์ด ์ค‘ ๋Œ€๋ถ€๋ถ„์€ UI ์ƒํƒœ ๋กœ ์ผ๋ฐ˜ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Redux์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ƒํƒœ๊ฐ€ ์–ด์ƒ‰ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ด์œ  :

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

๋ฐ˜๋ฉด์— Redux ์ƒํƒœ ํŠธ๋ฆฌ ์™ธ๋ถ€์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ƒํƒœ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ๋Š” ํ™•์‹คํžˆ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

DOM์„ ์กฐ์ž‘ํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ง์ ‘ ๋งŒ๋“ค๋ ค๊ณ ํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„์ฃผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • virtual-dom diff๋Š” ๋…ธ๋“œ์— ์„ค์ • ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํƒ€์ผ๊ณผ ๊ฐ™์€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์กฐ์ž‘์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. DOM ๋…ธ๋“œ์— ์ผ๋ถ€ ์Šคํƒ€์ผ์„ ์„ค์ • ํ•œ ๊ฒฝ์šฐ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์ง์ ‘ ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌธ์„œ ์ž์ฒด์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์ƒ DOM ์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•ด ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ์ธ์‹ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ DOM ๋…ธ๋“œ์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด๋‹น DOM ๋…ธ๋“œ์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ค‘๊ฐ„์— ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฌธ์„œ ์ž์ฒด์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ์—์„œ ์„ค์ • ํ•œ ๊ฐ€์ƒ ๋” ๋ฎ์–ด ์“ฐ๊ธฐ ์Šคํƒ€์ผ ๋ฐ ์†์„ฑ์—์ฃผ์˜ํ•ด์•ผํ•˜๋ฉฐ virtual-dom์—์„œ ์„ค์ • ํ•œ ์Šคํƒ€์ผ ๋ฐ ์†์„ฑ ๋ฎ์–ด ์“ฐ๊ธฐ์—์ฃผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ virtual-dom์ด ๋ชจ๋“  DOM ์กฐ์ž‘์„ ์ฒ˜๋ฆฌํ•˜๋„๋กํ•˜๋ ค๊ณ ํ•˜๋Š”๋ฐ (๋‹น์‹ ์ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค!) Redux์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์–ด๋ ค์šด ๋ฌธ์ œ์— ๋ด‰์ฐฉํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค :

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

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํฐ ์ง„์ „์„ ์ด๋ฃจ๋Š” react-motion๊ณผ ๊ฐ™์€ ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ๊ฐ€ ํ˜„์žฌ _for React_์ด์ง€๋งŒ Redux๋Š” React์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ๋ทฐ ๋ ˆ์ด์–ด๋ฅผ ๊ฐ€์ ธ์™€ Redux์™€ ํ†ตํ•ฉํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

๊ถ๊ธˆํ•œ ์‚ฌ๋žŒ์ด๋ผ๋ฉด Redux + virtual-dom์— ๋Œ€ํ•ด ์ œ๊ฐ€ ์ฐพ์€ ์ตœ๊ณ ์˜ ์†”๋ฃจ์…˜์€ ๋‘ ๊ฐ€์ง€ ์ƒํƒœ ์›์ž๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Redux๋Š” ํ•ต์‹ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ , ์ž‘์—…์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ํ•ต์‹ฌ ๋กœ์ง์„ ๋ณด์œ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ƒํƒœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค (๋‚˜๋Š” mobservable์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿฐ ๋‹ค์Œ ํŠธ๋ฆญ์€ Redux ์ƒํƒœ ๋ณ€๊ฒฝ _and_ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋ชจ๋‘ ๊ตฌ๋…ํ•˜๊ณ  UI๋ฅผ ๋‘ ๊ธฐ๋Šฅ์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

/* Patch h for jsx/vdom to convert <App /> to App() */
import h from './h'
import { diff, patch, create } from 'virtual-dom'
import { createStore } from 'redux'
import { observable, autorun } from 'mobservable'
import TWEEN from 'tween.js'
import rootReducer from './reducers'
import { addCard } from './actions'
import App from './containers/App'

// Redux state
const store = createStore()

// Create vdom tree
let tree = render(store.getState())
let rootNode = create(tree)
document.body.appendChild(rootNode)

// Animation observable
let animationState = observable({
  opacity: 0
})

// Update document when Redux state 
store.subscribe(function () {
  // ... anything you need to do in response to Redux state changes
  update()
})

// Update document when animation state changes
autorun(update)

// Perform document update with current state
function update () {
  const state = store.getState()
  let newTree = render(state, animationState)
  let patches = diff(tree, newTree)
  rootNode = patch(rootNode, patches)
  tree = newTree
}

// UI is a function of current state (and animation!)
function render (state, animation = {}) {
  return (
    <App {...state} animation={animationState} />
  )
}

// Do some animations
function animationLoop (time) {
  window.requestAnimationFrame(animationLoop)
  TWEEN.update(time)
}
animationLoop()

new TWEEN.Tween(animationState)
      .to({ opacity: 100 }, 300)
      .start()

// Or when you dispatch an action, also kick off some animation changes...
store.dispatch(addCard())
/* etc... */

ํ›Œ๋ฅญํ•œ ๋‹ต๋ณ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๊ณ„์† ์˜ค์„ธ์š”.

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

ํ—‰ํ—‰

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

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

๋ฟก ๋นต๋€จ

๊ฐ์†๊ธฐ ๊ฐ„์˜ ์ƒํƒœ ํ‚ค ์ถฉ๋Œ ํ™•๋ฅ ์ด ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

@gaearon @istarkov : ์•„๋งˆ๋„ ๋‹ค์–‘ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋™์ผํ•œ ์ตœ์ƒ์œ„ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์œ„ํ•ด

์˜ˆ, ์ด๊ฒƒ์ด @istarkov๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด

@gaearon

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

๋‚˜๋Š” ๊ธฐ๋ปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค! ์ž ์‹œ๋งŒ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”.

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

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์˜คํ”„ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ฃผ ์ž˜ ํ‹€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@taggartbg : ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๋ชจ๋ฅธ ์ฑ„ ์ „์ ์œผ๋กœ ๋งํ•˜๊ธฐ. ๋‹น์‹ ์€ ์ด์™€ ๊ฐ™์€ ์ƒํƒœ๋ฅผ ๋‹ค๋ฃจ๋ ค๊ณ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

{ groupedData : { first : {a : 1, b : 2}, second : {a : 3, b : 4}, third : {a : 5, b, 6} }

๊ฐ ์ž‘์—…์˜ ์ผ๋ถ€๋กœ ๊ทธ๋ฃน ๋ณ„ ID ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์ผ ๊ฐ์†๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์†๊ธฐ ์ธก์—์„œ์ด๋ฅผ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, https://github.com/erikras/multireducer , https://github.com/lapanoid/redux-delegator , https://github.com/reducks/redux-multiplex , ๋˜๋Š” https://github.com/dexbol/redux-register?

๋˜ํ•œ ์žฌ ์„ ํƒ ์ธก๋ฉด์—์„œ React-Redux๊ฐ€ ์ด์ œ ์ปดํฌ๋„ŒํŠธ ๋ณ„ ์„ ํƒ๊ธฐ๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ปดํฌ๋„ŒํŠธ props๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ ํƒํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@gaearon

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

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

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

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

ํŽธ์ง‘ : ๋ฌธ์ œ์˜ ์ œ๋ชฉ์€ "๋ชจ๋“  ์ƒํƒœ๋ฅผ ๋‹จ์ผ ๋ถˆ๋ณ€ ์›์ž์— ์ €์žฅํ•˜๋Š” ๋‹จ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?"์ž…๋‹ˆ๋‹ค. ์ด "๋‹จ์ผ ๋ถˆ๋ณ€ ์›์ž์˜ ๋ชจ๋“  ์ƒํƒœ"๋Š” Redux ํŠธ๋ฆฌ์—์„œ ๋งŽ์€ ์ž˜๋ชป๋œ ์ข…๋ฅ˜์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ์ผ์ข…์˜ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ํ•จ์ •์„ ํ”ผํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ช…์‹œ์ ์ธ ์˜ˆ์ œ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@gaearon ์šฐ๋ฆฌ๋Š” Cycle.js์—์„œ ๋‹จ์ผ ์›์ž ์ƒํƒœ์™€ ํŒŒ์ดํ•‘ ๊ฐ„์˜ ๊ตฌ์กฐ์  ์ฐจ์ด์ ์— ๋Œ€ํ•ด ํฅ๋ฏธ๋กœ์šด ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ .

์ด๊ฒƒ์ด 100 % Redux์™€ ๊ด€๋ จ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ Observable ์ŠคํŠธ๋ฆผ์„ ์•ฑ ์ฃผ๋ณ€์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌํ˜„๊ณผ๋Š” ๋‹ค๋ฅธ ๊ด€์ ์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค (Cycle์˜ ๊ฒฝ์šฐ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ ์ง‘ํ•ฉ ์ž„).

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

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

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

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

์ด๊ฒƒ์ด ์™„์ „ํžˆ ๋ฌธ๋งฅ์—์„œ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ ๋ฏธ๋ฆฌ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ๋น„์Šทํ•œ ๋Œ€ํ™”๋ฅผ ์–ด๋–ป๊ฒŒํ–ˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก

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

๋‚˜๋Š” ์œ„์ ฏ์ด ์ž์ฒด ์ƒํƒœ (์•„๋งˆ๋„ ์ž์ฒด (redux?) ์ €์žฅ์†Œ ์ผ ์ˆ˜๋„ ์žˆ์Œ)๋ฅผ ๊ฐ€์งˆ ๋•Œ ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๋ชจ๋“  (๋งค์‹œ์—…) ์•ฑ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ์ผ๋ถ€ ์†์„ฑ ๋งŒ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ ์”จ ์œ„์ ฏ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณด์‹ญ์‹œ์˜ค. ์ž์ฒด์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋„์‹œ, ๋†’์ด ๋ฐ ๋„ˆ๋น„์™€ ๊ฐ™์€ ์†์„ฑ ๋งŒ ์ˆ˜์‹  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋Š” Twitter ์œ„์ ฏ์ž…๋‹ˆ๋‹ค.

@chicoxyzzy ๊ด€๋ จ : https://github.com/rackt/react-redux/issues/278

์ข‹์€ ํ† ๋ก !

์ฃผ๋กœ ์—ฌ๋Ÿฌ ์•ฑ / ์ปดํฌ๋„ŒํŠธ / ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค.

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

์˜ˆ๋ฅผ ๋“ค๋ฉด :

iMessage์™€ ๊ฐ™์€ ๋ฉ”์‹ ์ €๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. redux ์ƒํƒœ๋Š” currentConversationId ๋“ฑ์ž…๋‹ˆ๋‹ค. ๋‚ด Messenger ๊ตฌ์„ฑ ์š”์†Œ์—๋Š” @connect(state => ({ currentConversationId: state.messenger.currentConversationId })) ์žˆ์Šต๋‹ˆ๋‹ค.

์ด Messenger ๋ฅผ ์ƒˆ ์•ฑ์— ํฌํ•จํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๋ ค๋ฉด import { rootReducer as messengerRootReducer } from 'my-messenger' ๋ฅผ combineReducers({ messenger: messengerRootReducer }) ์— ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ๋‘ ๊ฐœ์˜ <Messenger> ์ธ์Šคํ„ด์Šค๋ฅผ ์•ฑ์— ๊ฐ–๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ๋ฉ”์‹ ์ € ๊ตฌ์„ฑ ์š”์†Œ์—์„œ state.messenger ์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋งŒ๋“ค๊ธฐ์ƒ์ ์˜ ํŠน์ • ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ž‘์—…ํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ @connect ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํฌํ•จํ•˜๋Š” ์•ฑ์— my-messenger ๋ชจ๋“ˆ์— ์กด์žฌํ•˜๋Š” ํŠน์ • ์ž‘์—… ์ด๋ฆ„์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์˜ redux ํ”Œ๋Ÿฌ๊ทธ์ธ์— @@router/UPDATE_LOCATION ์™€ ๊ฐ™์€ ์ ‘๋‘์‚ฌ๊ฐ€์žˆ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

๋ฌด์ž‘์œ„ / ๋ฏธ์นœ ์•„์ด๋””์–ด ๋ช‡ ๊ฐ€์ง€ :

1

@connect ๋Š” ์ƒ์ ์˜ ํŠน์ • ์กฐ๊ฐ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ state.messenger[0] / state.messenger[1] ์™€ ๊ฐ™์ด ์ž์ฒด ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์— ์—ฐ๊ฒฐํ•˜๋Š” ์—ฌ๋Ÿฌ <Messenger> ์•ฑ์— ํฌํ•จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. state.messenger[1] ์—ฌ์ „ํžˆ state.messenger ๊ณ„์† ์—ฐ๊ฒฐ๋˜๋Š” <Messenger> ๋Œ€ํ•ด ํˆฌ๋ช…ํ•ด์•ผํ•˜์ง€๋งŒ ํฌํ•จํ•˜๋Š” ์•ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์Šฌ๋ผ์ด์Šค๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@connect(state => ({ messengers: state.messengers }))
class App extends Component {
  render() {
    return (
      <div>
        {this.props.messengers.map(messenger =>
          <ProvideSlice slice={{messenger: messenger}}><Messenger /></ProvideSlice>
        }
      </div>
    )
  }
}

์ „์—ญ ์ •๊ทœํ™” ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. state.entities ๋„ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์Šฌ๋ผ์ด์Šค ์ƒํƒœ์™€ ํ•จ๊ป˜ ์ „์ฒด ์ƒํƒœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋“  ์กด์žฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ProvideSlice ์€ Messenger ์˜ @connect ์—์„œ ์ฝ์„ ์ˆ˜์žˆ๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” <Messenger> ๊ตฌ์„ฑ ์š”์†Œ์— ์˜ํ•ด ๋ฐœ์ƒํ•œ ์ž‘์—…์„ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•ด๋‹น ์Šฌ๋ผ์ด์Šค์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. @connect ์•„๋ž˜์— ProvideSlice ์ด (๊ฐ€) ํ•ด๋‹น ์ฃผ์— ๋Œ€ํ•ด์„œ๋งŒ mapDispatchToProps ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

2

store ๋ฐ reducer ์ •์˜๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ฐ ๊ฐ์†๊ธฐ๊ฐ€ ๋…๋ฆฝํ˜• ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์†๊ธฐ๊ฐ€ ๋ทฐ์ธ ๋™์•ˆ ์ปจํŠธ๋กค๋Ÿฌ์ฒ˜๋Ÿผ ์†Œ๋ฆฌ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. React์˜ ์ ‘๊ทผ ๋ฐฉ์‹, "๋ชจ๋“  ๊ฒƒ์ด ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค"(angular 1.x์˜ ์ปจํŠธ๋กค๋Ÿฌ / ์ง€์‹œ๋ฌธ๊ณผ ๋‹ฌ๋ฆฌ)๋ฅผ ์ทจํ•˜๋ฉด ๊ตฌ์„ฑ ์š”์†Œ์™€ ํ•ด๋‹น ์ƒํƒœ / ๋™์ž‘์ด ์ง„์ •์œผ๋กœ ๋…๋ฆฝํ˜•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๊ทœํ™” ๋œ ์—”ํ‹ฐํ‹ฐ (์˜ˆ : '๊ธ€๋กœ๋ฒŒ ์ƒํƒœ')์™€ ๊ฐ™์€ ๊ฒฝ์šฐ React์˜ ์ปจํ…์ŠคํŠธ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ์ž‘์—… (์˜ˆ : getState ์˜ thunk ) / ์—ฐ๊ฒฐ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@elado ์ง€๊ธˆ๊นŒ์ง€ ๋ณธ ๊ฐ€์žฅ ์˜๋ฆฌํ•œ ์•„์ด๋””์–ด๋Š” "์ œ๊ณต์ž"๋ฅผ ์—ผ๋‘์—๋‘๊ณ  ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://medium.com/@timbur/react -automatic-redux-providers-and-replicators-c4e35a39f1

Thx @sompylasar. ๋‚˜๋Š” ์•ฝ๊ฐ„์˜๋กœ๋“œ ํŠธ๋ฆฝ atm์— ์žˆ์ง€๋งŒ ๊ธฐํšŒ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์ด๋ฏธ React์™€ Redux์— ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๊ณต๊ธ‰์ž๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. :)

_ ๋Œ“๊ธ€์ด https://github.com/loggur/react-redux-provide/issues/8_ ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

@gaearon ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ด๊ฒƒ์— ๋Œ€ํ•œ ๋‹น์‹ ์˜ ์ƒ๊ฐ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

@gaearon ์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ ๊ตฌํ˜„์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@gaearon

์ฆ‰, React ๋กœ์ปฌ ์ƒํƒœ ๋ชจ๋ธ๊ณผ ๊ฐ™์€ ๊ฒƒ์„๋ณด๊ณ  ์‹ถ์ง€๋งŒ ๊ฐ์†๊ธฐ์— ์˜ํ•ด ๋’ท๋ฐ›์นจ๋ฉ๋‹ˆ๋‹ค.

๊นŒ๋‹ค๋กœ์šด ๋ถ€๋ถ„์€ React ๋กœ์ปฌ ์ƒํƒœ๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ Redux์—์„œ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ๋ชจ๋ธ๋งํ•˜๋ ค๊ณ ํ•˜๋ฉด "๋งˆ์šดํŒ…"๋ฐ "๋งˆ์šดํŠธ ํ•ด์ œ"์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์žˆ์Šต๋‹ˆ๋‹ค. Elm์€์ด ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 1) ์ปดํฌ๋„ŒํŠธ์— ๋ผ์ดํ”„ ์‚ฌ์ดํด์ด์—†๊ณ  2) ๋ทฐ์˜ "๋งˆ์šดํŒ…"์ด ๋ชจ๋ธ์—์„œ ํŒŒ์ƒ ๋œ ๋ฐ˜๋ฉด React์—์„œ๋Š” ๋กœ์ปฌ ์ƒํƒœ๊ฐ€ ๋ทฐ๊ฐ€ ๋งˆ์šดํŠธ ๋œ _after_ ์กด์žฌํ•˜๊ธฐ

๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Elm ์•„ํ‚คํ…์ฒ˜ ( "๋ชจ๋“  ๋ฐฉ๋ฒ•")๋Š” ์ž์ฒด ๋‹จ์ ์ด ์žˆ์œผ๋ฉฐ React์˜ ์—…๋ฐ์ดํŠธ ๋ฐ ์กฐ์ •์ฃผ๊ธฐ์— ์ž˜ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์˜ˆ : shouldComponentUpdate() ์ตœ์ ํ™”๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ... render() ๋‚ด๋ถ€์˜ ๋””์ŠคํŒจ์น˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆœ์ง„ํ•˜๊ฒŒ "์ „๋‹ฌ"ํ•˜๋ฉด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.)

ํŠน์ • ์‹œ์ ์—์„œ, ์ €๋Š” ๊ฐ์†๊ธฐ + setState๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ•˜๋ฃจ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. : D React ๊ฐ€ ์ƒํƒœ ํŠธ๋ฆฌ ๋ฅผ

๋‚˜๋Š” ์ด๊ฒƒ์ด @threepointone ์ด https://github.com/threepointone/redux-react-local ๋กœ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@acdlite Elm์˜ ๊ฐœ๋…์  ๋ชจ๋ธ์€ ๋กœ์ปฌ ์ƒํƒœ์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋งˆ์šดํŠธ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์‹œ์ฐจ ํšจ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ์‹ค์ œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ์ •๋ง ๊ณ ํ†ต์Šค๋Ÿฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค ... https : //๋ฅผ ์ฐธ์กฐ

@slorber ๋„ค ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ๋‚ด๊ฐ€ ๋ฐฉ๊ธˆ ๋งํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๊นŒ? :๋””

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

์˜ˆ, ์šฐ๋ฆฌ๋Š” @acdlite ๊ฐ™์€ ํŽ˜์ด์ง€์— ์žˆ์Šต๋‹ˆ๋‹ค.
React๊ฐ€์žˆ๋Š” Elm ์•„ํ‚คํ…์ฒ˜๋Š”์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Elm์กฐ์ฐจ๋„ vdom ํ›„ํฌ ์‚ฌ์šฉ์„ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ž˜์—์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Elm ์•„ํ‚คํ…์ฒ˜์—๋Š” ๊ฝค ๋งŽ์€ ์ƒ์šฉ๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋žฉํ•‘ / ๋žฉํ•‘ ํ•ด์ œ ์ž‘์—…์— Flow ๋˜๋Š” Typescript๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ์ง€์† ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ @threepointone์˜ ์†”๋ฃจ์…˜๊ณผ ๊ฐ™์ด์ด ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค

Elm ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์šฐ๋ ค๋Š” ์ค‘์ฒฉ ๋œ ๋™์ž‘์ด ๋กœ์ปฌ ๊ตฌ์„ฑ ์š”์†Œ ์ƒํƒœ์—์„œ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋ถ„๋ฆฌ ๋œ ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ํ†ต์‹ ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋‹ค์ง€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. widget1์ด widget2์— ์˜ํ•ด ๋ฐœ์ƒํ•œ ์ผ๋ถ€ ์ด๋ฒคํŠธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๊นŠ๊ฒŒ ์ค‘์ฒฉ ๋œ ์กฐ์น˜๋ฅผ ํ’€๊ณ  ๊ฒ€์‚ฌํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์ปคํ”Œ ๋ง ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ ํ‘œํ˜„ํ–ˆ์œผ๋ฉฐ 2 ๊ฐœ์˜ "์‚ฌ์„œํ•จ"๊ณผ ํ•จ๊ป˜ Elm์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ redux-saga๊ฐ€ ํ”Œ๋žซ ์ด๋ฒคํŠธ๊ฐ€์žˆ๋Š” non-elm ์•„ํ‚คํ…์ฒ˜์—์„œ ๋„์›€์ด ๋  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ™•์žฅ ๊ฐ€๋Šฅํ•œ redux ์•ฑ์„ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ข‹์€ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ๋œ ๋ฐ”์  ๋•Œ ์ด์— ๋Œ€ํ•ด ์ž‘์„ฑํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@gaearon ๋งˆ์ง€๋ง‰ ๊ฒŒ์‹œ๋ฌผ์—์„œ react-redux-provide ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹น์‹ ์ด ๋Œ€๋‹ต์— ๋”ฐ๋ฅด๋ฉด, ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ถฉ๋ถ„ํžˆ ๊ฐ€๊นŒ์ด ๋ณด์ง€ ์•Š์€ ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๋ฌป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ @acdlite ์˜ ์ƒํƒœ ํŠธ๋ฆฌ ์™ธ๋ถ€ํ™”์— ๋Œ€ํ•œ ์–ธ๊ธ‰๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด๊ฒƒ์€ ์ œ๊ณต ์—…์ฒด๊ฐ€ ํ•ด๊ฒฐํ•˜๋„๋ก ์„ค๊ณ„๋œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

provide ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์ œ๊ณตํ•˜๋Š” API๋Š” ํ™•์‹คํžˆ ์ถ”์ƒํ™”์ด๋ฉฐ ์˜ˆ, ํ˜„์žฌ redux ์— ์ข…์†๋˜์–ด ์žˆ์ง€๋งŒ redux ์— ์ข…์†๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. React์˜ context ๋Š” ์•„์ง ์™„์ „ํžˆ ๊ฐœ๋ฐœ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ์„ฑ ์š”์†Œ์™€ ์ƒํƒœ ํŠธ๋ฆฌ ๊ฐ„์˜ "์ ‘์ฐฉ์ œ"์— ๋ถˆ๊ณผํ•˜๋ฏ€๋กœ ์ƒ๊ฐํ•ด๋ณด์‹ญ์‹œ์˜ค. actions ๋ฐ reducers (์ฆ‰, ์ƒ์ ์˜ ์ƒํƒœ)๋ฅผ ํ†ตํ•ด ์ƒํƒœ ํŠธ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•˜๊ณ  ํ‘œํ˜„ํ•˜๋Š” ์ด์ƒ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค. props . ๋ณธ์งˆ์ ์œผ๋กœ ์„ ์–ธ actions ๋ฐ reducers ๋กœ propTypes (๋ฐ / ๋˜๋Š” contextTypes ์–ด๋–ป๊ฒŒ ๋‹น์‹ ์—๊ฒŒ ์œ ์‚ฌํ•œ ๋ฏธ๋ž˜์—) import ๋‹ค๋ฅธ ์–ด๋–ค ์•ฑ ๋‚ด์—์„œ. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ถ”๋ก ํ•˜๊ธฐ๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. React์˜ context ๋Š” ์ž ์žฌ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๋„๋ก ๋ฐœ์ „ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,์ด ๊ฒฝ์šฐ grepํ•˜๊ณ  @provide ๋ฐ import provide from 'react-redux-provide' ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์ „์ฒด 2 ์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋” ์ด์ƒ ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ฐ„๋‹จํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๊ฒฐ์ฝ” ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ชจ๋“  ๊ฒƒ์ด ์™„๋ฒฝํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ณ„์† ์ž‘๋™ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํฐ ๋ฌธ์ œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋ฌธ์ œ๋ฅผ ์ง€๋‚˜์น˜๊ฒŒ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์žฅ์ฐฉ ๋ฐ ๋ถ„๋ฆฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@acdlite ์˜ˆ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

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

ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : ๋ฐ˜์‘ ์ƒํƒœ ๊ตฌํ˜„ ๋น„๊ต .
Elm, Redux, CycleJS ... (์ง„ํ–‰์ค‘์ธ ์ž‘์—…)

์—ฌ๋Ÿฌ ๋งค์žฅ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์—ฌ๋Ÿฌ _ ํƒ€์ž„ ๋ผ์ธ _, _ ์‹œ๊ฐ„ ์—ฌํ–‰ _, ์ €์žฅ ์œ„์น˜ ๋ฐ ์ €์žฅ ๋นˆ๋„๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹จ์ผ ์‚ฌ์šฉ์ž์—๋งŒ ํ•ด๋‹นํ•˜๋Š” user data ๋ฐ user actions , ์‚ฌ์šฉ์ž ๊ทธ๋ฃน์— ํ•ด๋‹นํ•˜๋Š” common data ๋ฐ group actions (์˜ˆ : ๊ณต์œ  ๋‹ค์ค‘ ์‚ฌ์šฉ์ž ํ”„๋กœ์ ํŠธ ๋˜๋Š” ๋ฌธ์„œ). ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์‹คํ–‰ ์ทจ์†Œ ํ•  ์ˆ˜์žˆ๋Š” ํ•ญ๋ชฉ (๊ฐœ์ธ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ)์„ ์ˆ˜์ • ๋œ ํ•ญ๋ชฉ (๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ์ถ”๊ฐ€ ํ•œ ํŽธ์ง‘)๊ณผ ์‰ฝ๊ฒŒ ๋ถ„๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์ €์žฅ ๋ฐ / ๋˜๋Š” ๋™๊ธฐํ™”์ฃผ๊ธฐ๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” angular 2.0 ๊ฐœ๋ฐœ ๋งˆ์ธ๋“œ ์„ธํŠธ๋ฅผ ๊ฐ€์ง„ angular 1.x ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ค๊ณ„ / ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์— ์žˆ์œผ๋ฉฐ redux๋ฅผ ์‚ฌ์šฉํ•  ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ๋””์ŠคํŒจ์น˜์™€ ์ผ๋ถ€ ์ „์šฉ ๋””์ŠคํŒจ์น˜์— ์‘๋‹ตํ•˜๋Š” ์—ฌ๋Ÿฌ ๋งค์žฅ์—์„œ ํ”Œ๋Ÿญ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ์™”์Šต๋‹ˆ๋‹ค.

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

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

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

@VivekPMenon : ๋‹น์‹ ์˜ ๊ตฌ์ฒด์ ์ธ ๊ด€์‹ฌ์‚ฌ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ƒํƒœ ํŠธ๋ฆฌ์˜ ํฌ๊ธฐ? ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์ž‘์—… / ๋ฆฌ๋“€์„œ๋ฅผ ๊ฒฉ๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์†๊ธฐ๋ฅผ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

@markerikson. ๋‹ต์žฅ์„ ๋ณด๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ํ˜ผ๋ž€์€ ๋Œ€๋ถ€๋ถ„ ๋‘ ๋ฒˆ์งธ ์ง€์  (๊ฒฉ๋ฆฌ)์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํŒ€ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ”Œ๋Ÿญ์Šค ๊ธฐ๋ฐ˜์˜ ์œ„์ ฏ A๋ฅผ ๋งŒ๋“ค๊ณ  ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. jspm / npm ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฐฐํฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์œ„์ ฏ B๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋‹ค๋ฅธ ํŒ€์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋…๋ฆฝ์  ์ธ ์œ„์ ฏ / ํŒจํ‚ค์ง€์ด๋ฉฐ ์„œ๋กœ์— ๋Œ€ํ•œ ์ง์ ‘ / ๊ฐ„์ ‘ ์ข…์†์„ฑ์„ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

@VivekPMenon ์ด๊ฒƒ์€ ์šฐ๋ฆฌ ์ค‘ ์ผ๋ถ€๊ฐ€ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์œ ํšจํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

https://github.com/slorber/scalable-frontend-with-elm-or-redux์—์„œ ๋ช‡ ๊ฐ€์ง€ ํ†ต์ฐฐ๋ ฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์—ฌ๊ธฐ์—์„œ Redux-saga์— ๋Œ€ํ•œ ๋‚ด anwser๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค : http://stackoverflow.com/a/34623840/82609

@taggartbg ๊ฒฐ๊ตญ ์ด์Šˆ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋น„์Šทํ•œ ๊ฒƒ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค-๋‹ค๋ฅธ ๋…๋ฆฝ์  ์ธ ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ๊ฐ€์ง„ ๋ฐ˜์‘ ๋ผ์šฐํ„ฐ๋ฅผ ๊ฐ€์งˆ ๋•Œ, ์ƒˆ๋กœ์šด ๋ถ„๊ธฐ๋กœ ์ด๋™ํ•˜๋Š” ๋™์•ˆ ์ด์ „ ๊ฒฝ๋กœ์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

@slorber

redux saga๋Š” ์•„์ฃผ ๋งŽ์€ ๊ฒƒ์„ ๋‹ด์€ ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ๋ผ๊ณ  ๋งํ•˜๋ฉด์„œ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฒฐ์ฝ” ๊ทธ๊ฒƒ์„ ์ค„์ด๋ ค๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ˜„์žฌ ์ƒํƒœ์—์„œ๋Š” ์–ด๋–ค ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ๊ฐ€๋Š” ๋ฌด๊ตญ์ ์ž์ž…๋‹ˆ๋‹ค

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

  • ์‹œ๊ฐ„ ์—ฌํ–‰ ๋ฐœ์ „๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค
  • ์‚ฌ๊ฐ€์˜ ํ˜„์žฌ ์ƒํƒœ๋กœ ์ด์–ด์ง„ ๊ฒฝ๋กœ๋ฅผ ์ถ”์  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์ •์˜ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ [*]์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์—†์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ๊ฐ€๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

[*] ์ด๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋ธ์˜ ์ •์˜ ๋‚ด์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด์„ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, MVC์˜ M๊ณผ C๋ฅผ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค์–ด ๋ฐ˜ ํŒจํ„ด์œผ๋กœ ๊ฐ„์ฃผ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋””์ŠคํŒจ์น˜ ์ž‘์—…์€ ๋น„ ๊ฒฐ์ •์ ์ž…๋‹ˆ๋‹ค.

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

์ง๋ ฌํ™” ๊ฐ€๋Šฅ ์ƒํƒœ

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


์ƒํƒœ์— ๋…ผ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์˜๊ณ  ์ œ ์ƒ๊ฐ์—๋Š” ์ด๊ฒƒ์ด redux saga ๊ฐ€ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ๊ฐ€ _your_ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๊ณ ์œ ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ฆ‰, _your_ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์œ„์—์„œ ์ž‘๋™ํ•˜๋Š” ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‹ค์ œ๋กœ ๋กœ์ง์„ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๋Š” ์ €์žฅ์†Œ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ฟก๋ฟก

๋‚˜๋Š” ๋‹น์‹ ์˜ ์šฐ๋ ค๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. redux-saga ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋…ผ์˜๋˜๊ณ  ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ redux-saga๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ์„ ํƒํ–ˆ์ง€๋งŒ saga ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ „ํ˜€ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์•„๋‹ˆ๋ฉฐ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

redux-saga ๋‚ด๋ถ€์—์„œ redux ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์„ ํƒ ํšจ๊ณผ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ƒ์„ฑ๊ธฐ ๋‚ด๋ถ€์—์„œ ์ƒํƒœ๋ฅผ ์ˆจ๊ธฐ๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๋‹จ์ˆœํžˆ redux-store์— ์ง์ ‘ saga ์ƒํƒœ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

saga์˜ ์‹คํ–‰์„ ์ถ”์  ํ•  ์ˆ˜์žˆ๋Š” saga devtools๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„ ์—ฌํ–‰์— ๋Œ€ํ•œ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์ง€๋งŒ ์•„์ง ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์€ ์—†์Šต๋‹ˆ๋‹ค.

๊ถŒ๋ฆฌ. ๊ฝค ๊ธด ์ฃผ์ œ์ด๊ณ  ๋งค์šฐ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋‹ค์–‘ํ•œ ๊ตญ๊ฐ€ ๊ด€๋ฆฌ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋น„๊ตํ•ด ์™”์Šต๋‹ˆ๋‹ค.

๋น„๊ตํ•˜๋Š” ๋™์•ˆ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ์—ผ๋‘์—๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ง„์‹ค์˜ ๋‹จ์ผ ์†Œ์Šค
  2. ์„œ๋ฒ„ ์ธก์—์„œ ๋ Œ๋”๋งํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‰ฝ๊ณ  / ์–ด๋ ค์› ์Šต๋‹ˆ๊นŒ?
  3. ์‹คํ–‰ ์ทจ์†Œ / ๋‹ค์‹œ ์‹คํ–‰๊ณผ ๊ฐ™์€ devtools ๋ฐ ๋‹ค์‹œ๋กœ๋“œ ํ›„ ์ง€์†์ ์ธ ๊ธฐ๋ก ์ €์žฅ.
  4. ์• ๋‹ˆ๋ฉ”์ด์…˜, ์• ๋‹ˆ๋ฉ”์ด์…˜, ์• ๋‹ˆ๋ฉ”์ด์…˜. ๋‚˜๋Š” ํ•ญ์ƒ ์Šค์Šค๋กœ์—๊ฒŒ _ "์–ด๋–ป๊ฒŒ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์†”๋ฃจ์…˜ a ๋˜๋Š” b์™€ ํ•จ๊ป˜ ์ž‘๋™ ํ•  ๊ฒƒ์ธ๊ฐ€"_๋ผ๊ณ  ์ž๋ฌธํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๊ฐœ๋ฐœ์ค‘์ธ ์ œํ’ˆ์ด UX ์ค‘์‹ฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์ œ๊ฒŒ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. @jsonnull ์ด ๊ฐ€์ง„ ๋งŽ์€ ํ˜ผ๋ž€์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
  5. ๋‹ค๋ฅธ ์•ฑ ๋‚ด์—์„œ ๊ตฌ์„ฑ ์š”์†Œ ์žฌ์‚ฌ์šฉ
  6. ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฐธ์กฐ ๋œ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜ํ™” (_ ์ค‘์š”ํ•œ ๊ณ ํ†ต _) (์„œ๋ฒ„ ์ธก ๋˜๋Š” ๊ธฐํƒ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค์—์„œ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ๊ณต๊ธ‰๊ณผ ๊ด€๋ จ๋จ)
  7. ์ด์™€ ๊ฐ™์€ ํ† ๋ก ์„์œ„ํ•œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ

๊ทธ๋ž˜์„œ ์ด๊ฒƒ์ด ์ œ๊ฐ€ ๊ตญ๊ฐ€ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ๋•Œ์ฃผ์˜ํ•˜๋Š” ์ ์ž…๋‹ˆ๋‹ค. Redux๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ƒ์ž๋ฅผ ์„ ํƒํ•˜์—ฌ ์Šน์ž์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” Redux๋ฅผ ๊ฝค ์ž˜ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ํด๋ผ์ด์–ธํŠธ ์ธก js ์˜์—ญ์—์„œ ์นจ์ฐฉํ•˜๊ฒŒ ์ˆจ์„ ์‰ฌ๊ฒŒ ํ•œ ์ฒซ ๋ฒˆ์งธ ์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‚ดํŽด๋ณธ ๊ฐ€์žฅ ์ฃผ๋ชฉํ• ๋งŒํ•œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋Š” SAM ํŒจํ„ด (_ ๋งˆ์ธ๋“œ ์…‹์— ๋“ค์–ด๊ฐ€๊ธฐ๊ฐ€ ์–ด๋ ต๊ณ  ๋„๊ตฌ๊ฐ€ ์—†์Œ _) ๋ฐ Mobx (_ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ €์žฅ์†Œ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Œ _)์ž…๋‹ˆ๋‹ค.

๋‘˜ ๋‹ค ๋‹จ์ผ ์†Œ์Šค์˜ ์ง„์‹ค์ด๋ผ๋Š” ์ƒ๊ฐ์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ๋“ค์ด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ๋ณด๋Š” ๊ฒƒ์ด ํฅ๋ฏธ ๋กญ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Mobx์— ๋Œ€ํ•œ ๋‚˜์˜ (๋ฌผ๋ก  ์ œํ•œ์ ) ์—ฐ๊ตฌ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Mobx (Redux์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ)๋Š” ๋‹จ์ผ ์†Œ์Šค ์†Œ์Šค๋ฅผ ์˜นํ˜ธํ•˜์ง€๋งŒ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ์†์„ฑ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ด ๊ฐœ๋…์€ ์ „์ฒด์ ์œผ๋กœ redux ๋ฐ flux์™€์˜ ์ฐจ์ด์ ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    1. Mobx๋Š” ๋˜ํ•œ ํ•˜์œ„ ์ƒ์  (_ ์ค‘์ฒฉ / ๊ธ€๋กœ๋ฒŒ ๋‹จ์ผ์˜ ์ผ๋ถ€ _)์„ ์˜นํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ ์ธก ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ํก์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—๋„ ์Šคํ‚ค๋งˆ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•ฝ๊ฐ„ ์งœ์ฆ์ด๋‚ฉ๋‹ˆ๋‹ค. redux-orm ์™€ ์œ ์‚ฌ์ ์ด ๋ณด์ž…๋‹ˆ๋‹ค. AFAIK ํ•˜์œ„ ์ €์žฅ์†Œ๋Š” ์†Œํ’ˆ์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค (์ด๋ ‡๊ฒŒํ•˜๋ฉด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ƒํƒœ๋ฅผ ์†Œํ’ˆ์— ๋งคํ•‘ํ•˜๊ฑฐ๋‚˜ ์ „์—ญ ํŠธ๋ฆฌ์˜ ํŠน์ • ํ‚ค์— ์˜์กดํ•˜์ง€ ์•Š์Œ). ๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ผ ์†์„ฑ์„ ์ „๋‹ฌํ•˜๋ฉด "์†์„ฑ"์— ๋Œ€ํ•œ ๋‚ด ์ƒ๊ฐ์ด ๊นจ์ง‘๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ์— ํ•„์š”ํ•œ ๋‚ด์šฉ์„ ์„ค๋ช…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ React propTypes ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌ๋˜๋Š” ์ƒ์ ์˜ ๋ชจ์–‘์„ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ €์žฅ์†Œ ๋ฐ ํ•˜์œ„ ์ €์žฅ์†Œ๋ฅผ ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ •๊ทœํ™”์—†์ด ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต๊ธ‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋Š” ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

  2. ๋ณ€๊ฒฝ๋œ ์ƒํƒœ์˜ ์Šค๋ƒ… ์ƒท์„ ์ฐ์–ด ๊ธฐ๋ก ๋ฐ ์‹คํ–‰ ์ทจ์†Œ / ๋‹ค์‹œ ์‹คํ–‰์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง๋ ฌํ™” ๊ธฐ, ์ง๋ ฌํ™” ๊ธฐ ํ•ด์ œ๊ธฐ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/mobxjs/mobx-reactive2015-demo/blob/master/src/stores/time.js
  3. serializer ์ž‘์„ฑ์˜ ์ข‹์€ ์ ์€ ํ•ญ๋ชฉ์„ ์ƒ๋žต ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋น„ ์˜๊ตฌ์  ์ธ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ์— ์ข‹์€ ์žฅ์†Œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ง๋ ฌํ™”ํ•˜๋ฉด ๋ฌด์‹œํ•˜๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋‹จ๊ณ„๋กœ ๊ฐ€๋“ ์ฐฌ ๋‹ค์‹œ ์‹คํ–‰ / ์‹คํ–‰ ์ทจ์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  4. Mobx๋Š” reselect + connect ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€๋Š” ๋ฐ˜๋Œ€๋กœ (์Šคํ† ์–ด์˜ ๋ฐฉ๋ฒ•์œผ๋กœ) ์Šคํ† ์–ด์— ๋ฐ์ดํ„ฐ ํŒŒ์ƒ๋ฌผ์„ ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ์„ ์˜นํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋‹ค์†Œ ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  5. ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด mobx๋Š” ํšจ์œจ์ ์ธ ์ˆœ์ˆ˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†์„ฑ์˜ ์–•์€ ๋น„๊ต๋Š” ์–ด์จŒ๋“  ๋‚ด์šฉ์„ ๊ด€์ฐฐ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

SAM๊ณผ Redux๋ฅผ ๋น„๊ตํ•˜๋ฉด ๋…ผ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ๋ฅด๋Š” ์ง€ ์ƒ๊ฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  1. Redux :

    1. ์ƒ์  ์ •์˜

    2. ์ƒ์  ๋ณ€๊ฒฝ (๊ฐ์†Œ ๊ธฐ)์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜ ์ •์˜

    3. ๋ชจ๋“  ์ƒ์  ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ (redux ์ž‘์—…) ์‹๋ณ„์ž (redux ์ž‘์—… ์œ ํ˜•)๋ฅผ ์ •์˜ํ•˜๊ณ  ์ผ์น˜ ํ•  ๋•Œ ํŠน์ • ๊ฐ์†๊ธฐ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    4. ์ €์žฅ์†Œ๋ฅผ ๊ตฌ์„ฑ ์š”์†Œ ์ปจํ…Œ์ด๋„ˆ ์†์„ฑ์— ๋งคํ•‘ํ•˜๊ณ , ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ (ํด๋ฆญ, ์œ ํ˜•, ์Šคํฌ๋กค ๋“ฑ) ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ / ๋””์ŠคํŒจ์น˜ ์ž‘์—…์„ ๋‹จ์ˆœํžˆ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

    5. ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ชจ๋“  ๊ฐ์†๊ธฐ์™€ ์ผ์น˜ํ•˜๋Š” ์ด๋ฒคํŠธ (redux ์ž‘์—…)๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    6. ์ƒˆ ์ƒํƒœ๋กœ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

  2. SAM :

    1. ์ƒ์ ์„ ์ •์˜ํ•˜์‹ญ์‹œ์˜ค.

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

    3. ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์„ ๋ฐ›์•„๋“ค์ด๊ณ  ๋ณ€ํ™˜ (redux ๊ฐ์†๊ธฐ ๋Œ€์‹ )ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  ๋ณ€ํ™˜ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” setter๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ์ด์ œ ์ƒ์ ์˜ ๋ชจ์–‘์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ „๋‹ฌ ๋œ ๋ฐ์ดํ„ฐ ๋งŒ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

    5. ์ฐธ๊ณ  : ์•ก์…˜ ๋””์ŠคํŒจ์น˜, ๋ฆฌ๋“€์„œ์˜ ์ง์„  ์ „๋‹ฌ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ redux, SAM ๋ฐ Mobx๋Š” ๋ชจ๋‘ ์ƒํƒœ๋ฅผ ํ•œ๊ณณ์— ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์ดํ•˜๋Š” ๋ฐฉ์‹์€ ๊ทธ๋“ค ์ž์‹ ์˜ ์ขŒ์ ˆ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ์ง€๊ธˆ๊นŒ์ง€ redux์™€ ์ƒํƒœ๊ณ„๋ฅผ ์ด๊ธธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

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

์—ฌ๋Ÿฌ๋ถ„ ์ด Erik Meijer์˜์ด ๊ธฐ์‚ฌ๋ฅผ ์ฝ์—ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์ธ์šฉ๋ฌธ :

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

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

์ด ๊ธฐ์‚ฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์œ ๋ฆฌํ•˜๊ฒŒ ์ฃผ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Erik Meijer๋Š” "์ด ๋ถˆ๋ณ€์„ฑ ๋„Œ์„ผ์Šค"๋ฅผ ์žฌ๊ฒ€ํ†  ํ•˜๊ณ ์ด๋ฅผ ์™„์ „ํžˆ ์ˆ˜์šฉํ•ฉ๋‹ˆ๋‹ค . ๊ทธ๋Š” ์ƒํƒœ ๋ณ€์ด๋ฅผ ์ œ๊ฑฐ ํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ ์ธ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„ ์ด๋ฉฐ ๊ทผ๋ณธ์ ์ด์ง€๋งŒ ์ถฉ๋ถ„ํ•˜์ง€๋Š” ์•Š๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ์˜ ๊ถ๊ทน์  ์ธ ๋ชฉํ‘œ๋Š” ๋ชจ๋“  ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์“ธ๋ชจ ์—†๊ฒŒ ๋งŒ๋“œ๋Š” ์•”์‹œ ์  ๋ถ€์ž‘์šฉ์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (๊ด€๋ฆฌ ํ•  ์ƒํƒœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค!).

๋‚˜๋Š” Erik Meijer์˜ ์ž‘์—…์˜ ํŒฌ์ด๋ฉฐ ๊ทธ๊ฐ€ ๋งํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์—ด์‹ฌํžˆ ์ฝ๊ณ ๋“ค์„ ๊ฒƒ์ด๋ฉฐ, ๊ทธ๊ฐ€ ๋‚˜์™€ ๊ฐ™์€ ์‚ฌ์—…, ๊ธฐ์ˆ  ๋ฐ ์ง€์  ์ œ์•ฝ ํ•˜์—์„œ ์šด์˜๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง์˜ ํ•ต์‹ฌ ๋ฌธ์ œ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ• ๋‹น IS-A ๋Œ์—ฐ๋ณ€์ด๋ฅผ ๋ฏฟ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ํ• ๋‹น ๋งŒ ์ง€์›ํ•˜๋ฉฐ ๋ณ€์ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ํ•ด์„์— ๋งก๊ฒจ์ง‘๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ํ• ๋‹น์— ํ•จ์ˆ˜ ๋ž˜ํผ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ž๋™์œผ๋กœ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๋ง๋„ ์•ˆ๋ผ.

(Application) State Mutation ๋’ค์—๋Š” ์ด๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค. TLA +๋ผ๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒํ•˜๊ฒŒ๋„ ... Erik์€ TLA +๋ฅผ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

JJ-

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

๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผํ•˜๋‚˜์š”? ์ด๊ฒƒ์ด " ์ฒซ ๋ฒˆ์งธ ์›์น™ "์ ‘๊ทผ ๋ฐฉ์‹์ด ํ•„์š”ํ•œ ๋ฌธ์ œ๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

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

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

Erik์˜ haha โ€‹โ€‹์˜ˆ์ œ์— ๋Œ€ํ•ด ์›ํ•˜๋Š”๋งŒํผ ์›ƒ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
// prints Ha var ha = Ha(); var haha = ha+ha;

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ ์ž˜๋ชป๋œ ํ–‰๋™์„ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ด์ƒ๋„ ๊ทธ ์ดํ•˜๋„ ์•„๋‹™๋‹ˆ๋‹ค.

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

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

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, Erik์ด TLA +์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์ •๋ง ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. LinkedIn์—์„œ ๊ทธ์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ์งˆ๋ฌธ์„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ต์„ ์–ป์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค ... ๋žจ ํฌํŠธ ๋ฐ•์‚ฌ๊ฐ€ ํŠœ๋ง ์ƒ์„ ๋ฐ›์•˜์ง€๋งŒ ์‹œ๊ฐ„์„ ํ• ์•  ํ•  ๊ฐ€์น˜๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์†”์งํžˆ, @jdubray , ๋‹น์‹ ์€์ด ์‹œ์ ์—์„œ ๊ฒฝ๊ณ„์„  ํŠธ๋กค๋ง์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ, ๋‹ค๋ฅธ ๋ฌธ์ œ ๋ฐ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ฃผ์žฅ์„ ์ˆ˜์‹ญ ๋ฒˆ ๋ฐ˜๋ณตํ–ˆ์Šต๋‹ˆ๋‹ค. Dan๊ณผ Redux ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋ชจ์š•ํ•˜๊ณ  ์ž๊ฒฉ ์ฆ๋ช…์„ ํ”๋“ค์–ด "TLA +"์™€ "Lamport"๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๋งˆ์น˜ ์„ฑ๋ฐฐ์™€ ์ƒ๋ช…, ์šฐ์ฃผ ๋ฐ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๋‹ต์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๊ณ„์† ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ SAM์ด Redux๋ณด๋‹ค ํ›จ์”ฌ ์šฐ์›”ํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ์ง€๋งŒ, ์ฆ๊ฑฐ๋ฅผ ๋ณด์—ฌ ๋‹ฌ๋ผ๋Š” ์ˆ˜๋งŽ์€ ์ดˆ๋Œ€์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์˜๋ฏธ์žˆ๋Š” ๋น„๊ต ์•ฑ ๋ฐฉ์‹์œผ๋กœ ๋งŽ์€ ๊ฒƒ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ง€๊ธˆ๊นŒ์ง€ ์•„์ง ํ™•์‹ ํ•˜์ง€ ๋ชปํ•˜๋Š” ์‚ฌ๋žŒ์˜ ๋งˆ์Œ์„ ์ •๋ง๋กœ ๋ฐ”๊พธ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†”์งํžˆ ์ข€ ๋” ์ƒ์‚ฐ์ ์ธ ์ผ์„ํ•˜๋ฉด์„œ ์‹œ๊ฐ„์„ ๋ณด๋‚ด์‹ค ๊ฒƒ์„ ๊ถŒํ•ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์Šค๋ ˆ๋“œ๋ฅผ ๋‹ซ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ“๊ธ€์€ ๊ณ„์† ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

@markerikson ์ œ๋ชฉ์ด ์•„๋ฌด๋ฐ๋„ ๊ฐ€์ง€
@antitoxic (๋ง์žฅ๋‚œ ์˜๋„ ์—†์Œ) ์™ธ์—๋„ ๊ฐœ์ž…์œผ๋กœ ์ธํ•ด ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋‚˜๋นด๋Š”์ง€ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋” ์ด์ƒ๋“ค์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์•„ ๋งˆํฌ ๋‚ด ๋Œ“๊ธ€์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์™œ ์ด๋ ‡๊ฒŒ ํ™”๋ คํ•œ ๋Œ€ํ™”๋ฅผ ๋ง์น  ๊นŒ?

@jdubray ๋‹น์‹ ๋งŒ์ด

๋‚˜๋Š” TLA + ๋˜๋Š” ์ข‹์ง€ ์•Š์€ ๊ฒƒ์„ ๋งํ•˜์ง€ ์•Š์œผ๋ฉฐ ์•„๋งˆ๋„ ๋ฏธ๋ž˜์— ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ํŒŒ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€ ์ผ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ „ํ˜€ ๋„์›€์ด๋˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋‹น์‹ ์ด ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ์‹ ์ผ ๋ฟ์ด๋ฉฐ, ๋‹น์‹ ์˜ ์˜๊ตฌ์  ์ธ ๊ฒธ์†ํ•œ ์–ด์กฐ๋Š” TLA +์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜๋„๋ก ์ดˆ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Erik์˜ ๋…ผ๋ฌธ์€ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ๋ณ€์ด ์ƒํƒœ์™€ ๊ด€๋ จํ•˜์—ฌ ๋‹ค์†Œ ์†์ƒ๋˜์—ˆ์Œ์„ ์„ค๋“๋ ฅ์žˆ๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ๋‘๊ฐ€ ๊ทธ๊ฒƒ์— ๋™์˜ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋ชจ๋“  ๊ฒŒ์‹œ๋ฌผ์—์„œ ํ•ญ์ƒ I believe everyone agrees on that ์™€ ๊ฐ™์€ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ข‹๊ฑฐ๋‚˜, ๋„์›€์ด๋˜๊ฑฐ๋‚˜, ํ™˜์˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์€ Erik์˜ ๋…ผ๋ฌธ์„ ์ฝ์ง€ ์•Š์•˜๊ณ  ์ฝ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์„ ํ™˜์˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๋“ ํ•  ์ˆ˜์—†๊ณ , ์ „์— ๋งŽ์€ ์ข…์ด๋ฅผ ์ฝ์–ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜์ง€ ์•Š๊ณ , ๊ทธ๋“ค์ด ๋‹น์‹ ๊ณผ ๋™์˜ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋™์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ์ฒญํ•˜๊ฒŒ ๋Š๋ผ๊ฒŒํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์˜ ์•„์ด๋””์–ด๋ฅผ ์ „ํŒŒํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TLA +๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ง€๊ตฌ๊ฐ€ ํ‰ํ‰ํ•˜๊ณ  ์šฐ์ฃผ์„ ์„ ์กฐ์ข…ํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ์–ด๋ ค์› ๋‹ค ๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ๋‹ฌ์— ๋กœ์ผ“์„ ๋ณด๋‚ด๋ ค๊ณ ํ–ˆ๋‹ค๊ณ  ๋ถˆํ‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ™•์‹คํžˆ ์ฒซ ๋ฒˆ์งธ ์›์น™์ด ์•„๋‹Œ ๋น„์œ ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ง„์ง€ํ•˜๊ฒŒ, ๋‹น์‹ ์€์ด ์ง„์ˆ ์ด "ํฅ๋ฏธ๋กœ์šด ํ† ๋ก "์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

TLA +์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ด€์‹ฌ์„ ๋…์ ํ•˜๊ณ  ์‹ค์ œ๋กœ TLA +์— ๊ด€์‹ฌ์ด์—†๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋” ๊ตฌ์ฒด์ ์ธ ๋ฌด์–ธ๊ฐ€๋กœ ๋‹ฌ์— ๋กœ์ผ“์„ ๋ณด๋‚ด๋ ค๊ณ ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ๋•Œ๋ฌธ์— ๋…ผ์˜๊ฐ€ ์‹ค์ œ๋กœ ๋” ํ™”๋ คํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ Redux์ฒ˜๋Ÿผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ TLA +๊ฐ€ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹จ์ง€ ์ž˜๋ชป๋œ ๋ฐฉ์‹์œผ๋กœ ์ž˜๋ชป๋œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Erik์ด ๋‹น์‹ ์—๊ฒŒ ๋Œ€๋‹ตํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๊ทธ๊ฐ€ ๋‹น์‹ ์„ ์ดํ•ดํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ผ๊นŒ์š”? ์–ด์ฉŒ๋ฉด ๋‹น์‹ ์€ ๋žจ ํฌํŠธ๋งŒ์ด ๋‹น์‹ ์„ ์ดํ•ดํ•  ์ˆ˜์žˆ์„ ์ •๋„๋กœ ์˜๋ฆฌํ•œ๊ฐ€? ์–ด์ฉŒ๋ฉด ๋ฏธ๋ž˜์— ํŠœ๋ง ์ƒ์„๋ฐ›์„ ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ํ™•์‹คํ•œ ๊ฒƒ์€ ํ˜„์žฌ ํ† ๋ก ์ด ํ…Œ์ด๋ธ”์— ์•„๋ฌด๊ฒƒ๋„ ๊ฐ€์ ธ ์˜ค์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@gaearon์„ ์ข‹์•„ํ•˜๊ณ  egghead ์šฉ TLA + / SAM ๋น„๋””์˜ค ์ž์Šต์„œ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 2 ์‹œ๊ฐ„ ๋ฏธ๋งŒ์˜ ๋™์˜์ƒ์—์„œ ๋งค์šฐ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์•„์ด๋””์–ด๋ฅผ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ๊ณ  ๋งˆ์ง€๋ง‰์— ํŒจํ„ด์ด ํด๋ฆญํ•˜๊ณ  ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์œ ์šฉํ•˜๋‹ค๊ณ  ๋Š๋ผ๋ฉด ์Šน๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Redux๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๊ทธ๋ ‡๊ฒŒํ–ˆ์Šต๋‹ˆ๋‹ค. SAM / TLA +๊ฐ€ Redux๋ณด๋‹ค ๋‚˜์€ ์ด์œ ๋ฅผ ์ด๋ก ์ ์œผ๋กœ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋งŒ "์‹œ๋„"ํ•˜๊ณ  ๋”์ฐํ•œ TodoMVC ๊ตฌํ˜„์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ CS ์—ฐ๊ตฌ์ž์ด๋ฉฐ ์ฝ˜ํฌ๋ฆฌํŠธ ์žฌ๋ฃŒ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Redux๋กœ ์ž‘์„ฑ๋œ ์•ฑ๊ณผ SAM์œผ๋กœ ์ž‘์„ฑ๋œ ์•ฑ์„ ๋ณด์—ฌ ์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ SAM ๊ตฌํ˜„์ด ๋” ๋‚ซ๋‹ค๊ณ  ๋Š๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ทธ๋ ‡์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@Niondir ์ƒํƒœ๋ฅผ ๋ณต๊ตฌํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ sagas๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„
๋”ฐ๋ผ์•ผ ํ•  ํŒจํ„ด์ด๋‚˜ ๊ทœ์น™์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

  • ๊ฐ๊ฐ ํ•˜๋‚˜์˜ put ์ด์ƒ์ด ์—†๋„๋ก sagas๋ฅผ ๋ถ„๋ฆฌํ•˜์‹ญ์‹œ์˜ค. put ์ด์ƒ์˜ ์‚ฌ๊ฐ€๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋ถ„ํ• ํ•˜๊ณ  call ํšจ๊ณผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ
function* mySaga() {
  yield put(action1());
  yield put(action2());
}

// split into

function* mySaga() {
  yield put(action1());
  yield call(myNextSaga);
}

function* myNextSaga() {
  yield put(action2());
}
  • take ํšจ๊ณผ๊ฐ€์žˆ๋Š” ์‚ฌ๊ฐ€๋Š” take ์™€ ์‚ฌ๊ฐ€์˜ ์‹œ์ž‘์ ์„ ๋”ฐ๋ฅด๋Š” ๋…ผ๋ฆฌ๋กœ ๋ถ„ํ• ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ
function* mySaga() {
  yield take(ACTION);
  // logic
}

// split it into

function* rootSaga() {
  yield takeLatest(ACTION, mySaga);
}

function* mySaga() {
  // logic
}
  • ๊ฐ ์‚ฌ๊ฐ€์— ๋Œ€ํ•ด ์ผ์ข…์˜ "์ฒดํฌ ํฌ์ธํŠธ"๊ธฐ๋Šฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ดˆ๊ธฐํ™”์‹œ ์ƒํƒœ์—์„œ ์ฝ๊ณ  ๊ฑฐ๊ธฐ์—์„œ call ํ•„์š”ํ•œ ์‚ฌ๊ฐ€๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
function* rootSaga() {
  // emit all forks and take effects that need to run in the background
  yield call(recoverCheckpoint);
}

function* recoverCheckpoint() {
  const state = yield select();
  if (state.isFetching) {
    // run the saga that left the state like this
  }
}

์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์‹ค ์ธ ์ผ๋ จ์˜ ๊ฐ€์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•ฉ๋‹ˆ๋‹ค.

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

์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ๊ฐ€๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ฒƒ๋„ ๊ธ์ •์  ์ธ ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Sagas๋Š” ๋” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • Sagas๋Š” ๋” ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค
  • Sagas๋Š” ์ดํ•ดํ•˜๊ธฐ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ @slorber :

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด์ด "๋‚š์‹œ ๊ฒŒ์ž„"์ƒ˜ํ”Œ์ด ๋™์  ์ƒํƒœ ํ‘œํ˜„ ๋ฐ "๋‹ค์Œ ์ž‘์—… ์กฐ๊ฑด ์ž"๋ฅผ ํฌํ•จํ•˜์—ฌ SAM์ด ์ „์ฒด์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์ง์ ‘ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋”ฉ์— ๋งค์šฐ ํฅ๋ฏธ ๋กญ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. NAP๋Š” Sagas์˜ ํ•„์š”์„ฑ์„ ์™„ํ™”ํ•˜๊ณ  ๋‹จ์ผ ์ƒํƒœ ํŠธ๋ฆฌ ์ธ Redux ์›์น™ # 1์„ ์œ„๋ฐ˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ œ๊ฐ€ ๋ฌด์—‡์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ€๋” Ableton Live๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ "Ableton Live GUI๋ฅผ React / Redux ์•ฑ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ• ๊นŒ์š”?"๋ผ๋Š” ์ƒ๊ฐ์ด ๋–  ์˜ค๋ฆ…๋‹ˆ๋‹ค. ๋Œ€๋‹ต์€ '์•„๋‹ˆ์˜ค'๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•œ ์„ฑ๋Šฅ์„ ์–ป๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Qt๋กœ ์ž‘์„ฑ๋œ ์ด์œ ์™€ Qt์— ์‹ ํ˜ธ / ์Šฌ๋กฏ ์•„ํ‚คํ…์ฒ˜๊ฐ€์žˆ๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Meteor์™€ ํ•จ๊ป˜ React / Redux๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ์— ๋Œ€ํ•œ Redux ์ž‘์—…์„ Mongo.Collection.observeChanges ์— ๋””์ŠคํŒจ์น˜ํ•˜์—ฌ Mongo ๋ฌธ์„œ๋ฅผ Immutable.js ์ƒํƒœ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ฌธ์„œ๋ฅผ ๊ตฌ๋… ํ•  ๋•Œ Meteor๊ฐ€ ์ดˆ๊ธฐ ๊ตฌ๋… ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ณด๋‚ด๋ฉด์„œ ์ˆ˜์ฒœ ๊ฐœ์˜ Redux ์ž‘์—…์ด ๋ฐœ์†ก๋˜์–ด ์ˆ˜์ฒœ ๊ฐœ์˜ Immutable.js ์ž‘์—…๊ณผ ์ˆ˜์ฒœ ๊ฐœ์˜ rerenders๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋ฐœ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— UI๊ฐ€ ์‹œ์ž‘์‹œ ๋งค์šฐ ๋Š๋ฆฌ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ. ํ™•์‹คํ•˜์ง€๋Š” ์•Š์ง€๋งŒ RethinkDB๋„ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

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

@ jedwards1211 ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋งŽ์€ ์ž‘์€ ๋ฉ”์‹œ์ง€).

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

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

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” "๊ฐ€์ง€"๋ฅผ ๋งŒ๋“œ๋Š” ์•„์ด๋””์–ด๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ผ ์ƒ์  ์›์น™์„ ์™„์ „ํžˆ ๋ฌด์‹œํ•˜์ง€๋งŒ ์ข‹์€ ํƒ€ํ˜‘์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

https://github.com/stephenbunch/redux-branch

@ jedwards1211 ์•ฑ์ด ๋ณต์žก ํ•ด์ง์— ๋”ฐ๋ผ ๊ฒฐ๊ตญ ํŠน์ • ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ์™€ ํŠน์ • ์œ ํ˜•์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ํŠน์ • ์ €์žฅ์†Œ๊ฐ€ ์ „์ฒด ๋ถ€ํ•˜๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋„๋กํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

๋”ฐ๋ผ์„œ ํŒŒ์ด๋ฒ„ ์•„ํ‚คํ…์ฒ˜๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ์ž‘์—… ํŒจํ‚ท์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ์ˆ˜ํ–‰์ค‘์ธ ์ž‘์—…์— ๋”ฐ๋ผ ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ ์—…๋ฐ์ดํŠธ๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์ค‘๋‹จ๋˜์ง€ ์•Š๋„๋ก ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์œผ๋ฉฐ ๋Š๋ฆฐ ๊ธฐ๊ณ„์  ์—…๋ฐ์ดํŠธ๋Š” ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์Šต๋‹ˆ๋‹ค.

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

์˜ค๋Š˜ ๋ณต์žกํ•œ ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋ช‡ ๊ฐœ์˜ ๋‹ค๋ฅธ ์Šคํ† ์–ด์—์„œ ์ง€์›ํ•˜๋Š” Redux์™€ ๊ฐ™์€ ์ตœ์ƒ์œ„ ์Šคํ† ์–ด ํด๋ž˜์Šค๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ€์ถฉ:

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

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

@jsonnull ์ €๋Š” ์ƒ์ ์— ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ƒํƒœ๋Š” ํ•ญ์ƒ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ด์ƒ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ƒํƒœ๊ฐ€ ์™„์ „ํžˆ ์ ํ•ฉํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ์•„์ด๋””์–ด๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

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

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

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


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

  • ์ผ๋ฐ˜์ ์œผ๋กœ ํ‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์ž„์„ ๊ตฌ๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์‹œ๊ฐ„์€ 0์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”์–ด ๊ฒŒ์ž„ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์บ”๋ฒ„์Šค ๋˜๋Š” ๋กœ์ปฌ ์ƒํƒœ๊ฐ€์—†๋Š” WebGL์—์„œ ์ˆ˜ํ–‰ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ํ‹ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ์ž‘ ์‹œ๊ฐ„๊ณผ ์ง„ํ–‰๋ฅ ์„ ๊ธฐ์ค€์œผ๋กœํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ : ์Šคํ”„๋ผ์ดํŠธ ์บ๋ฆญํ„ฐ๋Š” 10 ๊ฐœ์˜ ํ”„๋ ˆ์ž„์œผ๋กœ ๊ตฌ์„ฑ๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ 400ms ์ด์ƒ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์žฌ์ƒํ•˜๋ ค๊ณ ํ•˜๋ฏ€๋กœ 2 ํ‹ฑ ์ •๋„๋งˆ๋‹ค ๊ทธ๋ ค์ง€๋Š” ์Šคํ”„๋ผ์ดํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋” ๋†’์€ ํ•ด์ƒ๋„๋ฅผ ์›ํ•œ๋‹ค๋ฉด ํ‹ฑ์ด ํƒ€์ž„ ์Šคํƒฌํ”„๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฒŒ์ž„์ด ์ผ์‹œ ์ค‘์ง€ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ๊ฒฝ์šฐ React UI ์ธก์—์„œ ์ˆ˜ํ–‰ ๋œ ์ผ๋ถ€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ค‘์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์ผ๋ฐ˜์ ์œผ๋กœ Redux๋ฅผ ํ†ตํ•ด ์‹œ์ž‘ / ์ค‘์ง€ ์‹œ๊ฐ„์„ ์ „๋‹ฌํ•˜๊ณ  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‚˜๋จธ์ง€ ์ƒํƒœ๋ฅผ ๋กœ์ปฌ๋กœ ์œ ์ง€ํ•˜๋„๋กํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฒŒ์ž„์—๋งŒ ์ ์šฉ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. React๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์ดํŠธ์—์„œ ์ผ๋ จ์˜ ์žฅ๊ธฐ ์‹คํ–‰ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ํ™•์žฅ ๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œํ€€์Šค๊ฐ€์ด๋ฅผ ํ†ต๊ณผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jsonnull ๋ฉ‹์ง€๋„ค์š” , ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

var user = {id: 'user1', posts: [], comments: []}
var post = {id: 'post1', user: user, comments: []}
user.posts.push(post);
var comment = {id: 'comment1', post: post, user: user}
post.coments.push(comment)
user.comments.push(comment)
appState.user = user

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

@bgnorlov ๋‚˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค redux ๋‹น์‹ ์— ๋Œ€ํ•ด ์–˜๊ธฐ์ฒ˜๋Ÿผ ํŒจํ‚ค์ง€๋ฅผ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค - ๊ทธ๋“ค์€ ๋‹จ์ง€ ๋” ์–ด๋ ค์›Œ ๋ณต์ œ ํ•  ์ˆ˜ ์žˆ๋„๋ก state ๋‹น์‹ ์˜ ๊ฐ์†๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ™•์‹คํ•˜์ง€๋Š” ์•Š์ง€๋งŒ Immutable.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒฝ์šฐ ์ˆœํ™˜ ์ฐธ์กฐ๋กœ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™ธ๋ž˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ redux ์ƒํƒœ์˜ ๊ด€๊ณ„๋ฅผ ๋ชจ๋ธ๋ง ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ORM๊ณผ ์œ ์‚ฌํ•œ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ํŽธ๋ฆฌํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

var user = {id: 'user1', postIds: [], commentIds: []}
var post = {id: 'post1', userId: user.id, commentIds: []}
user.postIds.push(post.id);
var comment = {id: 'comment1', postId: post.id, userId: user.id}
post.commentIds.push(comment.id)
user.commentIds.push(comment.id)
appState.userId = user.id
appState.posts = {[post.id]: post}
appState.comments = {[comment.id]: comment}

// then join things like so:
var postsWithComments = _.map(appState.posts, post => ({
  ...post,
  comments: post.commentIds.map(id => appState.comments[id]),
})

@ jedwards1211 ์„ ์‚ฌ์šฉํ•˜์—ฌ redux์—์„œ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๋ณต์ œํ•˜๋ ค๋ฉด ๊ฐ์†๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ์˜ํ–ฅ์„๋ฐ›์€ ๊ฐ์ฒด์˜ ๋ชจ๋“  ์ƒˆ ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ด€๋ จ ๊ฐœ์ฒด๋„ ์ƒˆ ๋ณต์‚ฌ๋ณธ์ด์–ด์•ผํ•˜๋ฉฐ ์ด๋Š” ๋ฐ˜๋ณต์  ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ˜๋ณต๋˜๋ฉฐ ๋ชจ๋“  ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Immutable.js๋Š” ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์ผ๋ถ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ ์ •๊ทœํ™” ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ „์—ญ ์ƒํƒœ์—์„œ ID๋กœ ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋งˆ๋‹ค ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด-์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์–ด๋”˜๊ฐ€์—์„œ ์ž‘์—… ํ˜•์ œ๋ฅผ ํ•„ํ„ฐ๋งํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์ž‘์—…์€ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ). redux๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ฑ ์ƒํƒœ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ์ฝํฌ๋ฅผ ๋ฐœ์†กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

var prevTask = dispatch((_, getState)=>getState().tables.tasks[task.parentId]).children.map(childId=>dispatch((_, getState)=>getState().tables.tasks[childId])).filter(task=>...) [0]

๋˜๋Š” ์„ ํƒ์ž์™€ ํ•จ๊ป˜

var prevTask = dispatch(getTaskById(task.parentId)).children.map(childId=>dispatch(getTaskById(childId)).filter(task=>...)[0]

์ด ์ƒ์šฉ๊ตฌ๋Š” ์ฝ”๋“œ๋ฅผ mobx ๋ฒ„์ „๊ณผ ๋น„๊ตํ•˜์—ฌ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

var prevTask = task.parent.children.filter(task=>...)[0]

@ jedwards1211 , @bgnorlov : FWIW, ์ด๊ฒƒ์ด ์ œ๊ฐ€ Redux-ORM์„ ์ข‹์•„ํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Redux ์Šคํ† ์–ด๋ฅผ ์ •๊ทœํ™” ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ด€๊ณ„ํ˜• ์—…๋ฐ์ดํŠธ ๋ฐ ์กฐํšŒ๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋งˆ์ง€๋ง‰ ์˜ˆ์ œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Redux-ORM๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ Redux-ORM ๊ธฐ๋ณธ ์‚ฌํ•ญ ๊ณผ ํ•ต์‹ฌ ๊ฐœ๋… ๋ฐ ๊ณ ๊ธ‰ ์‚ฌ์šฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” ๋ช‡ ๊ฐœ์˜ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@markerikson ๋ฉ‹์ง€๋‹ค, ํŒ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@gaearon

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

์ด ์˜๊ฒฌ์ด ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํŒŒํ‹ฐ์— ๋Šฆ์—ˆ๋‹ค๋Š” ๊ฑด ์•Œ์ง€๋งŒ ๊ทธ๊ฒŒ ๋‚ด ์š”์ ์˜ ์ผ๋ถ€์ผ์ง€๋„ ๋ชฐ๋ผ ๊ทธ ๋Œ“๊ธ€์ด ๊ฒŒ์‹œ ๋œ ์ง€ 1 ๋…„์ด ๋„˜์—ˆ๊ณ ์ด ์•„์ด๋””์–ด๊ฐ€ ํ‘œํ˜„ ๋œ ์œ ์ผํ•œ ๊ณณ์€ ์ด๊ณณ๋ฟ์ž…๋‹ˆ๋‹ค.

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

@leff ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์ •ํ™•ํ•œ ์•„์ด๋””์–ด๋ฅผ ์–ผ๋งˆ ์ „์— ํ•ฉ์„ฑํ–ˆ์ง€๋งŒ ์ถฉ๋ถ„ํžˆ ์–ธ๊ธ‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ก ๊ด€๋ฆฌ์— Redux๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ Redux ์Šคํƒ€์ผ์˜ ์ƒํƒœ ๊ด€๋ฆฌ์— ๋ถ€๋‹ด์„์ฃผ์ง€ ์•Š์•„๋„๋˜๋Š” ๋งŽ์€ ์ž„์‹œ ์ƒํƒœ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

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

@bgnorlov ๋Š” Immutable.js๋กœ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ข‹์€ ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ข‹์€ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

FWIW, ๋ฌธ์„œ๋Š” http://redux.js.org/docs/faq/OrganizingState.html#organizing -state-only-redux-state์— ๋”ฐ๋ผ ๋ชจ๋“  ๊ฒƒ์ด Redux๋กœ ์ด๋™ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ์ง€์ ํ•ฉ๋‹ˆ๋‹ค.

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

ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด ์‚ฌ๋žŒ๋“ค์ด ๋ฌธ์„œ ๊ฐœ์„ ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด PR์„ ์ „์ ์œผ๋กœ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. :)

๋ฆฌ๋“€์„œ๋ฅผ ์žฌ์‚ฌ์šฉํ•ด์•ผํ•˜๊ณ  redux ์ƒํƒœ์—์„œ "ํ•˜์œ„ ์ƒํƒœ"๋ฅผ ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ํ•  ์ˆ˜์žˆ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค (React ํ†ตํ•ฉ ํฌํ•จ).

https://github.com/eloytoro/react-redux-uuid

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

@eloytoro ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์“ฐ๋ ค๊ณ  ํ–ˆ์–ด์š”. ์ฐธ๊ณ  ํ•ด์ฃผ์…”์„œ ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@ jedwards1211 ๋‚˜๋Š” ๋‹น์‹ ์ด ์ž˜๋ชป๋œ ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ œ 3 ์ž ๋ฆฌ๋“€์„œ ๋‚˜ ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ ํ•œ ์ ์€ ์—†์ง€๋งŒ, ๋‚ด ์Šค ๋‹ˆํŽซ์ด ๋ฆฌ๋“€์„œ๋ฅผ ๋™์  ํฌ๊ธฐ์˜ ์ปฌ๋ ‰์…˜์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ ์ฃผ๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

@avesus ๊ฐ€ ๋‹น์‹ ์„ ์œ„ํ•ด ์ผํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@eloytoro ์•„, ๋” ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‹จ์ผ ์ƒํƒœ๊ฐ€ ํ•ญ์ƒ ๋” ์ข‹์ง€๋งŒ ๊ณผ๋„ํ•˜๊ฒŒํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋ชจ๋“  keyDown ()์„ ์ €์žฅ์†Œ๋ฅผ ํ†ตํ•ด ๋‹ค์‹œ๋ณด๊ธฐ๋กœ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์€ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ์‹œ์ ์ธ ์ƒํƒœ๋Š” ๋กœ์ปฌ ๊ตฌ์„ฑ ์š”์†Œ ์ƒํƒœ (์˜ˆ : React 's)์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” redux์™€ ๋ฐ˜์‘์ด ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ์›น์— ๋ถˆ์„ ๋ถ™ ์˜€๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด์ง€์—์„œ ์ข‹์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์–‘์ด ๊ฐ์†Œํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@ mib32 ๋‹น์‹ ์ด

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