[디자인 패턴] Flux Pattern

권용준·2024년 1월 24일
0
post-thumbnail

Flux Pattern

애플리케이션의 상태 관리와 데이터 흐름을 효율적으로 관리하기 위해 설계되었습니다.
구성요소는 Action, Dispatcher, Store, View를 갖고있습니다.
각 요소들은 단방향 흐름에 따라 순서대로 역할을 수행하고, View로부터 새로운 데이터 변경이 생기면 처음부터 다시 위 순서대로 실행합니다.
이렇게 함으로써 예외 없이 데이터를 처리할 수 있게 되었습니다.

구성요소

Action

  • 애플리케이션에서 발생하는 이벤트 또는 사용자 상호 작용을 나타냅니다.
  • 액션은 특정 유형과 함께 데이터를 전달합니다.

Dispatcher

  • 액션을 받아서 등록된 모든 스토어에 액션을 전달하는 역할을 합니다.
    Dispatcher에는 Store들이 등록해놓은 Action 타입마다의 콜백 함수들이 존재하는데 Action을 감지하면 Store들이 각 타입에 맞는 Store의 콜백 함수를 실행합니다.
  • 단방향 데이터 흐름을 유지하기 위한 중앙 허브 역할을 하며 오직 Dispatcher만 store의 데이터를 조작할 수 있습니다.

Store

  • 상태 저장소로서 상태와 상태를 변경할 수 있는 메서드를 갖습니다.
  • store는 dispatcher로부터 액션을 받아 상태를 업데이트하고, 변경된 상태를 View에게 전달합니다.

View

  • 사용자에게 정보를 표시하고 사용자 입력을 받는 역할을 합니다.
  • store로부터 상태를 받아오고, 상태가 변경될 때마다 업데이트됩니다.

React, redux에서의 Flux 패턴 예시 코드

// src/actions.js
export const increment = () => {
  return {
    type: 'INCREMENT'
  };
};

// src/reducer.js
const initialState = {
  counter: 0
};

const reducer = (state = initialState, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return {
        ...state,
        counter: state.counter + 1
      };
    default:
      return state;
  }
};

export default reducer;

// src/store.js
import { createStore } from 'redux';
import reducer from './reducer';

const store = createStore(reducer);

export default store;

// src/App.js
import React from 'react';
import { connect } from 'react-redux';
import { increment } from './actions';

const App = ({ counter, increment }) => {
  return (
    <div>
      <p>Counter: {counter}</p>
      <button onClick={increment}>Increment</button>
    </div>
  );
};

const mapStateToProps = (state) => {
  return {
    counter: state.counter
  };
};

const mapDispatchToProps = (dispatch) => {
  return {
    increment: () => dispatch(increment())
  };
};

export default connect(mapStateToProps, mapDispatchToProps)(App);
profile
Brendan Eich, Jordan Walke, Evan You, 권용준

0개의 댓글