Android MVI에 대해서 알아보자(UDA)

Kenneths
4 min readJun 2, 2021

--

안녕하세요 케니스입니다. 오늘은 MVC, MVP, MVVM 이런 대중적인 패턴들을 거쳐 단방향 아키텍처(Data Uni-Directino-Architecture) 기반으로 만드는 MVI 패턴에 대해서 알아보겠습니다.

요즘 출시되는 어플리케이션의 고도화가 많아지고 복잡도가 증가함에 따라 한 화면안에 다양한 기능들이 밀집하게 되고 각 기능들의 역할이 View에게 표시되기에는 너무 많은 상태들이 존재합니다. 이렇게 복잡한 상태에 대해서 어떻게 해결할까에 대한 고민이 Facebook의 Flux, Javascript의 Redux로 시작하게 됩니다.

어떤게 복잡한 상황일까?

상품의 리스트가 있다고 가정해봅니다. 이 리스트는 새로고침이 가능하여 랜덤의 리스트를 리로딩가능하고 삭제를해서 삭제도 가능합니다. 2개다 비동기로 처리한다고 가정했을 때 첫번째 인덱스 아이템의 삭제를 요청하고 새로고침을 한다면 첫번째 아이템이 삭제가되고 리스트가 새로고침이 된다면 베스트겠지만 비동기처리는 우리가 원하는대로 결과를 주지 않습니다.

사용자 입장에서는 내가 원하지 않는 아이템이 삭제되는걸 바라지 않을겁니다. 이러한 문제를 단방향 아키텍처를 이용해 해결해 보려합니다.

단방향 아키텍처란?

단방향 아키텍처(Data Uni-Directino-Architecture)는 다음과 같은 특징이 있습니다.

  1. View는 State를 통해 변경되며 오직 한 방향으로만 수정 가능
  2. 상태는 불변적인 특성을 가지고 있음
  3. Model은 State를 변화시키며 View는 State만 참조

MVI ?

MVI는 Model, View, Intent로 구성되어 있습니다. MVI는 Hannes Dorfmann이 고안해서 만든 Android UDA 입니다. 여기서 Intent는 안드로이드 Intent를 의미하는게 아닌 Flux, Redux의 Action과 의미가 비슷합니다. 데이터 방향의 흐름은 View-Intent-Model 순으로 순환합니다.

View의 이벤트가 발생하면 intent를 생성하여 보냅니다. 그럼 Model은 비즈니스 로직등과 같은 적절한 처리를 하고 State를 생성한 후 View에게 알립니다. View는 상태를 업데이트를합니다. MVI는 이러한 순환구조를 가지게 됩니다.

그렇다면 MVI, UDA의 장단점은 어떤것들이 있을까요?

장점

  • 여러 입력이나 이벤트에 대해서 한곳에서 관리 가능
  • State가 명확하여 버그나 디버깅하기 쉬움

단점

  • 간단한 Presentation 로직(ex.간단한 토스트 메세지)에도 상태를 순환해야 하는지에 대한 의문
  • 데이터 흐름의 제어를 위한 라이브러리가 필요함(Rx, Coroutine Flow, Etc)
  • 클래스를 많이 생성해야함

마무리

MVVM을 주로 사용하다가 여러 상태에 대해 고민하던 중 단방향 아키텍처에 대해 알게 되었고 UDA에 장점에 대해 매력을 느껴 포스팅하게 되었습니다. Airbnb의 Marvericks, Kinda, 마이리얼트립의 Box등 여러곳에서 MVI 패턴을 위해 좀 더 개선하고 라이브러리화하는 시도가 많이 보입니다. MVI패턴은 복잡한 상태관리를 쉽게 풀어주어 장기적으로 유지보수에도 도움이 될 수 있을 것 같습니다.

참고자료

--

--

Kenneths
Kenneths

Written by Kenneths

사용자들에게 편리하고 AweSome UI, UX를 경험해주고 싶은 상위 티어 개발자가 되고싶어 달려가고있는 개발자입니다. 다양한 내용들을 공유하려고 합니다.

No responses yet