설계 원칙과 가이드라인은 소프트웨어 시스템을 구성하는 구성 요소들의 역할과 책임, 그리고 이들 간의 관계를 말하는 것이다
만약 가이드 라인이 없다면 협업을 하면서 다른 사람의 짠 코드를 이해할 수 없을 것이다.
Model
데이터와 비즈니스 로직을 처리하는 역할
모델은 데이터를 관리하고, 비즈니스 로직을 구현한다.
View
사용자에게 보이는 화면이다
사용자가 시스템과 상호작용하는 인터페이스를 제공한다.
Controller
모델과 뷰 사이에서 상호작용을 조정하는 역할
컨트롤러는 사용자 입력을 처리하고, 모델에 변경 사항을 알리며, 뷰를 업데이트한다.
Presenter가 View와 Model을 연결하기 때문에, Presenter를 테스트하기 위해서는 View와 Model에 대한 모의 객체(mock objects)를 만들어야 한다 또한 Presenter가 View와 Model 사이의 중재자 역할을 수행하면서, Presenter에서 발생한 오류가 View와 Model에서 발생한 오류와 혼동
View와 Presenter가 함께 동작하여 사용자 인터페이스를 제어하고 이벤트 처리를 수행하기 때문에 View가 Presenter와 밀접하게 겹합되어 있음
MVP 패턴이 MVC 패턴에 비해 Presenter 레이어를 추가하여 구조가 복잡해진다는 것과, Presenter와 View 간의 인터페이스 정의 및 구현을 수동으로 처리해야함
Presenter와 View 간의 인터페이스 정의 및 구현을 수동으로 처리??
Presenter가 View에서 발생하는 이벤트를 수신하기 위한 메서드들을 선언하는 것을 의미
Presenter에서는 View 인터페이스를 구현하는 코드를 작성해야 하고, View에서는 Presenter 인터페이스를 구현하는 코드를 작성해야 합니다. 이러한 과정은 수동으로 처리
Model
데이터를 나타낸다.
데이터베이스, 파일 또는 웹 서비스와 같은 데이터 소스와 상호작용
View
UI를 나타내며 사용자와 상호작용한다.
사용자 인터페이스 이벤트를 처리하고, ViewModel에서 제공하는 데이터를 표시
ViewModel
View와 Model 간의 매개체(중개자,인터페이스)
비즈니스 로직을 처리하고 View에서 표시할 데이터를 준비
View와 Model 사이에서 데이터를 변환하고 필요한 데이터를 가져오는 역할
뷰와 모델을 분리하여 애플리케이션의 유지 보수성을 높인다.
-> 뷰와 모델은 서로 독립적이기 때문에 변경 사항이 있을 때 서로 영향을 주지 않는다.
데이터 바인딩을 지원하여 뷰와 모델 간의 데이터 전달을 간소화
-> 뷰 모델은 뷰에 대한 변경 사항을 감지하고 자동으로 업데이트
정확히는 ViewModel클래스 안에 있는 LiveData이 뷰에 대한 변경 사항을 감지하고 ViewModel이 업데이트 해준다
뷰와 모델을 분리하여 뷰 없이 모델을 테스트하는 것이 가능
-> 개발자가 뷰의 영향을 받지 않고 모델의 동작을 테스트할 수 있도록 도와준다.
뷰와 모델 간의 중개자 역할을 수행하는 뷰 모델을 제공
-> 뷰와 모델의 변경이 발생해도 뷰 모델만 업데이트하면 되기 때문에 애플리케이션을 유연하게 변경할 수 있다.
ViewModel은 View와 Model 사이에서 매개체 역할
UI와 비즈니스 로직을 분리하는 데에 중요한 역할
뷰와 모델을 분리하여 코드의 재사용성을 높인다
-> 모델은 다른 뷰와 함께 사용될 수 있으며, 뷰 모델은 다른 뷰에서도 재사용될 수 있다
다른 패턴에 비해 복잡한 구조
-> 데이터 바인딩과 RxJava 같은 추가적인 라이브러리를 이해해야 하기 때문에 어렵다
뷰 모델이 과도하게 커질 수 있다
-> 뷰 모델은 뷰와 모델 사이의 중개자 역할을 하기 때문에, 뷰 모델에 많은 로직이 집중될 수 있습니다
양방향 데이터 바인딩이 남용될 수 있다
-> 데이터 바인딩은 뷰와 뷰 모델 간의 데이터 흐름을 관리하는 데 사용된다. 그러나 양방향 데이터 바인딩이 남용되면, 앱의 복잡성이 증가할 수 있다
남용?
복잡한 비즈니스 로직이 포함된 경우
양방향 데이터 바인딩은 데이터가 변경될 때 즉시 UI에 반영된다.
-> 비즈니스 로직이 복잡하고 데이터가 많은 경우 이를 모두 반영하려면 많은 양의 데이터 바인딩이 필요할 수 있습니다
이전 값과 새 값이 계속해서 변경되고 UI에 반영될 때마다 메모리가 누적(메모리 누수를 발생시키고 앱의 성능을 저하)