MVI 패턴이란

Android MVI 패턴은 Model-View-Intent의 약자로, 안드로이드 앱 개발에서 사용되는 아키텍처 패턴 중 하나입니다.

MVI 패턴은 기존의 MVP, MVVM 등 다른 패턴과는 다르게 데이터 흐름이 단방향으로만 흐르는 것이 특징입니다. 뷰에서 인텐트를 발생시켜 모델에 전달하고, 모델에서 처리한 결과를 다시 뷰로 전달하는 방식으로 동작합니다.

이러한 구조는 다양한 이점을 가지고 있습니다. 불변의 데이터 구조를 사용하므로 코드의 안정성이 높아지고, 뷰와 모델 사이의 인터페이스가 단순해지며, 테스트도 쉽게 구성할 수 있습니다. 또한, 상태가 변화할 때마다 전체 뷰를 다시 그리는 것이 아니라 필요한 부분만 업데이트하므로 성능도 개선됩니다.

Model - View - Intent

  1. Model: 앱의 비즈니스 로직을 처리합니다. 상태를 변경하고, 데이터를 처리합니다. MVI에서는 불변의 데이터 구조를 이용하여 상태를 처리합니다. 모델은 상태 변화를 처리하고, 이를 불변의 데이터 구조로 뷰에 전달합니다.
  2. View: 앱의 UI를 처리합니다. 뷰는 상태를 표시하기 위해 불변의 데이터 구조를 이용합니다. 뷰는 인텐트를 발생시켜 모델에 전달하고, 모델에서 처리한 결과를 다시 불변의 데이터 구조로 받아 화면에 표시합니다.
  3. Intent: 뷰에서 발생한 사용자의 액션을 모델에 전달합니다. 인텐트는 불변의 데이터 구조로 구현됩니다. 뷰에서 인텐트를 발생시켜 모델에 전달하고, 모델에서는 이 인텐트를 처리하여 상태를 변경합니다.

[번역] 상태 지향 아키텍처 MVI를 소개합니다- MVI on Android

이 글에서도 써있듯, MVI는 상태 지향 이다. 어디서 많이 들어본 단어이지 않은가..! 마치 Compose를 위해.. 읍읍

예시 코드 let’s go

MVI에서 모델은 앱의 상태를 나타낸다.

data class Movie(
  var voteCount: Int? = null,
  var id: Int? = null,
  var video: Boolean? = null,
  var voteAverage: Float? = null,
  var title: String? = null,
  var popularity: Float? = null,
  var posterPath: String? = null,
  var originalLanguage: String? = null,
  var originalTitle: String? = null,
  var genreIds: List<Int>? = null,
  var backdropPath: String? = null,
  var adult: Boolean? = null,
  var overview: String? = null,
  var releaseDate: String? = null
)

Model이 MVI에서 어떻게 동작하는지 묘사하기 위해서 TMDB API를 이용하여 영화 순위 같은 것을 검색하길 원한다고 가정해보자. MVP 패턴으로 만들어진 앱에서 모델은 다음과 같은 클래스가 될 것이다.

만일 우리가 Presenter를 사용하는 중이었다면 이런 코드를 작성했을 것이다.