저는 여태까지 API를 가지고 네트워크 요청을 할때 func requestMovies(page: Int, completion: @escaping ()->Void) { URLSession.request(..... } 이런식으로 특정 네트워크 요청을 위한 함수를 만들어서 요청하는 식으로 코드를 짜왔습니다. 또한 이런 네트워크 작업을 하는 객체를 싱글톤 객체로 만들어서 작업을 했지요. class NetworkManager { static let networkManager = NetworkManager() func requestMovies() { } func requestUserInfo() { } . . . } 이런식으로 말입니다. 이런 방식은 NetworkManager가 요청 생성, 인코딩, 디코딩 등등을 모..
이번에는 검색창에 검색어를 입력해서 값을 받아오는 작업을 진행하도록 해봅니다. 우선은 검색에 필요한 ViewModel의 Input과 Output을 정의합니다. protocol MoviesListViewModelInput { func viewDidLoad() func didSearch(query: String) } protocol MoviesListViewModelOutput { var items: Observable {get} var query: Observable {get} var error: Observable {get} var isEmpty: Bool {get} var screenTitle: String {get} var emptyDataTitle: String {get} var errorTitle..
다른 계층이 의존하고 있는 Domain 계층이 완성이 되었으니, 첫 화면인 MovieList 부분부터 진행하도록 해봅시다. 우선은 MoviesList를 구성해줍니다. SuggestionView와 MoviesListView를 containerView로 만들어주고 MoviesListView 역시 스토리보드로 UI를 배치해줍니다. class MoviesListViewController: UIViewController, StoryboardInstatiable, Alertable { @IBOutlet var contentView: UIView! @IBOutlet var searchBarContainer: UIView! @IBOutlet var moviesListContainer: UIView! @IBOutlet ..
Domain 계층을 완성했으니 테스트를 해보겠습니다. UseCase 중에서 SearchMoviesUseCase를 테스트 해볼겁니다. SearchMoviesUseCase는 excute 함수로 영화 목록을 서버로부터 가져오고, 영화 목록을 가져오는데 성공했다면 해당 쿼리를 저장합니다. 여기서 저희는 아직 Repository를 구현하지 않았습니다. 그렇다면 어떻게 UseCase를 테스트 할까요? 지금은 서버의 API 조차 모르는데 어떤식으로 서버로 부터 데이터를 가져오는 작업을 테스트를 할 수 있을까요? 우선은 테스트 함수를 만들어줍니다. func testSearchMoviesUseCase_whenSuccessfullyFetchesMoviesForQuery_thenQueryIsSavedInRecentQueri..
kudoleh/iOS-Clean-Architecture-MVVM를 보고 제 나름대로 공부해서 쓴 글이므로 틀린 부분이 있을수도 있습니다. 해당 프로젝트에는 클린 아키텍처 뿐만이 아니라 여러가지 패턴이 사용됩니다. Coordinator 패턴 Repository 패턴 DIContainer ViewModel Input, Output Observable 패턴 Network Layer DTO 패턴 여기서 Observable 패턴은 직접 코드로 구현이 되있었으나 Combine이나 RxSwift로 대체할 수 있으니 연습도 할겸 둘중 하나를 사용하기로 했습니다. 각 계층의 의존성을 도식화 한 모형을 보면 Domain 계층으로부터 Data 와 Present 계층이 의존하고 있습니다. 따라서 Data와 Presentati..
해당 프로젝트를 보고 스스로 공부한 내용이니 틀린 정보가 있을수 있습니다. Domain 계층은 클린 아키텍처에서 가장 안쪽에 있는 계층입니다. 다른 계층과는 완전히 격리되어 있습니다. Entity, Usecase, Reposiotry 인터페이스가 Domain 계층에 해당됩니다. Domain 계층을 완전히 분리를 한것을 확인하려면 해당 계층을 의존하는 Presentation 계층이나 Data 계층이 바뀌어도 Domain 계층을 재사용 할 수 있어야 합니다. 따라서 다른 계층의 코드가 포함이 되어선 안됩니다. Repository Repository는 DB 혹은 서버에서 데이터를 가져오는 작업을 추상화 시키는 것을 의미합니다. iOS는 protocol을 이용하여 추상화를 진행합니다. 여기서 주의해야 할 점은 ..