디자인 패턴의 차이점

2021. 10. 11. 19:03android

MVC 디자인 패턴


1. 개념

-> MVC는 View - Model - Controller의 구조로서 View(Activity/Fragment)가 UI갱신 및 Controller 역할까지 모두 담당하는 패턴을 의미합니다.
안드로이드에서 사용하는 기본적인 패턴이며, view에서 리스너를 셋팅하여 이벤트 발생시 처리하는 가장 단순한 구조입니다.

2. MVC의 장점

1) 코드를 이해하기 쉽다.
2) 구조가 단순하기 때문에 빠르게 짧은 개발기간 안에 완성 가능하다.

3. MVC의 단점

1) 프로젝트 규모가 커질 수록 복잡한 구조를 갖게 된다.
2) 기능별 구현이 제대로 되어있지 않기 때문에 실수할 가능성이 높아진다.
3) 모든 컴포넌트들 간의 의존성이 강하다.

4. 구조

통상적인 MVC 패턴은 아래사진 왼쪽처럼 구분지을 수 있습니다. 하지만 안드로이드에서는 View(액티비티/프래그먼트)가 Controller의 역할을 이미 수행할 수 있도록 구현되어져 있기 때문에 View가 Controller의 역할까지 모두 커버하고 있는 오른쪽 모습처럼 구현이 가능합니다.

1) View

: View는 사용자의 이벤트를 인지하여 Model에게 데이터를 요청하고 UI를 업데이트하는 역할을 합니다.

2) Controller

: 구분짓는게 의미가 있는가 싶지만.. 일단 컨트롤러는 View로부터 들어오는 요청값을 Model을 통해 얻어오고 이를 다시 View에게 전달하는 중재자 역할을 합니다.


3) Model

: Controller로부터 요청받은 작업을 수행하는 역할을 담당한다.

5. 코드

6. MVC 패턴 결론

: 가장 단순하고 직관적인 구조를 갖지만 프로젝트 규모가 커질 수록 매우 유지보수가 어려운 형태의 패턴입니다.
또한 각 컴포넌트 간의 의존성이 강하기 때문에 컴포넌트의 일부만 수정한다고 해도 전반적인 문제를 야기할 수 있습니다.

MVP 디자인 패턴


1. 개념

: MVP 디자인 패턴은 MVC 디자인 패턴에서 Controller를 명확하게 분리한 구조의 형태를 띄는 디자인패턴입니다.
View - Presenter - Model로 구분되어져 있으며 기능별로 아키텍처를 구성합니다.

2. MVP 장점

1) 기능별로 class를 명확하게 구분했기 때문에 프로젝트 규모가 커지더라도 유지보수가 MVC보다 효율적이다.
2) Interface를 활용하여 아키텍쳐를 구성하면 interface만 보고도 해당 클래스의 역할을 쉽게 파악할 수 있다.

3. MVP 단점

1) View와 Presenter의 의존성이 강하기 때문에 Presenter에서의 일부 수정이 View에 큰 영향을 미친다.
2) MVP 패턴을 구성하기 위해 interface, presenter, view등 구성해야하는 리소스 값들이 많아진다.

4. 구조

1) View

: 이벤트를 감지하여 Presenter에게 알리는 역할과 Presenter로부터 데이터를 받아 UI를 갱신하는 역할을 한다.

2) Presenter


: View로부터 이벤트가 발생하면 Model에게 Data를 요청한다. 그리고 Model로부터 받은 데이터를 View에게 전달한다.

3) Model


: Presenter로부터 요청받은 Data를 가공하여 다시 Presenter에게 전달한다.

5. 코드

먼저 Contract interface 내부에 View에서 UI를 업데이트하기 위한 메서드와 Presenter가 수행할 메서드를 정의한다. 이러한 Contract를 선언하여 MVP를 구성하는 방법은 여러 구현 법 중 하나다.


View인 Activity는 Presenter를 객체화하여 갖고 있는다. 때문에 presenter와 View 사이의 의존성이 발생한다. 그리고 Contract interface의 SettingView를 implements하여 Presenter에게 전달할 콜백을 구성한다.


여기서 view는 Contract의 SettingView interface를 의미한다. 따라서 SettingView를 implement한 SettingActivity를 통해 SettingView interface를 얻고 setList가 수행되면 Activity에서 구현한 setList()메서드가 수행되도록 한다.

6. MVP 디자인패턴 결론

