일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- swift #swift keychain #keychain 사용법
- swift
- detect url
- ios
- DevelopmentRegion
- 기존 앱
- UIPresentationController
- 스크롤 탭
- pod install
- List
- url 추적
- 개발자 면접
- oberve url
- Android
- Tuist
- SwiftUI
- 상단 탭바
- UIViewControllerTransitioningDelegate
- DataBinding
- development language
- url 관찰
- convert base64
- notifychanged
- ViewBuilder
- scrolling tab
- base64 변환
- transformation.map
- Side Menu
- GeometryReader
- Swift Package Manager
- Today
- Total
버그 잡이
MVVM 패턴이란? #MVVM #MVP #Android 본문
1. MVVM이란?
기존의 MVP가 가지는 문제를 해결하고자 나온 모델입니다..
기존 MVP 모델은 view와 presenter의 의존성이 강하다는 것이 문제였는데
MVVM은 "viewmodel은 view를 모르는 구조"로 설계함으로써 view와 viewmodel의 의존성을 느슨하게 만들었습니다.
2. MVP vs MVVM
"ViewModel은 View를 모른다"
그림에서 볼 수 있듯이 가장 큰 특징은 mvp에서는 presenter에서 view를 참조하고 있는데
mvvm에서는 viewmodel이 view를 참조하고 있지 않습니다.
이 특징 덕분에 기존 mvp 패턴에서 presenter와 view간의 의존성이 높아져 발생할 수 있는 문제를 어느 정도 해결할 수 있게 해줍니다.
'클래스간 의존성이 높아지면 어떤 문제가 발생할 수 있을까요?'
클래스간 의존성이 높아진다는 것은 클래스간 결합도가 높아진다는 것이고 이는 서로간 데이터와 로직을 침범할 가능성이 크고 추후 유지보수에 있어 각 모듈만 고려하는 것이 아니라 결합도가 높은 다른 클래스까지 고려해야 하기 때문에 더 많은 비용이 듭니다.
-> MVVM은 ViewModel이 view알 수 없게 함으로써 둘 간의 의존성을 떨어뜨립니다.
(완전한 제거라고 말씀드리지 못 하는 것은 view에서는 viewmodel을 참조하고 있기 때문입니다.
하지만 이 또한 android에서는 data-binding이라는 라이브러리를 활용하여 의존성을 더욱 느슨하게 할 수 있습니다.)
"그렇다면 view는 어떻게 최신 데이터를 반영할 수 있을까요?"
mvvm은 viewmodel의 data를 view가 구독하는 방식을 취함으로써 최신 데이터를 ui에 반영할 수 있도록 합니다.
이를 위해서 Observer 패턴이 사용됩니다.
MVVM의 가장 큰 특징이 바로 이 옵저빙 패턴을 취한다는 것입니다.
3. MVVM과 Data-Binding
안드로이드에서 mvvm패턴은 data-binding을 함께 사용합니다.
'왜 data-binding을 사용할까요?' 'data-biniding을 통해서 얻을 수 있는 효용은 무엇일까요?'
위 그림을 보면 View와 Viewmodel 사이에 databinding 클래스가 둘을 이어주는 매개체 역할을 하는 것을 볼 수 있습니다.
이렇게 사용자의 action을 viewmodel로 전달하는 코드(클릭 이벤트 등)와 viewmodel의 데이터 변경 알림(기존의 옵저버) 코드를 UI코드에 databinding 으로 정의함으로써 view와 viewmodel의 의존성을 더욱 낮춰줍니다.
(실제로 코드를 작성할때도 activity와 fragment에 관련 코드가 남지 않기 때문에
xml에서는 뷰 관련된 처리를 하고 activity, fragment는 생명주기와 관련된 코드, 권한 설정과 같은 시스템과의 상호작용에 대한 처리만 해주면 됩니다.)
3줄 요약
1. 기존 mvp패턴은 view와 presenter간의 의존성이 높은 문제가 있다.
2. mvvm은 이를 해결하고자 독립적인 viewmodel을 만들고 view가 viewmodel을 구독(observing)하는 패턴으로 설계하였다.
3. 안드로이드에서는 data-binding을 활용하면 view와 viewmodel간의 의존성을 더욱 낮출 수 있고 보다 깔끔한 코드 관리가 가능하다.
*참고
medium.com/@jsuch2362/android-에서-mvvm-으로-긴-여정을-82494151f312
https://www.slideshare.net/DEVIEW_NAVER/d2-campus-tech-meetup-android-prism-mvvm-test
'안드로이드' 카테고리의 다른 글
[안드로이드, Kotlin] 내가 만든 CustomView 모음 #ProgressBar #TimePicker #EditText (0) | 2020.05.07 |
---|---|
[android] edittext 적용시 확인해야할 디테일. #editTextInputFilter 코틀린에 적용하기 (0) | 2020.05.01 |
android 알람 앱 시간 설정 #Calendar #LocalDateTime #joda-time (0) | 2020.04.30 |
android 알람 앱 "어떤 service를 사용해야할까?" # 음악 재생 (0) | 2020.04.30 |
[Kotlin] 안드로이드 recyclerView 클릭 리스너 달기 #onItemclickListener (2) | 2020.04.28 |