Flux는 페이스북(현 Meta)에서 지금으로부터 10년전으로 거슬러 올라가 기존
MVC
패턴의 한계점들을 극복할 수 있는 Flux 아키텍쳐를 소개했습니다.
자세한 내용은 Hacker Way: Rethinking Web App Development at Facebook에서 확인할 수 있습니다.
MVC(Model-View-Controller)
프로그래밍 개발시 Model,View,Controller 위 3가지 형태로 개발하는 프로그래밍 방법론 중 하나이다.
비즈니스 로직과 UI를 분리시켜 서로 영향없이 개발하기 수월하다는 장점이 존재한다.
Model
Model
내부에선 비즈니스 로직을 처리하기 위한 역할을 하게 된다.View
View
는 사용자에게 보여지는 UI
를 담당하는 역할을 하게된다.Controller
Model
이 "어떻게 처리할 것"인지를 알려주는 역할이다.Model
과 View
로 명령을 전달하는 중간다리 역할을 하게된다.MVC 패턴 적용 흐름
Controller
가 모델을 조작한다.Moedl
이 뷰를 업데이트한다View
또한 모델을 직접적으로 업데이트한다.이러한 과정에서 Model
과 View
가 서로가 서로를 업데이트하게 되는데 이 개념을 "양방향 데이터 바인딩"이라고 한다.
MVC
패턴에서 이러한 "양방향 데이터 바인딩"이 애플리케이션의 복잡도를 증가시키고 확장을 어렵게 만든다고 판단했다.그런데 여기서 대규모 어플리케이션의 작업을 한다고 생각해보자
기존 간단한 MVC 패턴은 명확하고 복잡성도 없으며 직관적으로 이해하기 쉬웠다.
하지만 Model
과 View
가 늘어나고, 이에 따른 서로간의 이해관계가 얽힌다면?
위와 같이 복잡한 내부구조를 가지게 될 것이다.
위와 같은 MVC 패턴
의 양방향 데이터 바인딩은 확장하면 확장할 수록 어플리케이션이 복잡해지는 단점이 생긴다고 했다.
Flux
아키텍쳐를 제안하게 되었다.Flux 아키텍쳐 흐름도
위 이미지는 Flux
아키텍쳐의 간단한 흐름도인데, 순서를 정의하자면 다음과 같다.
Action
이 발생한다 (=Event)Dispatcher
가 이 Action
을 받아와 해석하는 역할을 한다.Store
에 저장된 정보가 변경된다.Store
에 있는 정보가 최종적으로 View
로 전달되 변경된 UI
를 그리게 된다.+추가적으로 사용자가 View에서 상호작용을 할경우 이런 흐름이 추가될 수 도 있다
Action
, Dispatch
, Store
, View
가 어떤 역할을 하게되는지 확인해보자.Action
은 데이터가 변경되는 모든 이벤트나 사용자의 상호작용을 나타낸다
Action
은 애플리케이션의 상태를 변경하는데 필요한 모든 정보를 포함하고 있는 하나의 객체이다.Action
객체에는 주로 어떤 Action
인지를 정의하는type
속성과 Action
이 수행하는 작업에 필요한 데이터를 담고 있는 payload
속성을 가지게 된다.{
type: '어떤 Action을 정의할 건가요?',
payload: {
/* Action이 수행하는 작업에 필요한 데이터가 담긴다*/
}
}
Dispatcher
는 Action
을 통해 전달된 정보를 Store
로 전달하는 역할을 담당한다.
switch
문으로 들어오는 Action
객체를 나누어 처리하게 되는데, 미리 정해둔 Action
객체의 type
을 switch
문으로 구분해 작성해둔 명령을 수행하는 역할을 하게된다.데이터 및 상태등을 담고 있는 역할
Dispatcher
에서 전달된 Action
을 통해서만 상태가 변경된다.Store
에서 가지고 있는 상태에서 View
가 접근하고, 이로인해 상태가 변경되면 View
에서도 상태가 변경된 최신화 된 UI
를 제공하게 된다.Store
에서 변경이 발생하면, View
는 변경을 감지하고, 이를 화면에 그려 다시 렌더링한다
React
에서는 MVC 패턴
에서 컨트롤러와 뷰의 역할을 담당하므로 Controller-View
라고 한다.위와같이 Flux
아키텍쳐를 사용하게 되면 데이터 흐름의 구조화가 가능하게 된다.
Action
들을 통해 어떤 변경이 발생하는지 알 수 있어 코드의 흐름을 파악하기 용이해진다.또한, 이러한 Flux 아키텍쳐
의 원리를 기반으로 React
에서의 다양한 상태관리 라이브러리(Redux
,Recoil
등등..)과 밀접한 연관을 가지고 있다.