[Android][MVI] 1. MVI란 무엇인가?

Choi Sang Rok·2022년 5월 6일
7

MVI

목록 보기
1/3
post-thumbnail
post-custom-banner

TDD에 대해 공부하면서, 테스트 코드 예시를 작성하면서 이해하기 전에, 사용하는 디자인 패턴에 대해 이해하는 것이 테스트 코드 작성에 도움을 줄 수 있을 것 같아, 이번 프로젝트에서 사용할 MVI 패턴에 대해 알아보려고 합니다.



❓디자인패턴, MVC, MVP, MVVM


디자인 패턴은, 개발하면서 생기는 공통적인 문제를 해결하기 위한 솔루션 입니다.

mvc, mvp, mvvm 같은 패턴들은 관심사의 분리를 통해 테스트 코드의 작성을 용이하게 해주는 등, 대규모 개발에 있어서 필수 불가결한 요소가 되었습니다.

mvc 패턴의 View와 Model 사이의 높은 결합도mvp, mvvm 패턴을 파생시켰고, 데이터와 뷰를 분리함으로써 얻는 장점으로 인해 현재는 많은 프로젝트에 mvp, mvvm 패턴을 사용하고 있습니다.

하지만, 이들도 마냥 장점만 있는 것은 아니었습니다.

mvp, mvvm 패턴을 적용하면서 직면하는 문제두 가지가 발생하였습니다

🤦‍♀️상태 문제

  • 안드로이드는 어떻게 보면 상태의 집합입니다. 화면에 나타나는 모든 정보나, 버튼 활성화 등 상태들로 구성되어 있습니다.
  • 상태들을 관리하기 힘들어지고, 의도하지 않는 방향으로 제어가 된다면 상태 문제가 됩니다.

    상태 문제의 좋은 예시로, 로그인이 실패했을 때 지속적으로 다음 화면이 보여 지는 상황이 발생합니다.

🤦‍♂️부수 효과

  • 네트워크 통신, 데이터베이스 접근 등의 부수 효과들로 인해 발생합니다.
  • 다이얼로그, 토스트 메시지, 액티비티의 이동도 이에 포함됩니다.
  • 여러 비동기 작업들이 섞여서 어떤 결과를 얻을 지 예상할 수 없고 이에 따라 상태변화에 어려움을 겪습니다.

위 문제들을 MVI에서 어떻게 풀어나가는지 확인해 보면서, MVI에 대해 알아보겠습니다.



🔥MVI


MVI는 Model, View, Intent로 이루어져 있으며, 데이터베이스, 네트워크 통신등의 작업을 진행하기 위해 SideEffect를 포함합니다.

  • 사용자 또는 시스템의 Action을 포함하는 Intent가 발생합니다.
  • Intent를 통해 Modelreducing되고, ModelObserving 하고 있던 ViewRendering을 통해 View를 업데이트 합니다.

View

  • Activity나 Fragment, 즉 하나 이상의 View

Model

  • 앱의 단일 상태
  • 뷰가 화면에 렌더링 해야 하는 것들을 명시해주는 응답으로 다음과 같은 것들이 포함 될 수 있습니다.
    • 프로그레스 진행률
    • 서버로부터 받은 데이터 목록
    • 예외
  • 다른 레이어와의 단방향 레이어 흐름을 위해 변경 불가 해야합니다.

Intent

  • 사용자 또는 앱 내의 상태를 바꾸려는 의도
  • 모델은 인텐트를 통해서, 새로운 상태로 변화할 수 있다.
    • MVI의 단점 중 하나로, 가벼운 변경 사항도 이를 적용해야 합니다.

기존의 MVC나 MVVM 같은 디자인 패턴은, 어떠한 형식에 따라 개발자가 직접 설계하는 방식이었습니다. MVI 패턴 같은 경우에도 직접 작성할 수 있으나, MVI 패턴은 제공되는 프레임워크를 통해 설계 하는것이 좋습니다.

이유는 https://appmattus.medium.com/top-android-mvi-libraries-in-2021-de1afe890f27 에서 확인할 수 있습니다.
위 링크에서, 왜 MVI 라이브러리를 사용하는지, MVI 프레임워크들의 종류들과 평가에 대해서 확인할 수 있습니다.


예고편

MVI는 순수 함수로 이루어진 Pure cycle과, 부수효과가 포함되어있는 Side effct cycle로 표현할 수 있습니다.

다음 포스팅에서는, https://orbit-mvi.org/ MVI 프레임워크 중 하나인, orbit을 사용해 MVI의 Pure cycle에 대해 이해하겠습니다.

순수 함수와 부수 효과에 대해 들어보신 적이 있나요


함수형 프로그래밍 : 부수 효과를 없애고 순수 함수를 만들어 모듈화 수준을 높이는 프로그래밍 패러다임

  • 부수 효과 : 외부의 상태를 변경하는 것, 함수로 들어온 인자의 상태를 직접 변경하는 것
  • 순수 함수 : 부수효과가 없는 함수 즉, 어떤 함수에 동일한 인자를 주었을 때 항상 같은 값을 리턴하는 함수


참고 문서
https://sungbin.land/아직도-mvvm-이젠-mvi-시대-319990c7d60
https://medium.com/@kimdohun0104/mvi-패턴에-대한-고찰-이유와-방법-그리고-한계-767cc9973c98
https://dev.to/kaleidot725/implementaing-jetpack-compose-orbit-mvi-3gea
https://yoon-dailylife.tistory.com/117

profile
android_developer
post-custom-banner

3개의 댓글

comment-user-thumbnail
2022년 5월 6일

1빠따 출석인증^^~

답글 달기
comment-user-thumbnail
2022년 5월 6일

He is my boyfriend

1개의 답글