[Android] 디자인 패턴 정의 및 종류(MVC,MVP,MVVM,MVI,Singletion,Observer)
안드로이드 앱을 개발할때 여러가지 디자인 패턴을 사용한다.
오늘은 자주 사용하는 디자인 패턴에대해 알아보고, 그 종류와 각각의 특징에 대해 알아볼 것이다.
1) 디자인 패턴 이란?
- 코드내에서 반복적으로 발생하는 문제를 해결하기위해 재사용이 가능한 형태로 만든 정형화 해놓은 해결책이다.
- 주로 클래스나 객체간의 관계를 다룬다.
- 그렇기 때문에 특정 상황에서 어떤 클래스들이 협력하는지, 각 클래스가 어떤 역할을 하는지를 명확하게 정의한다.
간단하게 말해 코드의 작은 부분에서 발생하는 문제에 대한 해결책을 제시해준다고 보면 된다.
2)안드로이드에서 주로 사용하는 디자인 패턴의 종류
MVC (Model-View-Controller)
- Model : 데이터와 비즈니스 로직을 처리하는 부분이다.
- View : 사용자에게 보이는 UI부분이다.
Controller : 사용자로부터 액션을 받고 처리하는 부분이다. (모델과 뷰 간의 상호 작용을 관리)
- 장점
- 구현하기 쉽고 빠르게 작업이 가능하다.
- 단점
- Controller/View가 결합되어있어 테스트가 힘들다
- Model과 View의 의존성이 높다.
MVP (Model-View-Presenter)
MVC의 확장으로, 뷰와 모델 간의 직접적인 의존성을 낮추고, 프레젠터를 통해 사용자 인터페이스와 비즈니스 로직을 분리한다.
- Model : 애플리케이션에서 사용되는 실제 데이터 및 데이터 조작 로직을 처리하는 부분이다.
- View : 사용자에게 보이는 UI부분이다.
Presenter : View에서 요청한 정보를 가공하여 View로 전달하는 부분이다.
- 장점
- Model과 View의 의존성이 없다.
- Model은 Presenter의 요청만을 수행한다.
- 단점
- 필요한 클래스 수가 증가한다.
- 기능이 추가될수록 분리가 어렵다.
MVVM (Model-View-ViewModel)
뷰와 모델 간의 의존성을 줄이고, 데이터 바인딩을 통해 뷰모델이 뷰와 모델을 연결한다. Observe Pattern을 이용해 객체의 변경이 일어날때마다 UI를 갱신한다.
- Model : 애플리케이션에서 사용되는 실제 데이터 및 데이터 조작 로직을 처리하는 부분이다.
- View : ViewModel의 데이터들을 구독하고 있다가, 객체가 변할때 UI 업데이트를 진행한다.
ViewModel : Model과 상호작용하며, View에 종속되지않고 1:N 구조를 갖는다.
장점
View와 Model이 독립되어 있다.
ViewModel에서 View 코드가 없기때문에 UnitTest를 쉽게 할수 있다.
- 단점
- 데이터 바인딩이 필수적으로 요구 된다.
- View에대한 처리가 복잡할수록 ViewModel이 거대해진다.
MVI (Model-View-Intent)
- Model : intent로 전달받은 객체에 맞추어, 새로운 불변객체를 Model로 생성한다.
- View : Model의 결과물인 상태를 구독하고 있다가, 변경시 UI 업데이트를 진행한다.
- Intent : Model에게 앱의 상태를 전달한다.
💡 Intent 앱의 상태를 바꾸려는 의도를 의미한다.
MVI에서 Model에서 호출되는값은 불변하기에, 예상이 가능한 값이어야 한다. ,다만 서버나 데이터베이스에서 값을 가져올경우,값을 예측할 수 없다. 따라서 SideEffect를 통해 제어하게 된다.
💡 부수효과(side effect) 원래의 목적과 다르게 다른 효과 또는 부작용이 나는 상태를 의미한다. 예) 네트워크 통신시, 데이터를 가져오는 함수가 데이터를 못가져올때
compose가 도입되면서 상태에따른 변화가 많아졌기떄문에 더욱이 떠오르는 패턴인것 같다.
장점
하나의 State객체만을 바라보기 떄문에 상태충돌이 일어나기 어렵다.
데이터의 흐름을 파악하기 쉽다.
단점
Model Update를 위해 새로운 인스턴트를 끼워넣기때문에,리소스가 낭비될수 있다.
작은 변경에도 intent를 거쳐야 한다.
Singleton Pattern:
애플리케이션 전체에서 단일 인스턴스를 유지하는 패턴으로, 전역 상태 또는 리소스에 접근할 때 사용된다.
Observer Pattern:
객체 간의 일대다 의존성을 정의하여 한 객체의 상태 변경이 다수의 종속 객체에 자동으로 알릴 수 있게 하는 패턴으로, LiveData 등에서 사용된다.