시배's Android

Design Patterns | Mavericks로 MVI 패턴 찍먹해보기 (1) 본문

Android/Design Patterns

Design Patterns | Mavericks로 MVI 패턴 찍먹해보기 (1)

si8ae 2023. 7. 23. 00:37

안드로이드 개발에서 MVI (Model-View-Intent) 아키텍처는 현재 많은 개발자들에게 인기가 높아지고 있는 패턴입니다. MVI 앱의 상태 관리와 UI 처리를 효과적으로 분리하여 앱의 유지보수성을 향상시키고, 디버깅과 테스트를 용이하게 만드는 장점을 가지고 있습니다.

MVI 아키텍처란?

MVI 아키텍처는 기존의 MVVM(Model-View-ViewModel) 패턴에서 발전된 아키텍처로, 상태 중심의 설계를 강조합니다. 앱의 상태를 하나의 단일 소스로 관리하고, 상태가 변경될 때마다 UI를 업데이트하는 방식을 채택합니다. MVI에서는 세 가지 주요 구성 요소가 있습니다.

  • Model: 앱의 상태를 나타내는 데이터 모델입니다. 상태 변경에 따라 업데이트되며, 뷰와 독립적으로 존재합니다.
  • View: 사용자에게 보이는 UI를 담당합니다. Model의 상태를 표시하고, 유저 액션을 Intent로 전달합니다.
  • Intent: 사용자의 액션을 나타내는 이벤트입니다. View가 사용자 입력을 감지하면, 해당 액션을 Intent로 변환하여 Model에 전달합니다.

MVI  장점

MVI 아키텍처의 장점 MVI 아키텍처는 다음과 같은 장점을 제공합니다.

  • 단일 상태 소스: 앱의 상태를 단일 소스로 관리하므로 상태 변화를 추적하기 쉽습니다.
  • 불변성: 상태 데이터를 변경 불가능하게 관리하여, 예측 가능하고 안정적인 앱을 구축할 수 있습니다.
  • 테스트 용이성: 상태 기반 테스트가 쉽기 때문에 유닛 테스트 작성이 편리합니다.
  • 디버깅 용이성: 상태 변화를 추적하고 디버깅하기 쉽기 때문에 앱의 문제 해결이 효율적입니다.

MVI + Compose 장점 

  • MVI 패턴과 Jetpack Compose를 함께 사용하는 것은 안드로이드 앱 개발에서 매우 유용한 조합입니다. 두 기술을 결합함으로써 앱의 상태 관리와 UI 구성을 효과적으로 처리할 수 있으며, 다음과 같은 장점들이 있습니다.
  • 단일 상태 트리 : MVI 패턴은 앱의 상태를 단일한 데이터 모델로 관리합니다. Jetpack Compose도 상태를 뷰계층에서 관리합니다. 따라서 두 기술을 함께 사용하면 UI와 비즈니스 로직을 단일 상태 트리로 표현할 수 있습니다. 이로 인해 앱의 상태 변화를 추적하고 디버깅하기가 용이해집니다.
  • 불변성과 예측 가능성 : MVI 패턴에서는 상태 데이터를 변경 불가능하게 관리합니다. Jetpack Compose 역시 불변성을 강조하는 방식으로 UI를 업데이트합니다. 이는 예측 가능하고 안정적인 앱을 만드는데 도움을 주며, 앱의 상태 변화를 추적하기 쉽고 디버깅하기 용이합니다.
  • 선언적 UI 프로그래밍 : Jetpack Compose는 선언적인 방식으로 UI를 구성하는데, 이는 뷰의 상태를 그림으로 표현하는 방식입니다. 이에 MVI 패턴을 결합하면 UI의 상태 변화가 간단하고 명확하게 표현되므로 UI 코드가 더욱 직관적이고 가독성이 좋아집니다.
  • 테스트 용이성 : MVI 패턴과 Jetpack Compose를 함께 사용하면 뷰와 상태, 비즈니스 로직을 분리하기 쉽습니다. 이는 UI와 상태를 단일 함수로 테스트할 수 있게 만들어 유닛테스트 작성이 간편해집니다.

MVI단점

  • 복잡성 : MVI 패턴은 기능이 복잡한 앱에서 특히 잘 동작합니다. 그러나 작은 규모의 앱에서는 구현이 비교적 복잡해질 수 있습니다. 앱의 규모나 기능에 따라 MVI 패턴의 도입이 적절한지 신중히 고려해야 합니다.
  • 학습 곡선: MVI 패턴은 기존의 MVVM 패턴과는 다른 구조를 가지고 있기 때문에, 개발자들이 새로운 패턴을 익히고 적용하는 데 시간이 걸릴 수 있습니다. 특히, 비동기 작업과 상태 관리에 대한 새로운 접근 방식을 이해하는 데 시간이 소요될 수 있습니다.
  • 코드 양 증가: MVI 패턴은 뷰와 상태, 인텐트를 분리하여 구현하는데, 이로 인해 코드 양이 증가할 수 있습니다. 뷰와 상태를 분리함으로써 코드의 가독성과 유지보수성이 향상되지만, 상대적으로 더 많은 파일과 클래스가 생성되기 때문에 프로젝트 전체적인 코드 양이 늘어날 수 있습니다.
  • 과도한 분리: MVI 패턴은 뷰와 상태, 인텐트를 각각 분리하여 구현합니다. 이로 인해 작은 규모의 앱에서는 필요 이상으로 분리가 이루어질 수 있으며, 개발자들이 뷰와 상태를 완전히 이해하고 숙지하는 데 시간이 걸릴 수 있습니다.
  • 성능 영향: MVI 패턴은 상태 변경 시마다 새로운 상태를 생성하므로, 작은 규모의 앱에서는 성능에 미세한 영향을 미칠 수 있습니다. 이러한 성능 차이는 대부분 앱의 규모와 사용 사례에 따라 다르기 때문에 개발자들은 이러한 측면을 고려하여 패턴을 선택해야 합니다.

결론적으로, MVI 패턴은 많은 장점을 가지고 있지만, 앱의 규모와 개발자들의 이해도에 따라서는 적합하지 않을 수도 있습니다. 따라서 프로젝트의 특성과 요구사항을 고려하여 MVI 패턴을 도입할지 여부를 결정하는 것이 중요합니다.

 

Design Patterns | Mavericks로 MVI 패턴 찍먹해보기 (2)

 

Design Patterns | Mavericks로 MVI 패턴 찍먹해보기 (2)

Mavericks 매버릭스(Mavericks)는 Airbnb, Tonal 및 기타 대형 앱에서 사용되는 안드로이드 MVI 프레임워크로, 쉽게 배울 수 있으면서도 복잡한 플로우를 지원할만큼 강력합니다. 매버릭스를 만들 때 목표

si8ae.tistory.com

Design Patterns | Mavericks로 MVI 패턴 찍먹해보기 (3)

 

Design Patterns | Mavericks로 MVI 패턴 찍먹해보기 (3)

Mavericks + Compose + Naver API Android 앱 개발에서 최신 기술인 Mavericks와 Compose를 활용하여 Naver API를 사용하여 책을 검색하는 앱을 구현해보겠습니다. MavericksState data class SearchUiState( val keyword: String = "",

si8ae.tistory.com