[kotlin] 안드로이드 MVI 이해하기

Boknami·2024년 2월 27일
0

코틀린

목록 보기
18/19

🔍 MVI

이번 프로젝트의 디자인 패턴의 후보가 MVVM과 MVI였는데, MVI가 안드로이드에서 사용하기 적합하고 최근엔 AOS에서도 MVI패턴을 사용하는 경우도 이야기를 들어왔던터라 MVI패턴을 사용하기로 결정!


🤔 MV는 알겠는데 I?

M -> Model
V -> View
I -> Intent

솔직히 처음엔 이 그림을 봐도 무슨 의미인가..싶었다.
앱이 진행되는 흐름에 따라서 보면 이해가 조금 더 쉬울 것이다.

  1. 사용자가 앱을 사용하다가 버튼을 눌렀다.(화면 터치)
  2. Intent쪽으로 해당 Event(터치)가 전달된다.
  3. Intent가 상황에 맞는 Model(상태)를 업데이트한다
  4. View는 Model(상태)를 보고 있다가 변화가 일어날 때마다 감지해서 상태에 맞는 화면을 그려준다.

이 그림에서의 핵심은 데이터의 흐름이 단방향이라는 것이다!


🤷‍♂️ 단방향 흐름? 그게 왜?

데이터의 흐름이 간결화되어서 더 좋은 건 알겠는데 뭔가 확 와닿지는 않았다.
단방향 흐름을 채택하면서 얻어지는 이점들은 다음과 같다.

  • 상태 관리가 예측이 가능 + 상태 관리가 간단
  • 데이터 흐름이 명확하다
    => 데이터가 어디서 와서 어디로 흐르는지 쉽게 파악이 가능(유지보수 이점)
  • 상태의 불변성
    => 새로운 State(상태)를 만들 때 이 전 상태를 바꾸는 거 없이 새로운 객체를 생성!
  • UI일관성
    => 새로운 State(상태) 적용마다 UI가 갱신되어 일관된 환경을 제공
  • 테스트 용이
    => 각 요소가 입력을 받고 출력을 생성하기 때문에 모듈화되고 단위 테스트에 용이

🤔 MVC,MVVM 등에서의 Model과는 다르네?

이 부분에서 이해하는 게 조금 오래 걸렸다.
일단 정리한 바로는 아래 그림과 같았다.

원래 MVC,MVVM에서의 Model은 대부분 데이터를 다룬다고 생각하고 있었다.(약간의 비지니스 로직과 함께?..) 그러나 MVI에서 Model은 데이터를 포함하면서 State. 앱의 상태를 함께 가지고 있는? 느낌이었다.

  • 응? 상태?
    그럼 이제 상태란 뭘까라는 생각이 든다..
    상태를 3가지로 나누어서 보자면
  1. 현재 화면의 데이터 : 예를 들어 카운터 앱에서 현재 카운트 값
  2. 비즈니스 로직의 결과물 반영 : 예를 들어 사용자가 장바구니에 담은 상품들의 정보 등
  3. 사용자 인터페이스의 상태 반영 : 예를 들어 화면이 지금 로딩 중인지, 데이터가 없는 상태인지, 입력 대기 중인지 등

간단히 말해, 모델은 사용자가 수행한 동작에 따라 변경되는 앱의 상태를 나타내며, 이러한 상태 변화는 비즈니스 로직의 실행 결과물로 반영된다!


🤷‍♂️ 불변성이라며? 새로 만들어서 교체하면 결국 변한거 아니야?

이 부분에서 이해가 잘 안되었다!
새로운 상태를 만들어 교체하기 때문에 기존의 상태 객체를 삭제하는 것이 아니라, 이전 상태 객체는 그대로 유지된다고 한다.(메모리에 남는) 그런데 애초에 기존의 상태를 다른 걸로 교체하면 결국 이게 바뀐 거니까 불변성이 깨지는 거 아니야? 라고 생각했었다.

여기서 집중해야할 건 불변성 그 자체이다.
불변성이란 말을 오해를 하면 안된다.
불변성의 정의는 <한 번 생성된 객체의 내부 상태를 변경할 수 없음>이다.

즉 객체 내부의 상태를 우리가 직접 변경하는 게 아니고 새로운 객체로 교체 하기 때문에 우리가 객체 내부에 코드를 손대어 변경한 게 아니기 때문에 불변성이 유지된다고 하는 것이다!!

0개의 댓글