MVI 패턴은 Model, View, Intent 로 구성된다. MVVM 패턴의 상태 문제와 부수 효과(SideEffect)라는 문제점이 있었다. 이러한 문제점을 보완하기 위해서 JavaScript 의 Redux 기반으로 MVI 패턴이 등장하였다. MVI 패턴은 MVP, MVVM 과 유사하지만 Intent 와 상태의 새로운 개념이 도입되었고, 단방향 선순환으로 반복되어 진행되므로 상태 충돌이 일어나지 않는다.
부수효과라고 하며, 함수는 외부의 어떠한 상태를 변경하지 않는 “순수 함수” 의 반대 개념이다. 즉, 함수에서 외부의 상태를 변경하고 있다는 의미이다.
상태 문제
MVVM 에서는 ViewModel 에서 다양한 상태 값을 가지며 해당 상태가 변경되었을 때, View에서 관찰하며 대응하는 방법을 주로 사용하곤 합니다.
위에 코드처럼 상태의 객체가 여러 개 만들어지는 것 보다는 아래의 코드처럼 하나의 상태 객체를 사용하여 객체를 View에서 옵저빙하는 것이 훨씬 자연스러워 보입니다.
하지만, 패턴이라는 것은 소프트웨어 객체 지향의 문제점을 개선하기 위해서 나온 아키텍처이므로 잘 이해하고 적용 시켜야하는 곳을 정확하게 판단하여 사용하는 것이 좋을 것 같다는 생각입니다.
부수 효과
함수에서 외부의 환경을 바꾸는 것을 부수효과라고 합니다. 그렇다면 MVVM 에서는 어떤 부수효과가 일어나는지 살펴보면 좋을 것 같습니다.
아래의 코드를 살펴보면 fetchUser() 메서드에서 userLiveData를 변경하는 부수효과가 보입니다.
그렇다면, MVI 패턴에서 부수효과는 일어나지 않는가? 그렇지 않습니다. 똑같이 일어나는 것을 알 수 있습니다.
하지만 MVI 패턴에서는 위에 코드를 보면 알 수 있듯이 Intent 로 Action 을 명확하게 정의하고 있습니다. 즉, FetchUser의 Action일 때, fetchUser() 메서드를 호출하라고 명시적으로 동작하고 있습니다.
그렇기 때문에 예측 가능하고 관리하기 쉽습니다. 따라서 상태 관리와 부수 효과 문제를 효과적으로 해결 가능하다고 할 수 있습니다.