Flux

Facebook ์—์„œ ํด๋ผ์ด์–ธํŠธ-์‚ฌ์ด๋“œ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„์ผ€ํ…์ฒ˜์ด๋‹ค.

์ด๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ํ™œ์šฉํ•˜์—ฌ ๋ทฐ ์ปดํผ๋„ŒํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” React ๋ฅผ ๋ณด์•ˆํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

Flux ๊ตฌ์„ฑ

Flux ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์„ธ๊ฐ€์ง€ ํ•ต์‹ฌ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • Dispatcher
  • Stores
  • Views (React Component)

์œ„ ์„ธ ์š”์†Œ๋Š” ๊ธฐ์กด MVC (Model - View - Controller) ๊ตฌ์กฐ์™€๋Š” ๋‹ค๋ฅด๋ฉฐ MVC ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅธ๋‹ค.

React View ์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•  ๋•Œ, ํ•ด๋‹น View ๋Š” ์ค‘์•™์˜ Dispather ๋ฅผ ํ†ตํ•ด Action ์„ ์ „ํŒŒํ•˜๊ฒŒ ๋œ๋‹ค.

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ์ดํ„ฐ์™€ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Store ๋Š” Action ์ด ์ „ํŒŒ๋˜๋ฉด ์ด Action ์— ์˜ํ–ฅ๋ฒ”์œ„์— ์žˆ๋Š” ๋ชจ๋“  View ๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.

์ฆ‰ View ๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ฐฑ์‹ ํ•ด์•ผ ๋˜๋Š”์ง€ ์ผ์ผ์ด ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ์„œ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ์—์„œ ํŽธ๋ฆฌํ•˜๋‹ค.

Flux ๋Š” Store ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ œ์–ด๋ฅผ ์™„์ „ํžˆ ๋’ค์ง‘์—ˆ๋‹ค.
์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ช…๋ชฉ์œผ๋กœ ์™ธ๋ถ€์˜ ๊ฐฑ์‹ ์— ์˜์กดํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ Store ๋Š” ๊ฐฑ์‹ ์„ ๋ฐ›์•„๋“ค์ด๊ณ  ์ ์ ˆํžˆ ์กฐํ™”ํ•œ๋‹ค.

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

Store ๋Š” ๋…๋ฆฝ๋œ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ง์ ‘์ ์ธ setter() ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋Š” ๋Œ€์‹  Dispather ์— ๋“ฑ๋กํ•œ ์ฝœ๋ฐฑ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ฒŒ๋œ๋‹ค.

๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„

Flux ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ๋Š” ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅธ๋‹ค.

Flux ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„ 1

๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์€ Flux ํŒจํ„ด์˜ ํ•ต์‹ฌ์ธ๋ฐ Flux ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ œ์ผ ๋ฉ˜ํƒˆ ๋ชจ๋ธ์ด ๋œ๋‹ค.

Dispather, Store, View ๋Š” ๋…๋ฆฝ์ ์ธ ๋…ธ๋“œ๋กœ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์ด ์™„์ „ํžˆ ๊ตฌ๋ถ„๋œ๋‹ค.
Action ์€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ์ž‡๋Š” ๊ฐ„๋‹จํ•œ ๊ฐ์ฒด๋กœ Type ํ”„๋กœํ”„ํ‹ฐ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

Flux ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„ 2

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

Flux ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„ 3

Action Creator ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” Helper ๋ฉ”์„œ๋“œ๋กœ ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ Action ์„ ์ƒ์„ฑํ•˜๊ณ  Type ์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ Dispather ์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๋ชจ๋“  Action ์€ Store ๊ฐ€ Dispather ์— ๋“ฑ๋กํ•ด๋‘” ์ฝœ๋ฐฑ์„ ํ†ตํ•ด ๋ชจ๋“  Store ์— ์ „์†ก๋œ๋‹ค.

Action ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ Store ๊ฐ€ ์Šค์Šค๋กœ ๊ฐฑ์‹ ์„ ํ•œ ๋‹ค์Œ์—๋Š” ์ž์‹ ์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ๋ชจ๋‘์—๊ฒŒ ์•Œ๋ฆฐ๋‹ค.

Controller-View ๊ฐ€ ๋ณ€๊ฒฝ์ด๋ฒคํŠธ๋ฅผ ๋“ฃ๊ณ  ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ Store ์—์„œ ๊ฐ€์ ธ์˜จ ํ›„ ๋ชจ๋“  ํŠธ๋ฆฌ์— ์žˆ๋Š” ์ž์‹๋ทฐ์—๊ฒŒ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

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

