개발이야기/개발 기타

Android의 아키텍쳐 패턴 MVC, MVP, MVVM, MVI

dreibell 2023. 6. 29. 14:36

안드로이드 어플리케이션 개발을 위한 기본적인 CS지식을 찾다 보면 대부분 초반에 보게되는

바로 아키텍쳐 패턴이다. 그런데 아키텍쳐 패턴이란 무엇이고, 왜 알아야 하는걸까?


아키텍쳐 패턴(Architecture Pattern)

 

아키텍쳐 패턴에 대해 이야기 하기 전에 우린 소프트웨어 아키텍쳐(Software Architecture) 라는

단어에 대해 먼저 이해 해야한다. 소프트웨어 아키텍쳐란 소프트웨어의 구성요소, 구성요소의 특징

그리고 각 구성요소 간의 관계를 표현하는 구조나 구조체를 말한다.

 

소프트웨어 아키텍쳐 설계의 기본 원리는 아래 4가지로 이루어져있다.

 1. 모듈화 : 소프트웨어의 성능향상 및 유지보수가 용이하도록 시스의 기능을 모듈 단위로 나누는 것

 2. 추상화 : 전체적이고 포괄적인 개념을 설계한 후 구체화 시켜 나가는 것

 3. 단계적 분해 : 상위 개념부터 하위 개념으로 구체화 시키는 하향식 설계 전략

 4. 정보 은닉 : 모듈 내부에 정보와 자료들을 숨겨서 다른 모듈이 접근하거나 수정 못하도록 하는 것

 

소프트웨어를 구성하는 작은 기능 하나하나를 모듈 이라고 하고, 이 모듈들을 기능별로 묶어놓은

집합을 컴포넌트 라고 할 때, 각 모듈들을 어떻게 분할하고 컴포넌트에는 어떤 모듈이 들어가는지

또 어떻게 배치할 것인지 등을 결정할 때 참고하는 것이 소프트웨어 아키텍쳐이며,

수많은 소프트웨어 아키텍쳐 중 우리가 자주 사용하는 모형들을 정립화 시켜 패턴으로 만든것이

아키텍쳐 패턴이다

 

디자인 패턴 vs 아키텍쳐 패턴

많은 사람들이 아키텍쳐 패턴이라는 단어와 동시에 자주 보고 그만큼 헷갈려 하는게 디자인 패턴(Design Pattern)이다.

비슷한것 같지만 아키텍쳐 패턴은 한 소프트웨어의 큰 뼈대나 고수준의 기반을 담당하고

디자인 패턴 각 모듈이 어떤 기능을 하는지, 클래스의 범위는 얼만큼인지, 함수의 목적이 무엇인지 등

코드 수준 디자인을 담당한다는 차이가 있다. 즉, 아키텍쳐는 큰 범주의 설계를 디자인은 작은 범위의

설계를 담당하는 솔루션이라는 것이다.

 

안드로이드의 아키텍쳐 패턴

안드로이드 환경에서 주로 쓰이는 아키텍쳐 패턴은 MVC, MVP, MVVM, MVI 네가지가

있으며, 아래에서 각각 패턴들을 구성요소의 역할, 장·단점, 특으로 나누어 설명하겠다.

MVC

출처 - MVC (Model View Controller) Architecture Pattern in Android with Example - GeeksforGeeks

구성요소

 - Model : 데이터를 저장하는 역할을 한다.

 - View : 화면구성의 역할을한다.

 - Controller : Model과 View를 연결하고 제어하는 역할을 한다.

 

장점 : 구현하기 쉬워 간단한 프로젝트를 개발하는데 적합하다.

단점 : 하나의 클래스 코드량이 몰리기 쉽고, View와 Model간의 의존도가 높아 기능 추가 및 유지보수가

          어렵다.

 

MVP

출처 - MVP (Model View Presenter) Architecture Pattern in Android with Example - GeeksforGeeks

구성요소

 - Model : MVC와 같이 데이터와 관련된 처리를 담당한다.

 - View : 이벤트가 발생하면 Presenter에 알린 후, 반환받은 처리에 따라 UI를 갱신한다.

 - Presenter : View에서 받은 이벤트를 처리하여 다시 View에 반환한다. Model의 경우도 같다.

 

장점 : View와 Model간의 의존도를 줄일 수 있다.

단점 : View와 Presenter는 1:1로 매칭되어있어서 서로의 의존도가 높다.

 

MVVM

출처 - MVVM (Model View ViewModel) Architecture Pattern in Android - GeeksforGeeks

구성요소

 - Model : ViewModel이 요청한 데이터를 반환한다.

 - View : 사용자의 Action을 받는다. Activity와 Fragment가 이를 담당한다.

 - View Model : View가 요청한 데이터를 Model로 요청한다.

 

장점 : ViewModel이 View에 대한 의존성이 없기 때문에 유닛 테스트가 용이하고 유지보수성 또한 좋다

단점 : 다른 패턴들에 비해 구현 난이도가 높은편이고 Databinding, LiveData 등 라이브러리의 사용법을

          필히 알아야한다. 

 

MVI

{"originWidth":519,"originHeight":323,"style":"alignCenter","caption":"출처 - Android MVI (Model-View-Intent) Architecture — Example code

구성요소

 - Model: 다른 패턴들에서 Model은 데이터를 가지고있거나 서버와의 통신을 위한 다리 역할로 사용되고

               있지만, MVI 에서의 Model은 데이터를 가지면서, 동시에 앱의 상태를 나타내주는 역할도 한다.

 - View : Activity나 Fragment를 나타내며, 앱의 상태를 받아 화면에 렌더링 하는 역할을 한다.

 - Intent : 어플리케이션이나 사용자의 행위를 나타내기 위한 의도이다. View에서는 Intent를 발생시켜

               Model에 전달하고, Model에서는 이 Intent를 처리하여 상태를 변경한다.

 

장점 : 데이터 플로우가 단방향 사이클의 성격을 띄는 덕에, 유지보수성과 확장성이 뛰어나다.

단점 : 다른 패턴에 비해 러닝커브가 클수도 있으며, 반응형 프로그래밍과 멀티쓰레드에 대한 지식이 요구된다.


이상으로 긴글 읽어 주셔서 감사하며, 잘못된 정보에 대한 댓글도 언제든 환영합니다!