안드로이드 앱 공부를 하다 보면 알게 되는
MVC에서 MVP, MVVM, 그리고 MVI로의 아키텍처 패턴의 진화는 각기 다른 모델 도입을 통해 이뤄져왔습니다.
각 패턴에 대해 간단히 설명하자면
MVP는 Presenter를 도입하여 뷰와 모델을 명확하게 분리하여 코드의 유지보수성을 향상시켰습니다.
MVVM은 데이터 바인딩과 뷰 모델을 활용하여 뷰와 모델 사이의 결합을 최소화하고 UI 업데이트를 간편화했습니다.
MVI는 불변성과 단방향 데이터 흐름을 강조하여 상태 관리를 예측 가능하게 하고, 디버깅과 유지보수를 향상시켰습니다.
왜 이러한 변화가 이루어졌을까요?
가장 핵심은 각 패턴의 특성을 최대한 살리면서도 모듈 간 결합도를 최대한 낮추어 코드의 유연성과 확장성을 향상시켰다는 것입니다.
MVI란?
여기서 오늘 정의해 볼 MVI가 새롭게 등장합니다!
MVI는 Model - View - Intent로 구성된 아키텍처 패턴입니다. 여기서 'Intent'란 안드로이드에서 사용하는 Intent가 아니라, 사용자의 실제 '의도'를 의미합니다. 예를 들어 사용자가 버튼을 누르면 숫자가 증가하는 앱을 만든다고 가정할 때, 사용자가 버튼을 누르는 행위 자체가 사용자의 '의도'입니다.
MVI에서는 이러한 의도를 전달받아 Model(모델)을 수정합니다. 이미지와 같이 모델의 상태에 뷰를 업데이트 하는데 사용되는 데이터가 포함되며, 해당 상태를 업데이트합니다. 그런 다음 뷰는 변경된 상태에 따라 업데이트됩니다. 변경된 뷰를 사용자는 확인하고, 추가 상호작용을 계속할 것입니다. 이러한 흐름은 단방향으로 진행됩니다.
User -> Intent ->Model -> View와 같이 유저와 상호작용을 할 수 있죠.
이것이 바로MVI의 가장 기본적이고 핵심적인 구조입니다!
여기서 볼 수 있는 특이한 점 중 하나는 상호작용이 단방향으로 진행된다는 것입니다. 사용자는 의도를 통해 모델의 상태를 갱신하고, 그에 따라 뷰가 변경됩니다. 이런 단방향 흐름은 애플리케이션의 상태 변화를 예측 가능하게 만들어 유지보수와 디버깅을 용이하게 할 수 있습니다!
부수효과란?
하지만 여기엔 부수효과(Side Effect)란 개념이 아직 나오지 않았습니다.
부수효과란 무엇일까요?
저는 부수효과를 상태에 포함되는 데이터의 변경만으로는 처리할 수 없는 모든 활동을 부수효과로 정의하였습니다.
안드로이드 앱을 예로 들어보면, 화면을 전환하거나 토스트를 띄우고 다이얼로그를 띄우는 등의 작업들이 이에 해당합니다. 이런 부수효과들은 단순히 상태를 갱신하는 것만으로는 제어하기 어렵다는 문제가 있습니다.
그렇기 때문에 MVI는 단방향 데이터 흐름과 불변성에서 이러한 부수효과를 효과적으로 다룰 수 있도록 구현됩니다!
의도를 통해 상태를 갱신하고, 그에 따라 뷰가 업데이트됩니다. 부수효과는 이 과정에 영향을 미치지 않는 별도의 단계에서 처리되어 안전한구조를 설계할 수 있습니다.
단방향 데이터 흐름과 불변성이란?
여기서 궁금한 점이 생기시지 않았나요? 대체 위에서 주구장창 나오던 단방향 데이터 흐름과 불변성이란 도대체 무엇일까요?
MVI의 단방향 데이터 흐름과 불변성에 대해 알아봅시다.
먼저, 단방향 데이터 흐름은 정보가 한 방향으로만 흐른다는 개념이죠. 사용자가 의도를 통해 모델을 갱신하고, 그 결과로 뷰가 업데이트됩니다. 이런 단방향 흐름 덕분에 상태 변화를 지속적으로 추적하고 예측하기가 훨씬 수월해집니다.
이는 곧, 사용자와 시스템 간의 통제가 더 명확하고 일관성 있게 이뤄질 수 있다는 뜻이죠.
그리고 불변성은 데이터가 변경되지 않는다는 개념입니다. MVI에서는 상태를 바꾸는 대신에 새로운 상태를 만들어서 사용해요. 그러면 이전 상태는 그대로 두고, 새로운 상태가 예전 상태를 대체하게 되죠. 이렇게 하면 상태 변화가 예측 가능해지고, 부수효과의 영향을 최소화해서 코드를 더 확고하게 만들 수 있어요.
그래서, MVI의 단방향 데이터 흐름과 불변성은 앱 상태를 효과적으로 관리하는 데에 정말 유용하고, 코드를 디버깅하고 유지보수하는 데에도 훨씬 편리하게 도와줍니다.
https://velog.io/@evergreen_tree/Android-MVI-%ED%8C%A8%ED%84%B4
https://www.charlezz.com/?p=46365
Android 프로젝트에 MVI 도입하기 | 찰스의 안드로이드
MVI 도입배경 프로젝트에 Jetpack Compose를 도입하고 1년정도 적극 쓰면서 '상태' 관리의 중요성을 머리가 아닌 몸으로 느껴버렸다. 상태 관리를 어떻게 하면 좋을까 고민하던 중 동료 개발자가 이전
www.charlezz.com
'개발노트' 카테고리의 다른 글
안드로이드 앱 개발자의 Flutter 개발 환경 조성하기 (MacOS) (1) | 2024.02.19 |
---|