Front End/Web

Flux ํŒจํ„ด

๐ŸŒ

Flux ํŒจํ„ด

Flux ํŒจํ„ด์€ 2014๋…„ ํŽ˜์ด์Šค๋ถ F8 ์ปจํผ๋Ÿฐ์Šค์—์„œ ๋ฐœํ‘œ๋œ ์•„ํ‚คํ…์ฒ˜๋กœ, CSR ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๊ด€๋ฆฌํ•˜์—ฌ ์˜ˆ์ธก๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ๋‹ค.

๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

๊ธฐ์กด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ณดํŽธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋˜ ๋””์ž์ธ ํŒจํ„ด์€ MVC ํŒจํ„ด์ด์—ˆ๋‹ค. MVC๋Š” Model, View, Controller์˜ ์•ฝ์ž๋กœ, Model์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  Controller๋ฅผ ์ด์šฉํ•ด Model์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. Model์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด View๋กœ ์ „๋‹ฌ๋˜์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๊ณ , ์‚ฌ์šฉ์ž ์—ญ์‹œ View๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด Model์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. React์˜ State Hook์„ ๋Œ€์ž…ํ•ด์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด, Model์€ state, Controller๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค. View์—์„œ๋Š” Controller๋ฅผ ์ด์šฉํ•ด(Lift State Up) Model์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

ํŽ˜์ด์Šค๋ถ์€ โ€œMVC๋Š” ์ •๋ง ๋ˆˆ ๊นœ์งํ•  ์‚ฌ์ด์— ๋ณต์žกํ•ด์ง„๋‹คโ€๊ณ  ๋งํ•˜๋ฉฐ ์ด ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์œผ๋กœ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ฐ€์ง€๋Š” Flux ํŒจํ„ด์„ ๊ณ ์•ˆํ•œ๋‹ค.

Flux ํŒจํ„ด?

Flux๋Š” ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Action์„ ๋งŒ๋“ค๊ณ  Action์„ Dispatcher์— ์ „๋‹ฌํ•˜์—ฌ Store(Model)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•œ ๋’ค View์— ๋ฐ˜์˜ํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ํ๋ฆ„์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ์•„ํ‚คํ…์ฒ˜์ด๋‹ค. ๊ฐ ์š”์†Œ๋“ค์€ ๋‹จ๋ฐฉํ–ฅ ํ๋ฆ„์— ๋”ฐ๋ผ ์ˆœ์„œ๋Œ€๋กœ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , View๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด ์ด๋ฅผ ๋‹ค์‹œ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์˜ˆ์™ธ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Action

Action์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ–‰์œ„๋กœ Dispatcher์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ๊ฐ์ฒด์ด๋‹ค. Action ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” Action Creator๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กœ ๋ฐœ์ƒํ•˜๋Š” Action์˜ ํƒ€์ž…๊ณผ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ(payload)๋ฅผ ๋ฌถ์–ด Dispatcher์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

Dispatcher

Dispatcher๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜๋Š” ์ค‘์•™ ํ—ˆ๋ธŒ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. Store(Model)์—๋Š” ์ƒํƒœ์™€ Action๋งˆ๋‹ค ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š”๋ฐ, Action์ด Dispatcher๋กœ ์ „๋‹ฌ๋˜๋ฉด ์ด๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ Store๊ฐ€ ์ž‘์„ฑํ•ด๋‘” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

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

Store (Model)

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

View

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


Uploaded by N2T