์ด์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋Š” ์šฐ๋ฆฌ์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•จ์ˆ˜ํ˜• ๋ฐ˜์‘ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Functional Reactive Programming) ์ด๋‚˜ ๋” ์„ธ๋ถ€์ ์œผ๋กœ ๋ฐ์ดํ„ฐ-ํ๋ฆ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Data-Flow Programming) ๋˜๋Š” ํ๋ฆ„ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Flow-based Programming) ์„ ์—ฐ์ƒํ•˜๊ฒŒ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์‰ฝ๊ฒŒ ๋– ์˜ฌ๋ฆฌ๊ฒŒ ํ•œ๋‹ค.
์ฆ‰ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์ด ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์ด ์•„๋‹Œ ๋‹จ์ผ ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅธ๋‹ค.
์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋Š” store์— ์˜ํ•ด ๊ด€๋ฆฌ๋ฅผ ํ•ด์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„๋“ค๊ณผ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ทนํžˆ ๋‚ฎ์ถ˜ ์ƒํƒœ๋กœ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋‹ค.
Store ์˜ ์‚ฌ์ด์—์„œ ์˜์กด์„ฑ์ด ์ƒ๊ธด๋‹ค๊ณ  ํ•ด๋„ Dispachter ์— ์˜ํ•ด ์—„๊ฒฉํ•œ ์œ„๊ณ„๊ฐ€ ์œ ์ง€๋˜์–ด ๋™๊ธฐ์ ์œผ๋กœ ๊ฐฑ์‹ ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.

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

๋‹จ์ผ Dispather

Dispatcher ๋Š” Flux ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ค‘์•™ ํ—ˆ๋ธŒ๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•œ๋‹ค.

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

Action Creator ๊ฐ€ ์ƒˆ๋กœ์šด Action ์ด ์žˆ๋‹ค๊ณ  Dispatcher ์—๊ฒŒ ์•Œ๋ ค์ฃผ๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์žˆ๋Š” ๋ชจ๋“  Store๋Š” ํ•ด๋‹น Action์„ ์•ž์„œ ๋“ฑ๋กํ•œ callback์œผ๋กœ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ฒŒ ๋˜๋ฉด Dispachter ์˜ ์—ญํ• ์€ ๋”์šฑ ํ•„์ˆ˜์ ์ด๋‹ค.
๋ฐ”๋กœ Store ๊ฐ„์— ์˜์กด์„ฑ์„ ํŠน์ •์ ์ธ ์ˆœ์„œ๋กœ ์ฝœ๋ฐฑ์„ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
Store๋Š” ๋‹ค๋ฅธ store์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ์„ ์–ธ์ ์œผ๋กœ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ๊ณ  ๋๋‚˜๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ์Šค์Šค๋กœ ๊ฐฑ์‹ ๋œ๋‹ค.

Store

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

์˜ˆ๋ฅผ ๋“ค๋ฉด, Facebook์˜ ๋Œ์•„๋ณด๊ธฐ ํŽธ์ง‘๊ธฐ ์—์„œ ์ง€์†์ ์œผ๋กœ ์žฌ์ƒ๋œ ์‹œ๊ฐ„๊ณผ ํ”Œ๋ ˆ์ด์–ด ์ƒํƒœ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด TimeStore ๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
๊ฐ™์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ImageStore ๋Š” ์ด๋ฏธ์ง€ ์ฝœ๋ž™์…˜์„ ์ง€์†์ ์œผ๋กœ ์ถ”์ ํ•œ๋‹ค.
TodoMVC ์˜ˆ์ œ์˜ TodoStore ๋„ ๋น„์Šทํ•˜๊ฒŒ ํ•  ์ผ ํ•ญ๋ชฉ์˜ ์ฝœ๋ž™์…˜์„ ๊ด€๋ฆฌํ•œ๋‹ค.

Store๋Š” ๋‘ ๋ชจ๋ธ ์ปฌ๋ž™์…˜์˜ ํŠน์ง•์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ๊ณผ ๋™์‹œ์— ์‹ฑ๊ธ€ํ„ด ๋ชจ๋ธ์˜ ๋…ผ๋ฆฌ์  ๋„๋ฉ”์ธ์œผ๋กœ ์—ญํ• ์„ ํ•œ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด store๋Š” ์ž์‹ ์„ Dispatcher ์— ๋“ฑ๋กํ•˜๊ณ  callback์„ ์ œ๊ณตํ•œ๋‹ค.
์ด Callback ์€ Action ์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š”๋‹ค.
Store ์˜ ๋“ฑ๋ก๋œ Callback ์˜ ๋‚ด๋ถ€์—์„œ๋Š” Switch ๋ฌธ์„ ์‚ฌ์šฉํ•œ Action ํƒ€์ž…์„ ํ™œ์šฉํ•ด์„œ Action ์„ ํ•ด์„ํ•˜๊ณ  Store ๋‚ด๋ถ€ ๋ฉ”์†Œ๋“œ์— ์ ์ ˆํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋Š” ํ›…์„ ์ œ๊ณตํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฒฐ๊ณผ์ ์œผ๋กœ action์€ disaptcher๋ฅผ ํ†ตํ•ด store์˜ ์ƒํƒœ๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. store๊ฐ€ ์—…๋ฐ์ดํŠธ ๋œ ํ›„, ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ค‘๊ณ„ํ•˜๋Š” ๊ณผ์ •์œผ๋กœ View ์—๊ฒŒ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ณด๋‚ด์ฃผ๊ณ  View ์Šค์Šค๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

View & Controllers-View

