Front-end/React

[React] Flux: React์˜ ๋‹จ๋ฐฉํ–ฅ ํ…Œ์ดํ„ฐ ์•„ํ‚คํ…์ณ! ๐Ÿ”„

xeunnie 2024. 12. 29. 01:00
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ”„ Flux ํ†บ์•„๋ณด๊ธฐ!

Flux๋Š” Facebook์ด ๋งŒ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜๋กœ, ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. React์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์•„์ฃผ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ๋˜์ฃ . ์˜ค๋Š˜์€ Flux์˜ ๊ธฐ๋ณธ ๊ฐœ๋…, ๊ตฌ์„ฑ ์š”์†Œ, ๋™์ž‘ ๋ฐฉ์‹, ๊ทธ๋ฆฌ๊ณ  ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋˜๋Š”์ง€์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ ๋ณผ๊ฒŒ์š”. ๐Ÿ’ก


๐Ÿ“œ Flux๋Š” ์™œ ๋“ฑ์žฅํ–ˆ์„๊นŒ?

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

 

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด Flux์˜ˆ์š”. โ€œ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„โ€์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ , ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์ฃ .


๐Ÿ”‘ Flux์˜ ํ•ต์‹ฌ ์›๋ฆฌ

Flux๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด, ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ํ๋ฅด๋„๋ก ๊ฐ•์ œํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํžˆ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


๐ŸŒŸ Flux์˜ 4๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ

1. Action (ํ–‰๋™)

  • ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋ฌ˜์‚ฌํ•œ ๊ฐ์ฒด
  • ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋™์ž‘์ด ํ•„์š”ํ•œ์ง€์™€ ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จ
  • ์˜ˆ: ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์š”์ฒญ
const addTodoAction = {
  type: "ADD_TODO",
  payload: { text: "Learn Flux" },
};

 

2. Dispatcher (๋””์ŠคํŒจ์ฒ˜)

  • ๋ชจ๋“  Action์„ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์ด๋ฅผ Store์— ์ „๋‹ฌ
  • ๋‹จ์ผ Dispatcher๊ฐ€ ๋ชจ๋“  Action์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.
dispatcher.dispatch({
  type: "ADD_TODO",
  payload: { text: "Learn Flux" },
});

 

3. Store (์ €์žฅ์†Œ)

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ
  • Action์ด Dispatcher๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋ฉด Store๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ
  • React ์ปดํฌ๋„ŒํŠธ๋Š” Store๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋…(subscribe)
const todoStore = {
  todos: [],
  addChangeListener(callback) {
    this.onChange = callback;
  },
  dispatchHandler(action) {
    if (action.type === "ADD_TODO") {
      this.todos.push(action.payload.text);
      this.onChange();
    }
  },
};

dispatcher.register(todoStore.dispatchHandler.bind(todoStore));

 

4. View (๋ทฐ)

  • React ์ปดํฌ๋„ŒํŠธ๊ฐ€ View์˜ ์—ญํ• 
  • Store์—์„œ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์™€ UI๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ , ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ Action์œผ๋กœ ๋ณ€ํ™˜
function TodoApp({ todos }) {
  return (
    <div>
      {todos.map((todo, index) => (
        <p key={index}>{todo}</p>
      ))}
      <button onClick={() => addTodoAction("Learn Flux")}>
        Add Todo
      </button>
    </div>
  );
}

๐Ÿ”„ Flux์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„

  1. ์‚ฌ์šฉ์ž ์ž…๋ ฅ โ†’ Action ์ƒ์„ฑ
    • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ํผ์„ ์ œ์ถœํ•˜๋ฉด Action ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  2. Dispatcher โ†’ Store ์—…๋ฐ์ดํŠธ
    • Dispatcher๊ฐ€ Action์„ ๋ฐ›์•„์„œ Store๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    • Store๋Š” Action์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  3. Store โ†’ View ์—…๋ฐ์ดํŠธ
    • ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด Store๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ View์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
    • React๋Š” ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ UI๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
  4. React โ†’ ์‚ฌ์šฉ์ž ์ž…๋ ฅ
    • React๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ์ž…๋ ฅ์„ ๋ฐ›์•„ ๋‹ค์Œ Action์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ›  ์‹ค๋ฌด์—์„œ Flux ์‚ฌ์šฉํ•˜๊ธฐ

1. ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ ์ค„์ด๊ธฐ

Flux๋Š” ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์œ ์ง€ํ•˜๋ฏ€๋กœ, ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ๋””๋ฒ„๊น…์ด ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

 

2. ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์ด ๋ณต์žกํ•œ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

3. Redux์™€์˜ ๊ด€๊ณ„

Redux๋Š” Flux ์•„ํ‚คํ…์ฒ˜์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ ๋งŒ๋“ค์–ด์ง„ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Flux์˜ ๊ตฌํ˜„์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ , ๋‹จ์ผ Store๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌ ํšจ์œจ์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.


โš ๏ธ Flux ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ 

  1. Dispatcher๋Š” ๋‹จ์ผํ•ด์•ผ ํ•œ๋‹ค
    • ์—ฌ๋Ÿฌ Dispatcher๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    • ํ•ญ์ƒ ํ•˜๋‚˜์˜ Dispatcher๋กœ ์ค‘์•™์—์„œ Action์„ ๊ด€๋ฆฌํ•˜์„ธ์š”.
  2. Store๋Š” ์ƒํƒœ๋งŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค
    • Store๋Š” UI๋ฅผ ๋ Œ๋”๋งํ•˜๊ฑฐ๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์˜ค์ง ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•˜์„ธ์š”.
  3. Action์€ ์ˆœ์ˆ˜ํ•ด์•ผ ํ•œ๋‹ค
    • Action์€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ๋‹จ์ง€ ์ƒํƒœ ๋ณ€ํ™”์˜ ์˜๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽฏ ๊ฐ„๋‹จํ•œ Todo ์˜ˆ์ œ

// Dispatcher ์ƒ์„ฑ
const dispatcher = {
  callbacks: [],
  register(callback) {
    this.callbacks.push(callback);
  },
  dispatch(action) {
    this.callbacks.forEach((callback) => callback(action));
  },
};

// Store ์ƒ์„ฑ
const todoStore = {
  todos: [],
  onChange: null,
  dispatchHandler(action) {
    if (action.type === "ADD_TODO") {
      this.todos.push(action.payload.text);
      this.onChange();
    }
  },
};

dispatcher.register(todoStore.dispatchHandler.bind(todoStore));

// View ์—…๋ฐ์ดํŠธ
todoStore.onChange = function () {
  console.log("Todos:", todoStore.todos);
};

// Action ์ƒ์„ฑ ๋ฐ ๋””์ŠคํŒจ์น˜
dispatcher.dispatch({
  type: "ADD_TODO",
  payload: { text: "Learn Flux" },
});

๐ŸŒŸ Flux๊ฐ€ ์™œ ์ค‘์š”ํ•œ๊ฐ€?

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

๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ ๐Ÿ”–

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

 

๐ŸŒท์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น!๐ŸŒท 

728x90
๋ฐ˜์‘ํ˜•