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을 이용하여 추상화를 진행합니다. 여기서 주의해야 할 점은 ..
처음에는 스택, 힙, 리스트 같은 그런 자료구조를 말하는줄 알았지만, 클린 코드에서 말하는 자료구조는 다른 개념입니다. 자료구조 자료구조는 가지고 있는 변수를 그대로 노출시킵니다. 이를테면 struct Animal { var kind: String var age: Int } 이런 구조가 자료구조가 될 수 있겠네요. 또 이런경우도 자료구조라 할 수 있습니다. class Animal { private var kind: String private var age: Int init(kind: String, age: Int) { self.kind = kind self.age = age } func getKind()->String{ return kind } func getAge()->Int{ return age } ..
우리는 흔히 함수는 하나의 작업만 해야 한다고 합니다. 그런데 하나의 작업이란 어떤것을 뜻하는지 정확히 알지 못해서 많이 햇갈렸습니다. 그렇다면 if문이나 for문 이런것도 각각 하나의 함수로 만들어줘야 하나? 함수 안에 또다른 함수를 이용하는것은 여러가지 작업을 하는것이니 이런식으로 구현하면 안되나 등등 고민을 많이 했습니다. 클린 코드(로버트 C 마틴)에서는 한가지 작업이란 다음과 같이 정의합니다. 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한가지 작업만 한다. 처음 들었을때 무슨소리인가 하겠지만, 예제를 하나 보면 이해하기 쉽습니다. 로그인 기능을 구현한다고 가정해보겠습니다. 저희는 버튼이 클릭하면 로그인 기능을 담당하는 객체의 로그인 함수를 통해 로그인을 진행합니다. class LoginO..
깨끗한 코드란? 코드가 문장처럼 읽히고, 어떤 일을 하는지 명확하게 알 수 있는 코드. 이를 위해서는 함수, 변수, 클래스 등등의 이름을 잘 지어야 함. 의도가 분명한 이름을 사용 var a //a자체는 아무 의미 없으므로 사용 불가 var fileAgeInDays //이런식으로 의미가 분명한 이름을 사용 그릇된 정보를 피해라 약어 사용 지양 hp같은 약어 쓰지말고 그냥 풀어서 사용 List같은 특수한 의미는 분명하게 사용 실제 List로 구현하지 않은 것에 List같은 특수한 의미가 있는 이름 사용 금지 groups, ~s로 사용 서로 흡사한 이름 사용 금지 불용어 사용 금지 Product, ProductInfo, ProductData 같은 다른 사람이 보았을때 어떤 차이가 있는지 알기 힘든 이름 사용..