FLUX 패턴은 단방향 데이터 흐름을 중심으로 애플리케이션 상태를 관리하기 위해 페이스북에서 설계된 아키텍처 패턴이다.
특히 React 애플리케이션에서 사용되며, 데이터를 효과적으로 처리하고 UI를 업데이트하는 데 중점을 둔다.
대규모 애플리케이션에서는 상태 관리와 데이터 흐름이 복잡해질 수 있다.
FLUX는 단방향 데이터 흐름을 통해 이를 해결한다.
사용자가 할 일을 추가, 수정, 삭제할 수 있는 React 기반 애플리케이션을 FLUX 패턴으로 구현할 수 있다.
FLUX 패턴은 다음 네 가지 주요 컴포넌트로 구성된다.
[Action] -> [Dispatcher] -> [Store] -> [View]
^---------------------|
React 애플리케이션에서 FLUX 패턴을 적용해 Todo 관리 기능을 구현해 보자.
// actions/TodoActions.js
const TodoActions = {
addTodo: function (title) {
return {
type: "ADD_TODO",
payload: title,
};
},
removeTodo: function (id) {
return {
type: "REMOVE_TODO",
payload: id,
};
},
};
export default TodoActions;
// dispatcher/AppDispatcher.js
import { Dispatcher } from "flux";
const AppDispatcher = new Dispatcher();
export default AppDispatcher;
// stores/TodoStore.js
import { EventEmitter } from "events";
import AppDispatcher from "../dispatcher/AppDispatcher";
const TodoStore = Object.assign({}, EventEmitter.prototype, {
todos: [],
getTodos: function () {
return this.todos;
},
addTodo: function (title) {
const id = Date.now();
this.todos.push({ id, title });
this.emit("change");
},
removeTodo: function (id) {
this.todos = this.todos.filter((todo) => todo.id !== id);
this.emit("change");
},
});
// Dispatcher에 스토어 등록
AppDispatcher.register(function (action) {
switch (action.type) {
case "ADD_TODO":
TodoStore.addTodo(action.payload);
break;
case "REMOVE_TODO":
TodoStore.removeTodo(action.payload);
break;
default:
break;
}
});
export default TodoStore;
// components/TodoApp.js
import React, { useState, useEffect } from "react";
import TodoActions from "../actions/TodoActions";
import TodoStore from "../stores/TodoStore";
const TodoApp = () => {
const [todos, setTodos] = useState([]);
// 스토어의 변경 사항을 감지
useEffect(() => {
const updateTodos = () => setTodos(TodoStore.getTodos());
TodoStore.on("change", updateTodos);
return () => {
TodoStore.removeListener("change", updateTodos);
};
}, []);
const handleAddTodo = () => {
const title = prompt("할 일을 입력하세요:");
if (title) {
AppDispatcher.dispatch(TodoActions.addTodo(title));
}
};
const handleRemoveTodo = (id) => {
AppDispatcher.dispatch(TodoActions.removeTodo(id));
};
return (
<div>
<h1>Todo List</h1>
<button onClick={handleAddTodo}>할 일 추가</button>
<ul>
{todos.map((todo) => (
<li key={todo.id}>
{todo.title}{" "}
<button onClick={() => handleRemoveTodo(todo.id)}>삭제</button>
</li>
))}
</ul>
</div>
);
};
export default TodoApp;
FLUX 패턴은 단방향 데이터 흐름을 중심으로 대규모 애플리케이션에서 상태 관리를 명확히 하는 강력한 패턴이다.
React와 같은 라이브러리에서 상태 관리를 고민 중이라면 FLUX 패턴을 적용해 보자.
아래 글에서 다른 아키텍쳐 패턴들을 확인할 수 있다.
아키텍처 패턴 모음