MVC
Activity에 Data List를 세팅 및 전달 해주고, UI Component에 값을 뿌려줬던 방식
MVC의 단점
- 복잡한 앱일수록 Activity가 수행하는 기능이 많아진다
- 수행하는 기능이 많아질수록 코드 수 증가 > 내가 찾고자 하는 코드를 찾기 어려움 > 유지보수 어려움
- 현업 시 하나의 기능을 추가 및 수정할 때 코드가 연쇄적으로 연결되어 있어 전체를 고쳐야하는 상황이 발생할 수 있다
MVVM
- View
- Activity, Fragment, .xml와 같이 화면에 보여지는 UI
- 텍스트 입력, 버튼 터치 등과 같은 UI Event, Action 받음
- UI 관련 로직 수행
- ViewModel
- View에 필요한 데이터를 Model로부터 가져와 가공 및 변환
- UI와 관련된 데이터 처리
- View가 Observe하고 있기 때문에 View가 변경된 데이터를 갱신할 수 있도록 LiveData로 변경사항 전달
- Anti-Pattern: View의 Context를 가지고 있으면 안됨
- Model
- Data와 Business Logic 담당
- Model
- Data와 Business Logic을 담당
- Data : Db, Network, File 데이터 소스
- Data와 Business Logic을 담당
Observer Pattern
Event가 발생되면 이벤트를 관찰하던 Observer들이 바로 반응하는 패턴
사용 예시
- Observer interface 정의
interface Observer { fun update() }
- Observer interface를 구현한 클래스 정의
//관찰자 1 : 강아지 class Dog: Observer { override fun update() { println("멍멍") } } //관찰자 2 : 고양이 class Cat: Observer { override fun update() { println("야옹") } }
- Event 발생시 서로 다른 동작 처리
class Owner { val observerList = mutableListOf<Observer>() fun register(observer:Observer){ observerList.add(observer) } fun notifyUpdate(){ for(observe in observerList){ observe.update() } } }
- Observer들에게 update()를 알리기 위해 notifyUpdate() 함수 정의
fun main(){
val owner=Owner()
val dog=Dog()
val cat=Cat()
owner.register(dog) //강아지 옵져버 등록
owner.register(cat) //고양이 옵져버 등록
owner.notifyUpdate() //오너가 신호(밥먹어라)를 보냄 = 이벤트 발생
}