-> MVP 디자인 패턴은 MVC 디자인 패턴의 약점을 보안하여 나오게 되었다. 때문에 역할 별로 class구분이 명확하고 interface만 봐도 어느정도 class의 역할을 짐작할 수 있는 장점이 있다. 하지만 View와 Presenter의 강한 의존성 문제가 존재하는데 이는 Hilt나 Koin같은 의존성 주입 라이브러리와 함께 사용하면 충분히 해결될 수 있는 문제같다.

MVVM 디자인 패턴


1. 개념

-> MVVM은 View - Model - ViewModel를 사용하여 기능별로 아키텍처를 구성하는 하나의 방법입니다.

2. MVVM의 장점

1) Event-driven 방식이 아닌 Observe 방식이다. 그렇기에 관찰하고 있는 뷰에 업데이트가 발생하면 즉각적으로 처리하기 때문에 데이터의 통일성이 보장된다.

2) LiveData를 사용한 Observe 방식이기 때문에 lifeCycle에 따른 일처리를 보장한다. 따라서 memory Leak문제에 대해서 자유롭다.

3) ViewModel을 사용하기 때문에 데이터를 재활용 할 수 있다. 뷰(액티비티/프래그먼트)는 Configuration이 변경되면 reCreate되기 때문에 lifeCycle을 다시 진행하는 경우가 있다. 이때 데이터를 불러오는 연산이 들어가 있다면 재생성 때마다 데이터를 호출할 것이다.

하지만 별도의 lifeCycle을 갖고 동작하는 viewModel이 data를 홀딩하고 있으면 뷰가 reCreate되더라도 viewModel가 홀딩하고 있는 데이터를 재활용할 수 있기 때문에 매번 데이터를 호출할 필요가 없다.

3. MVVM의 단점

1) 기본적으로 알고 있어야하는 개념이 많아야 하기 때문에 러닝커브가 높다.
2) 프로젝트를 구성하는데 오랜 시간이 걸린다.

4. 구성

1) View

: view는 유저로부터 이벤트를 인지하여 이를 ViewModel에게 알려주는 역할을 합니다.

기존의 디자인 패턴들과 다르게 MVVM에서 View는 UI를 업데이트하는 역할이 아닌, viewModel을 관찰하고 이벤트 발생을 알아차리는 역할을 담당합니다. 이 처럼 view의 역할이 심플해지고 명확해지면서 다른 디자인 패턴들보다 의존성 문제가 훨씬 적어지게 됩니다.

2) ViewModel


: Model을 통해 데이터를 처리하고 UI를 갱신하는 역할을 담당합니다. 또한 뷰의 Reference를 갖지 않게하기 위해서 DataBinding과 LiveData를 이용하여 UI를 갱신합니다. 이를 위해서 DataBinding과 LiveData를 사용하도록 합니다.

dataBinding 사용 시, recource에서 <data>와 <variable> 태그를 통해 view가 생성한 ViewModel 객체를 얻도록 할 수 있습니다. 따라서 레이아웃의 UI 구성요소(TextView,Button.. etc)들과 ViewModel에서 다루고 있는 데이터 요소들을 결합하게 되면 그 즉시 레이아웃의 구성요소들에게 viewModel의 데이터를 셋팅함으로써 UI를 갱신할 수 있습니다.

즉!!! View는 UI 업데이트를 전혀 관여하지 않게 됩니다. 따라서 통일된 데이터 값을 즉각적으로 사용하고 이를 넘겨주눠서 UI를 업데이트 하기 때문에 UI 업데이트 코드를 작성할 일이 줄어들게 됩니다. 단순히 값을 전달해주고 알아서 갱신하도록 하기 때문에 UI 코드를 작성할 일도 적어지고 memory leak, 데이터 정합성, null 문제 등이 해결됩니다.

3) Model


: model은 기본적으로 연산처리를 담당하는 역할을 합니다. 예로 API 호출, DB 호출 등 이렇게 데이터를 처리하여 ViewModel에게 전달합니다.

아래 그림은 Repository pattern의 component diagram입니다. 여기서 Model이라 하면 repository가 담당하고 있는 일이 바로 MVVM에서 Model을 의미합니다.

6. 코드

7. MVVM 디자인 패턴 결론

-> 다양한 기술을 알고 있어야하기 때문에 러닝커브가 높다. 하지만 다른 디자인 패턴들보다 더 깔끔한 구성을 보여준다. 나도 공부하고 있기 때문에 결론은 조금 더 미뤄야 할 것 같다 ^^;;

'android' 카테고리의 다른 글

LiveData 구조 및 원리  (0) 2021.11.09
[Android] Coroutine을 공부하며..  (0) 2021.10.31
2021 네이버웍스 인턴 후기  (3) 2021.09.13
코루틴이란?  (2) 2021.04.29
Glide란?  (0) 2021.01.18