MVVM CleanArchitecture - siwonkim0/ios-project-manager GitHub Wiki
MVVM + Clean Architecture
Model
Project가 가진 정보를 가지고 있는 모델입니다.
테스트를 위해 Equatable을 채택해주었습니다.
View
ListVC는 테이블뷰를 가지고 있는 VC입니다.
AddDetailVC, EditDetailVC는 DetailVC를 상속받고 있습니다. DetailVC를 둔 이유는 두 VC의 공통된 부분을 하나로 관리하기 위해서입니다.
하나의 ViewModel을 사용하기 위해 ListVC, AddDetailVC, EditDetailVC에 생성자 주입을 해주었습니다.
→ 각 VC는 하나의 ViewModel만 가져야 한다는 피드백을 받고 ListVC, AddDetailVC, EditDetailVC가 각각 ListVM, AddDetailVM, EditDetailVM을 가지도록 수정해주었습니다.
ViewModel
ListViewModel
UseCase를 가지고 있으며 UseCase가 Repository를 통해 가져온 데이터를 View에 보여줄 데이터로 변환하는 역할을 합니다.
바인딩을 위해 클로저를 가지고 있으며 View에서 요청이 들어오면 서버단의 데이터까지 업데이트한 후 클로저에 정의한 작업을 수행하게 하였습니다.
tableViewDataSource를 채택하고 있습니다. 가지고 있는 데이터를 통해 tableView에 데이터를 뿌려줍니다.
-> tableViewDataSource를 RxSwift로 대체
AddDetailViewModel, EditDetailViewModel을 생성하는 메서드를 가지고 있습니다.
EditDetailViewModel
수정할 project만 가지고 있습니다.
바인딩을 위한 클로저를 가지며 Done버튼 터치시 클로저에 정의한 데이터를 업데이트하는 작업을 수행합니다.
UseCase를 가지고 있지 않으며 서버에 업데이트할때는 ListViewModel을 거쳐서 전달됩니다.
AddDetailViewModel
바인딩을 위한 클로저를 가지며 Done버튼 터치시 클로저에 정의한 데이터를 추가(업데이트)하는 작업을 수행합니다.
UseCase를 가지고 있지 않으며 서버에 업데이트할때는 ListViewModel을 거쳐서 전달됩니다.
UseCase
비즈니스 로직이 구현되어 있는 곳입니다.
Repository를 가지고 있으며 viewModel과 연관이 없어 테스트하기 용이하고, 실제로 해당 UseCase 테스트를 진행하였습니다.
List, Edit, Add ViewModel이 모두 같은 UseCase를 가지고 있습니다.
Repository
Repository는 Project타입의 배열을 가지고 있습니다. (Entity)
Local, Remote 저장소에 특정 작업을 요청하는 곳으로 LocalDataSource, RemoteDataSource를 가지고 있습니다.
해당 클래스를 추상화하고 Mock을 만들어 변수에 가짜 데이터를 넘겨주고, 비즈니스 로직을 테스트할 수 있도록 하였습니다. (네트워킹을 하지 않는 테스트)