상세 컨텐츠

본문 제목

디자인 패턴 MVC, MVP 그리고 MVVM 학습

공부/안드로이드

by dofury 2023. 7. 3. 18:54

본문

728x90

안드로이드을 공부함에 있어 지금껏 디자인 패턴에 대해 공부한 적이 없는 것 같아 학습을 하기로 했다.

3가지 패턴에 대해 학습한 내용을 서술할 예정이고,

특히 안드로이드에서 사용하는 MVVM에 대해 구체적으로 다뤄볼것이다.

 

1.  MVC

구성요소

(View, Model, Controller)

 

Model - 어플리케이션 내에서 데이터, 데이터 처리를 담당

View - 데이터를 보여주는 UI

Controller - Model과 View 사이의 상호작용을 관리

 

특징

 - 사용자의 입력을 컨트롤러를 통해 모델에 업데이트하고, 모델의 변경은 뷰에 반영

 

장점

- 단순한 패턴이라 구현 용이

 

단점

- View와 Model 사이의 의존성이 높음

 

2. MVP

구성요소

(View, Model, Presenter)

 

Model - 어플리케이션 내에서 데이터, 데이터 처리를 담당

View - 데이터를 보여주는 UI

Presenter - View에서 요청한 정보로 Model 가공후 View로 전달,  View와 Model 사이에서 중개자 역할을 수행

 

특징

 - Model 과 View가 분리 되어있으며, Presenter을 통해 상태나 변화를 알려줌

 

장점

- Model과 View에 의존성을 해결

 

단점

- View와 Presenter의 의존성 문제

 

3. MVVM

 

구성요소

(View, Model, View Model)

 

Model - 어플리케이션 내에서 데이터, 데이터 처리를 담당

 

View - 데이터를 보여주는 UI

- IOS는 View(View + View Model)

 

View Model - View를 위한 Model, View와 Model 사이에서 상호작용 

- View Binding을 통하여 View와 연결

- View Model은 View와 Data Binding

 

특징

 - MVC 패턴에서 Controller를 빼고 ViewModel을 추가한 패턴

 

장점

- View와 Model이 서로 전혀 알지 못하기에 독립성을 유지

- 독립성을 유지하기 때문에 효율적인 유닛테스트가 가능

 

단점

- ViewModel을 설계하는 어려움

- 데이터 바인딩이 필수적으로 요구

동작 순서

  1. 사용자의 Action들은 View를 통해 들어옴
  2. View에 Action이 들어오면, Command 패턴으로 View Model에 Action을 전달
  3. View Model은 Model에게 데이터를 요청
  4. Model은 View Model에게 요청받은 데이터를 응답
  5. View Model은 응답 받은 데이터를 가공하여 저장
  6. View는 View Model과 Data Binding하여 화면에 출력

 

Data Binding

- 데이터와 연결된 UI 요소를 자동으로 동기화하는 것

 

사용 방법

 

- app/build.gradle 에 dataBinding 요소를 추가

android {
    ...
    dataBinding{
        enabled = true
    }
}

 

* data binding을 사용하는 xml 리소스는 <layout> 루트 태그로 시작

 

* binding class는 레이아웃 파일 이름을 따라 자동 생성 ex) MainActivityBinding

 

- Activity 에서 기존의 setContentView() 함수를 DataBindingUtil.setContentView() 로 교체 

 

- view 에 보여줄 이름 data class 를 선언

 

- xml에 있는 <layout> 태그 안에 <data> 요소를 작성

<data>
     <import type="android.view.View"/>
     
     <variable
           name="'data class name'"
           type="'packgeName'.databinding.'name'"
</data>

 

-  Activity 에서 Data 객체를 초기화

...private lateinit var binding: ActivityMainBinding
binding = DataBindingUtil.setContentview(
	this,
	R.layout.'layout name'
	)
val data = Data(...)
binding.data = data

 

 

728x90

관련글 더보기

댓글 영역