
리액트 등장 전 Angular JS와 같은 프레임워크는 MVC 패턴을 유지하고 있었다. 이후 MVC 패턴의 문제점을 해결하기 위해 Flux 패턴이 등장했다.
먼저 MVC 패턴에 대해 알아보고 Flux 패턴에 대해 알아보자.
Model, View, Controller 의 약자로 Model에 상태를 저장하고 Controller가 Model를 변경시킨다. 또한 Model이 변경되면 View를 업데이트 시킨다. 또한 View 에서도 Model를 변경시킬 수 있다.
사용자가 입력을 하거나, 화면을 선택 및 클릭, 서버와 통신 등 View에서 많은 일들이 일어난다. 이는 View와 Model이 서로 영향을 줄 수 있음을 의미한다.
💡 1. View → Model
ex) 사용자 입력으로 Model 변경
2. View ← Model
ex) 서버로부터 데이터를 받아서 View 에 데이터 출력
결국, View ↔ Model 이 양방향으로 데이터가 흐르는 것을 알 수 있다.

하지만 프론트엔드에서는 View 개수가 매우 많다 (물론 1~2개 있을 수 있지만 View 규모가 커질 것이다. 따라서 우리는 View를 분리하여 여러 개의 작은 뷰를 만든다). 그리고 Model 도 다수 존재할 수 있다.
이는 View 와 Model 간 의존성과 복잡도가 증가시킨다. 그리고 이를 보안하기 위해 많은 View 와 Model 를 상호 연결하는 매우 큰 Controller 가 필요하다.

이렇게 되면 다수의 View와 Model이 존재하고 한 View에서 여러 Model를 변경시키고 한 Model에서 여러 View를 변경시키는 문제가 발생한다. 이는 어떤 View에서 상태를 변경시키면 다른 View에도 상태가 업데이트가 표시되는 등 추적하기 어려워 진다.
결국, 복잡도가 증가하고 데이터의 흐름을 파악하고 예측하기 힘들어진다.
이를 해결하기 위해 고안된 것이 Flux 패턴이다.
Flux 패턴은 Facebook에서 개발된 애플리케이션 아키텍처로, 단방향 데이터 흐름을 통해 애플리케이션의 상태 관리를 단순화하고 예측 가능하게 한다. Flux 패턴은 주로 대규모 애플리케이션에서 상태 관리의 복잡성을 줄이기 위해 사용된다.

type 필드와 함께 데이터를 포함하여 디스패처에게 전달한다.{ type: 'ADD_TODO', payload: { text: 'Learn Flux' } }.
각 요소들은 단방향 흐름에 따라 순서대로 역할을 수행하고 Action 이 View(사용자 입력 등)나 다른 소스(서버로부터 데이터 응답 등)로 부터 발생하면 처음부터 다시 순서대로 실행된다.
이로 인해 단방향 데이터 흐름으로 인해 상태 관리가 쉬워지고, 디버깅이 용이해지며, 애플리케이션의 복잡성이 낮아진다.
ex) To Do List에서 flux 패턴 적용
