-
[React] 디자인 패턴 (MVC, Flux)프론트앤드/[React] 2023. 7. 1. 16:08728x90
디자인패턴
: 어플리케이션 설계 중 자주 발생하는(되풀이되는) 문제에 대한 모범답안
즉, 프로그램을 개발하면서 생기는 문제를 해결하는 모법답안을 말한다.
디자인 패턴을 사용하는 이유?
- 검증된 해결책 : 이미 검증된 방식 및 방법으로 해결방안을 찾을 수 있음 -> 효과적으로 코드 개선
- 효율적인 소통방식 : 거대하고 복잡한 코드는 규모가 작을때부터 체계적인 규칙이 필요하다. -> 매번 디테일한 설명을 거치지 않고, 사전에 약속해둔 용어들로 표현할 수 있도록 해준다. -> 의미를 명확하고 효율을 높이고, 체계적인 코드를 만들 수 있음
- 유지보수 용이 : 각각 기능을 담당하는 영역을 분리(관심사별로) 헤서 관리할 수 있도록 설계됨 -> 필요한 부분만 수정 가능
- 상대적으로 코드 레벨에 가까운 디자인 패턴들
- 어플리케이션 전체의 아키텍쳐 레벨에 좀 더 가까운 디자인 패턴들도 있음
아키텍쳐 레벨에 가까운 대표적으로 쓰이는 2 가지 패턴
1. MVC (model-view-controller)
프로젝트 구성요소를 역할에 따라 model, view, controller 이 3가지 구조로 나눠서 관리하는 패턴
* Model : 정보 및 데이터를 관리하는 역할 ( React 에서는 state)
* View : 브라우저 화면 , 사용자 인터페이스 요소 담당 (React 에서는 jsx)
* Controller : 사용자의 Action에 의해 이벤트를 감지하고 처리하는 역할 (Model, View를 업데이트 하는 로직 포함)
Flow)
- Controller는 Model과 View 사이에서 필요한 로직을 처리함
: View에서 User의 Action이 발생-> Controller로 해당 액션이 전달 -> Controller에서 필요한 로직 처리 후 Model에 접근해 데이터 수정 , 수정된 데이터를 다시 View에게 전달하여 화면을 업데이트 함
or
- 만약 데이터를 수정할 필요 없이 그냥 바로 View만 변경하면 될 경우,
: Controller가 Model에 접근하지 않고 바로 View를 조작하는것도 가능
or
- 만약 Controller에서 처리해야할 중간 로직이 없다면,
View와 Model이 서로에게 접근해서 수정하는것 또한 가능
장점) 관심사의 분리 (Soc, Separation of Concern)
- 각 부분별로 어떤 역할을 하는지 분명해짐.
- 한 파일 안에서 의존도를 낮게 관리할 수 있음 -> 문제발생시 빠르게 확인 후 처리가능 = 유지보수 용이
한계)
프로젝트 단위가 커지는 경우, Model과 View가 늘어나게 되는데, 이 때 Model과 View는 서로 의존하고 있기 때문에 하나의 Model에 여러개의 View가 연결되어 있기도 하거나 반대인 경우도 있을 수 있음.
=> 양방향 데이터 흐름을가지고 있어서 연쇄적인 데이터 변화가 발생할 수 있음 (Model과 View의 업데이트 예측이 어려워 짐)
이를 해결하기 위한 새로운 디자인 패턴 탄생 !!
2. Flux (data flow : 한 방향)
Action, Dispatcher, Store, View 네 가지의 구조로 나눠서 관리함
생긴이유? )
- 여러 View에 여러 Model들이 의존하고, 양방향으로 데이터를 주고받는 MVC는 애플리케이션의 동작을 예측하기 어려워짐 -> 이런 예측하기 어려운 양방향 데이터 흐름 (Bidirectional data flow)을 보완하기위해 Facebook에서는 단방향 데이터 흐름 (Unidirectional data flow) 패턴인 Flux를 제시했음.
* Action : 어떤 변화를 일으키고 싶은지 설명하는 단순한 자바스크립트 객체
이벤트 구독, 이벤트 발생 시 Action 객체를 만들어서 Dispatcher 에 전달하는 역할을 하는 Action Creator 역할
* Dispatcher : Action을 Store에 배분해 줌. (복잡한 로직 x, flux의 중앙hub역할)
Action 객체의 type property에 따라 Store에 어떤 행동을 할지 결정하는 역할로, Store의 콜백을 등록할 때 쓰이며,
* Store : 데이터의 저장소 역할 (Dispatcher로 전달받은 Action에 따라서만 데이터 변경함. 그 외의 변경은 허용하지 않음)
* View : 데이터를 UI로 표현하는 역할 ( Store를 구독하고 있다가 데이터가 변경되면 UI에 반영)
Store의 상태에 따라 화면에 그려지는 부분
Flow)
이벤트가 발생하면, Dispatcher에게 생성된 Action 객체를 전달 -> Dispatcher에서 Action 객체의 type property에 따라 Store상태 업데이트 ->업데이트 된 store에 따라 View (화면에 그려줌)
이 때, 이 구조라면 Action에서 시작해 View로 끝나는 data flow라고 생각 될 수 있지만,
이렇게 마지막 View에 다다르고 화면이 랜더링 되면 View에서 새로운 Action 객체를 만들어서 시스템에 전파하여 업데이트 된 내역을 알게 한다. => 데이터는 한방향으로 흐름 / 각각 구조가 서로 의존 하지 않음 => 데이터 구조 파악과 흐름을 예측하기 용이함
이거..면접에 나왔었다..이제서야 공부했다... 🥲
728x90'프론트앤드 > [React]' 카테고리의 다른 글
[TypeScript] 공통컴포넌트 Nav 이용해보기 (0) 2023.10.24 [React] Redux (0) 2023.07.02 [React] Custom Hook (useInput) (0) 2023.06.19 [React] React.js로 전화걸기 링크 제공 하기 (0) 2023.04.22 [React] input 으로 프로필 이미지 업로드 하기 (0) 2023.04.20