
안드로이드 개발을 하며 이미 수많은 아키텍처들에 대해 접해보고 프로젝트에 적용해봤다. MVC, MVP, MVVM... 이제는 MVI에 대해 알아보자.
앱을 개발하면서 사용자에게 제공하고자 하는 것은 앱의 상태이다! 정보를 받아오고 정리해서 화면에 나타내는 것은 모두 앱의 상태라고 할 수 있다. 이때 두개 이상의 상태가 서로 충돌하여 동시에 나타난다면...? 이러한 경우 개발자가 의도하지 않았던 화면이 나타나게 된다.
상태의 충돌은 크게 2가지 경우에 발생한다.
화면에 나타나야할 데이터가 뷰, 뷰모델, 프레젠터 등에 산재되어 있고 이를 상세하게 관리하지 않는다면 어느 순간 상태 충돌이 발생할 수 있다. 또는 복잡한 데이터 흐름 속에서 비동기 작업이 동시에 상태를 변경시키려고 한다면 이때도 충돌이 발생할 수 있다.
MVI는 불변객체를 사용해 이러한 상태의 충돌을 막고 이벤트의 흐름을 단방향으로 제어하는 방식에 을 통해 상태를 관리하게 된다.

사용자의 의도를 통해 앱의 상태가 변화되고 새로운 화면을 그린다. 그러면 유저는 새로운 의도를 전달한다. 이 과정의 반복으로 MVI는 구성되어있다.
다시 말해 MVI는
의도를 상태로 만들어 화면에 표시하는것
으로 표현할 수 있다.
하지만 앱을 개발하다 보면 사용자의 의도가 즉각적으로 앱의 상태에 반영되지 못하는 경우가 있다. 예를 들어 백그라운드 비동기 요청 또는 토스트, 다이얼로그 출력 등이 있을 수 있다.
이 경우 Side Effect라는 개념으로 처리하고 있다.
Side Effect는 기존의 MVI 사이클과 무관하게 처리되어 새로운 intent가 되어 다시 사이클에 참여한다.