디자인 패턴을 공부하기 전에, 우선 '소프트웨어 공학'이라는 것을 알아야합니다.
소프트웨어 공학이란, 소프트웨어의 개발/운용/유지보수 등의 생명주기 전반을 체계적이고 서술적이며 정랼적으로 다루는 학문입니다. 즉, 공학을 소프트웨어에 적용하는 것입니다.
디자인 패턴 또한 소프트웨어 공학에서 특정 문맥에 공통적으로 발생하는 문제에 대해 재사용이 가능하게 만들어놓은 해결책입니다.
개발자들이 애플리케이션/시스템을 디자인할 때 발생하는 공통된 문제들을 해결하기 위해 사용됩니다.
안드로이드 앱을 논리적 구성 요소들로 체계화하려는 노력은 지속되어 왔습니다. 가장 기초적인 MVC(Model View Controller) 패턴으로 시작해서 더 모듈화되고 테스트 가능한 패턴으로 발전해왔습니다.
대표적으로는 MVP(Model View Presenter)와 MVVM(Model View ViewModel)이 가장 많이 사용되며 어느게 더 좋다는 정답은 없습니다. 각 디자인패턴의 특장점은 확실하고 상황에 따른 방법론의 선택이 중요한 것 같습니다.
Model: Application의 두뇌라고 볼 수 있습니다. 데이터 + 상태 + 비즈니스 로직을 다룹니다. View나 Controller에 묶여 있지 않아 재사용이 가능합니다.
View: 모델의 내용들을 표현해줍니다. 사용자가 Application을 사용할 때 Controller와 통신합니다. 하지만 MVC에서 View는 모델에 대한 지식이 없고 사용자와 application이 상호작용을 할 때 수행하는 작업을 이해하지 못합니다.
Controller: Model과 View의 중간에서 데이터 변경이나 상호작용을 관리해 View나 Model을 업데이트시켜줍니다.
동작
특징
단점
MVC의 문제점을 해결하기 위해 나온 패턴으로 일단 Controller를 분리해서 책임을 줄이고 View와 Activity/Fragment가 자연스럽게 결합되도록 만들었습니다.
Model: MVC의 Model과 같은 역할을 합니다.
View: ActivityFragment가 View의 일부분으로 간주됩니다. Activity가 View Interface를 implements하여 이를 통해 특정 View에 결합하는 것을 제거하고 View의 모의 구현으로 단위 테스트가 가능해집니다.
Presenter: MVC의 Controller의 역할이지만 View에 전혀 연결되어 있지 않은 인터페이스입니다. 이를 통해 모듈성, 유연성 문제뿐만 아니라 테스트 가능성 문제를 해결합니다.
동작
특징
단점
MVVM은 Data-binding을 사용해 더 쉬운 테스트 및 모듈화의 이점을 동시에 제공하고 View + Model을 연결하기 위해 작성하는 Glue 코드 양을 줄여 줍니다.
흔히 말하는 객체지향 디자인패턴의 옵져버 패턴을 본떠 만든 구조같습니다. 옵져버의 역할은 ViewModel이라는 친구가 하게 됩니다.
Model: MVC의 Model과 같습니다. 기존 모델에 business logic을 추가하기 위해 MVVM에 SquareParams라는 Model을 추가했습니다. DB사용이나 Retrofit을 통한 백엔드 API 호출 등을 주로 수행합니다.
View: 가변적인 방식으로 ViewModel에 의해 노출되는 관찰 가능한 변수 및 작업에 바인딩됩니다. (ViewModel을 관찰해 UI를 갱신)
ViewModel: Model을 wrapping하고 View에 필요한 관찰 가능한 데이터를 준비합니다. 또한 View가 이벤트(evnet)를 Model에 전달하기 위한 hooks(BindingAdapter)를 제공합니다. 하지만, ViewModel은 View에 연결되어 있지 않습니다.
동작
특징
단점
MVP와 MVVM 모두 앱을 모듈화하고 단일 책임 요소를 분할하는데 MVC보다 더 나은 작업을 수행하지만 Application에 더 많은 복잡성을 추가하게 됩니다. 오히려 앱이 간단하고 라이브하지 않다면 MVC가 더 적합할 것입니다.
중요한 것은 현재 개발하는 Application에 최적의 구조를 스스로 응용해 만들 수 있어야 한다는 것..!
저 또한 지금까지 MVC, MVP를 이용한 개발만을 해왔기에 이번 공부 기회에 MVVM에 대해서 더 자세히 알아보고 직접 코드를 작성해봐야겠습니다.
[참고]
https://velog.io/@its-mingyu/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4MVC-MVP-MVVM
https://ardor-dev.tistory.com/12