React ๋Š” ์กฐํ™”๋กญ๊ณ  ์ž์œ ๋กœ์šด ํ˜•ํƒœ๋กœ ๋‹ค์‹œ ๋žœ๋”๋ง ํ•  ์ˆ˜ ์žˆ๋Š” View ๋ฅผ View ๋ ˆ์ด์–ด๋กœ ์ œ๊ณตํ•œ๋‹ค.

๋ณต์žกํ•œ View ์œ„๊ณ„์˜ ์ƒ์œ„๋ฅผ ์‚ดํŽด๋ณด๋ฉด Store ์— ์˜ํ•ด ์ด๋ฒคํŠธ๋ฅผ ์ค‘๊ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน๋ณ„ํ•œ ์ข…๋ฅ˜์˜ View๊ฐ€ ์žˆ๋‹ค.
์ด View ๋ฅผ Controller-View ๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ Store ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” glue ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์œ„๊ณ„๋Œ€๋กœ ์ž์‹๋“ค์—๊ฒŒ ์ „๋‹ฌํ•˜๋„๋ก ๋•๋Š”๋‹ค.
ํŽ˜์ด์ง€์˜ ๊ด‘๋ฒ”์œ„ํ•œ ์˜์—ญ์„ ๊ด€๋ฆฌํ•˜๋Š” Contoller-View ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

Store ์—๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์œผ๋ฉด Store ์˜ ํผ๋ธ”๋ฆญ getter() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜์Œ์œผ๋กœ ์š”์ฒญํ•˜๊ฒŒ ๋œ๋‹ค.
๊ทธ ๊ณผ์ •์—์„œ setState() ๋˜๋Š” forceUpdate() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๊ณ  ๊ทธ ํ˜ธ์ถœ ๊ณผ์ •์—์„œ ์ž์ฒด์˜ render() ๋ฉ”์†Œ๋“œ์™€ ํ•˜์œ„ ๋ชจ๋“  ์ž์‹์˜ render() ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

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

๋•Œ๋•Œ๋กœ ์ปดํฌ๋„ŒํŠธ์˜ ๋‹จ์ˆœํ•จ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์œ„๊ณ„ ๊นŠ์€ ๊ณณ์—์„œ Contoller-Views ๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.
์ค‘๊ฐ„์— Contoller-Views ๋ฅผ ๋„ฃ์œผ๋ฉด ํŠน์ • ๋ฐ์ดํ„ฐ ๋„๋ฉ”์ธ์— ๊ด€๊ณ„๋œ ์œ„๊ณ„ ์˜์—ญ์„ ๊ฐ์‹ธ์„œ ๋…๋ฆฝ์ ์œผ๋กœ ๋งŒ๋“œ๋Š”๋ฐ (Encapsulate :: ์บก์Šํ™”) ๋„์›€์ด ๋œ๋‹ค.
ํ•˜์ง€๋งŒ ์ฃผ์˜ํ•ด์•ผ ํ• ๊ฒƒ์€ ์œ„๊ณ„ ๋‚ด์—์„œ ๋งŒ๋“  Controller-View๋Š” ๋‹จ์ผ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ ์ƒ์ถฉํ•ด ์ž ์žฌ์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ์‹œ์ž‘์ ์—์„œ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ๋‹ค.

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

Action

Dispatcher ๋Š” Action ์„ ํ˜ธ์ถœํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  Store ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
Action ์˜ ์ƒ์„ฑ์€ Dispatcher ๋กœ Action ์„ ๋ณด๋‚ผ ๋•Œ ์˜๋ฏธ์žˆ๋Š” Helper ๋ฉ”์†Œ๋“œ๋กœ ํฌ๊ฐœ์ง„๋‹ค.

TODO ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•  ์ผ ์•„์ดํ…œ์˜ ๋ฌธ๊ตฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.
updateText(todoId, newText) ์™€ ๊ฐ™์€ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ณ๋ฅผ ์ด์šฉํ•ด TodoActions ๋ชจ๋“ˆ ๋‚ด์— Action ์„ ๋งŒ๋“ ๋‹ค.
์ด ๋ฉ”์†Œ๋“œ๋Š” View ์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ๋ถ€ํ„ฐ ํ˜ธ์ถœ๋˜์–ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋กœ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
์ด Action Creator ๋ฉ”์„œ๋“œ๋Š” Type ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด Type ์„ ์ด์šฉํ•ด Action ์ด Store์—์„œ ํ•ด์„๋  ์ˆ˜ ์žˆ๋„๋ก, ์ ์ ˆํ•œ ์‘๋‹ต์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค.
์˜ˆ์‹œ์—์„œ์™€ ๊ฐ™์ด TODO_UPDATE_TEXT ์™€ ๊ฐ™์€ ์ด๋ฆ„์˜ ํƒ€์ž…์„ ์‚ฌ์šฉํ•œ๋‹ค.

Action ์€ ์„œ๋ฒ„์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์žฅ์†Œ์—์„œ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ๋•Œ ์ด๋Ÿฐ ๊ณผ์ •์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
๋˜ํ•œ ์„œ๋ฒ„์—์„œ ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ œ๊ณต๋œ ํ›„์— ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์„ ๋•Œ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋‹ค.