몸이 근질근질거려서 ReactorKit을 연습할 겸 프로젝트를 시작해보려 합니다
설계 과정을 순서대로 기록하도록 하겠습니다
1. API 정하기
로컬 데이터만 다룰 것이 아니라면 API는 필수인데요
이번에는 TMDB(The Movie Database) API를 사용하려 합니다
The Movie Database (TMDB)
Welcome. Millions of movies, TV shows and people to discover. Explore now.
www.themoviedb.org
2. 기능 정하기
API를 정했으니 이제 앱의 기능을 정할 차례입니다
TMDB 홈페이지를 들어가 보니
주요 기능은
- 오늘/이번 주의 트렌딩 영화 리스트
- 최신 예고편 보기
- 인기 있는 영화 리스트
- 검색
- 영화 상세정보
- 배우 및 감독 상세정보
- 프로필
이 정도로 보이는군요
저는 이 기능들로 앱을 만들어보려 합니다
[영화 리스트 및 예고편 보기] / [영화, 배우, 제작진 상세정보] / [검색] / [프로필]로 묶도록 하겠습니다
3. 스펙 정하기
기능을 정했으니 스펙도 정해야 하는데요
무엇을 정해야 하냐면
- Feature(기능)별 UI/UX
- 코드 구조(아키텍처, 모듈 구조 등)
- 사용할 라이브러리
두루뭉술하게 적긴 했는데,,
아직 완전 초기 단계니까 이 정도 고려하면 될 것 같습니다
순서대로 정리를 해보면
1. Feature별 UI/UX
우선 Feature별 UI/UX를 대략적으로 정리해 보면
영화 리스트 및 예고편 보기
- 영화 리스트 주르륵 있는 페이지
- 영화 상세정보 페이지
- 출연진 및 제작진 상세정보 페이지
검색
- 검색바 및 검색 결과 리스트를 볼 수 있는 페이지
- 영화 상세정보 페이지
- 출연진 및 제작진 상세정보 페이지
프로필
- 프로필 정보
- 즐겨찾기
- 평가한 영화
공통 페이지
- 영화 상세정보 페이지
- 출연진 및 제작진 상세정보 페이지
더 나오겠지만 간단하게 정리하면 이런 페이지들이 필요하겠네요
중복되는 페이지들은 여러 개 만들 필요 없이 재사용하면 되므로 공통 Feature에 넣겠습니다
여기서 끝이 아니라 각 페이지별 UI도 설계해야 합니다
예를 들면 UILabel, UIButton, UITextField 등의 위치와 각 요소들의 디자인 같은 것들 말이죠
여기서부턴 창작의 영역이라 살짝 머리가 아프네요..
그래서 TMDB 홈페이지를 최대한 따라가 보려 합니다
대략적인 UI는 이런 느낌입니다
발그림 죄송합니다...
영화 목록의 경우 CollectionView를 재활용
검색 결과와 즐겨찾기/평가한 영화 목록은 TableView를 재활용
영화/출연진/제작진 디테일 페이지도 재활용하면 될 것 같네요
2. 코드 구조
Clean Architecture 기반에 MVVM 패턴으로 짜보려 합니다
- App: AppDelegate / SceneDelegate / DI
- Data: Entity / Network / Database / Repository
- Domain: Model / Usecase / RepositoryProtocol
- Feature: MovieList / Search / Profile / Common
- Common: Util / Extension / Constant / Base
- UIComponent: Label / Button / TableView / CollectionView 등 UI 요소
위의 레이어들로 설계하겠습니다
Clean Architecture를 활용하는 이유는
- 모듈 분리와 의존성 관리
여러 레이어로 분리하여 각 레이어 간의 의존성을 관리함으로써
코드의 수정이 다른 레이어에 영향을 미치는 것을 최소화하고 각 레이어가 독립적으로 테스트와 유지보수가 가능하다 - 변경 용이성
비즈니스 로직과 외부 요인들의 변화가 있을 때, 해당 변경사항이 내부 구조 전체에 영향을 미치는 것을 방지하고
최소한의 코드 수정으로 대응할 수 있게 해 준다 - 테스트 용이성
레이어를 분리하고 의존성을 관리하므로 각 레이어를 단위 테스트하거나 모의 객체를 활용한 테스트를 진행하기 쉬워진다
쉽게 말해서 유지보수성, 확장성, 테스트 용이성을 향상해 주기 때문입니다
3. 사용할 라이브러리
개발하면서 조금씩 추가되겠지만 확실하게 사용할 라이브러리를 정하면
- 비동기: ReactorKit / RxSwift
- DI: Swinject
- 네트워크: Moya
- 로컬: Realm
- UI: SnapKit, Then
이 정도가 될 것 같네요
설계하는 과정이 조금 길었는데
사실 설계를 했다면 프로젝트의 50퍼센트 이상은 끝낸 겁니다..
이제 열심히 개발하면 됩니다
파이팅!