- 온라인과 오프라인을 연결해주는 O4O 서비스
- 오프라인 쇼핑 지도를 통해, 오프라인 쇼핑을 원하는 사용자에게 편리한 서비스를 제공합니다.
| 전체 아키텍처
MVVM(ReactorKit)
- MVVM을 도입하여 View는 화면을 그리는데에 집중하고, ViewModel을 통해 Side Effect와 State를 처리하도록 했습니다.
- 이를 통해 기존의 MVC 방식의 문제인 Massive ViewController 문제를 해결하고자 했습니다.
- UIKit 요소가 없어도 뷰에 보여질 값들을 ViewModel을 통해 단독으로 단위 테스트하여 확인하고 검증할 수 있게 했습니다.
- 이를 위해 ViewModel은 UIKit을 import 하지 않는 원칙을 지키며 구현했습니다.
Coordinator
- RxFlow를 사용하여 화면전환을 정의하고, ViewModel에서 Step을 통해 Coordinator(Flow)에서 화면전환을 처리하도록 했습니다.
- 각 Flow에서 각 클래스의 생성과 의존성 주입을 구현하여, 클래스간 결합도를 낮추고 변경 가능성을 줄였습니다.
Repository Pattern
- Repository Pattern을 통해 데이터를 요청하는 역할을 ViewModel에서 분리하여 ViewModel이 비즈니스 로직 처리 역할에 집중하도록 했습니다.
- Repository는 ServiceProvider 라는 프로토콜로 추상화하여 ViewModel과의 결합을 느슨히 하여 변경 가능성을 낮추었습니다.
- 여러 ViewModel 에서 일관된 인터페이스를 통해 데이터를 요청할 수 있게 했습니다.
- 연속된 콜백 지옥을 피하고, 기존 delegate 패턴의 분산적 코드의 개선을 위해 사용하였습니다.
- 사용자의 액션으로부터 상태가 변화하여 다시 뷰에 그려지기까지 스트림으로 데이터를 처리하도록 했습니다.
- 클래스간 의존성 주입을 용이하게 하고, MVVM 패턴에서 Coordinator의 화면 전환을 트리거 하게 하기 위해 사용했습니다.
- 사용자 주변의 매장을 표시하기 위해 Naver Map SDK를 사용했습니다.
- 초기 사용자의 위치를 알기 위해 CoreLocation을 사용했습니다.
- URL 로부터의 이미지 로드, 캐싱은 Kingfisher 라이브러리로 처리하였으나 의존성을 제거하고 직접 이미지 로드, 캐싱을 구현할 예정입니다.
- 테스트 코드를 구현할 예정입니다.