MVVM CleanArchitecture - siwonkim0/ios-project-manager GitHub Wiki

MVVM + Clean Architecture

image

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을 만들어 변수에 가짜 데이터를 넘겨주고, 비즈니스 로직을 테스트할 수 있도록 하였습니다. (네트워킹을 하지 않는 테스트)