- 더 좋은 코드, 좋은 구조에 대해 고민해봅니다.
- 의존성 주입, 의존성 역전의 원칙을 코드에 적용해봅니다.
과제2, 3에서 작성했던 코드를 세미나 시간에 배웠던 아키텍쳐에 따라 리팩토링해봅니다. 이번 과제에서는 모든 구현이 정해진 레이어에서 이루어져야 합니다. 모든 코드는 아래 폴더 중 하나에 들어가야 합니다.
- UI
- ViewModel
- BusinessLogic
- Application
- Domain
- Infra
각 폴더에 들어가야 하는 코드는 아래와 같습니다.
- UI
- UIView, UIViewController 등 UI 관련 코드
- AutoLayout 관련 코드
- ViewModel의 데이터를 Combine을 통해 바인딩
- ViewModel
- UseCase로부터 데이터를 받아와 ViewModel에 저장
- UI를 그리기 위해 필요한 각종 계산 로직들
import UIKit
금지
- BusinessLogic
- Application
- Repository 프로토콜 선언
- 위에서 선언한 Repository 프로토콜을 의존성으로 주입받는 UseCase 클래스 구현
- Domain
- 비즈니스 로직이 담긴 클래스 혹은 구조체 선언 (e.g.
struct Movie
)
- 비즈니스 로직이 담긴 클래스 혹은 구조체 선언 (e.g.
- Application
- Infra
BusinessLogic/Application
에서 선언했던 프로토콜을 채택하여 구현- (필요한 경우) 실제 API 호출에 사용되는 DTO 선언 (e.g.
struct MovieDTO
)
더욱 구체적인 예제는 세미나 자료를 참고해주세요.
아래 기능을 추가로 구현해주세요. 새로운 기능도 위에서 제시된 구조에 따라 구현되어야 합니다. 디자인은 자유롭게 구현해주세요.
- 탭에 관계 없이, Cell을 누르면 디테일 뷰를 present 하도록 구현해주세요.
- 디테일 뷰에서는 커다랗게 썸네일을 보여줘야 하고, 그 밑에 제목과 평점 UI를 표시해주세요.
- 평점 UI는 보편적으로 생각하는 별 5개짜리 버튼으로 구현해주시면 됩니다. (★★★★★)
- 내가 매긴 평점은
UserDefaults
에 저장해서, 앱을 종료했다가 켜더라도 유지되도록 해주세요. - 디테일뷰에 들어가지 않고도 평점을 확인할 수 있도록, 각 Cell에도 평점을 표시해주세요.
- 코드를 깔끔하게 관리해주세요. 하나의 함수/파일/클래스는 하나의 일만 해야 합니다.
- 체크리스트에 포함된 내용만 채점할 예정입니다. 그 외 부분은 자유롭게 구현해주세요.
- 스펙이 변경될 경우에는 슬랙 채널을 통해 공지하겠습니다.
- 디자인은 스펙을 벗어나지 않는 범위 내에서 자유롭게 구현해주셔도 좋습니다.
- 세미나 자료에 제시된 리팩토링 코드를 참고해보세요.
- 위에서 제시한 구조가 정답은 아닙니다. 하나의 방법론을 제시한 것이고, 더 나은 방법이 있다면 적용해보는 것도 나쁘지 않을 것입니다. 다만 이번 과제만 한 번 구조대로 짜보시죠.