내 주변의 막걸리 주막 찾기 🍶, Jumak
v1.0.0 개발기간: 2023.09.26 ~ 2023.10.23
지속적인 업데이트: 2023.10.23 ~ (진행중)
🔑 내 위치 근처 혹은 내가 검색하고 싶은 위치에서 막걸리 주막을 찾을 수 있어요.
🔑 막걸리지도에서 찾은 주막을 선택해 상세 정보를 얻으세요. 주막까지의 길찾기 기능과 즐겨찾기 및 평점 등록이 가능합니다.
🔑 해당 주막에서 있었던 에피소드를 등록하세요. 에피소드 조회와 삭제도 가능합니다.
🔑 평점, 즐겨찾기, 에피소드 등록을 통해 나만의 주막 리스트를 만들어보세요. 다양한 필터 기능으로 최적화된 주막을 선정 할 수 있습니다.
- Minimum Deployments: iOS 15.5
- Dependence Manager : SPM & CocoaPod(NaverMap)
- Swift Version: 5.8.1
UIKit
CoreLocation
DiffableDataSource
CompositionalLayout
PHPickerViewController
propertyWrapper
RxSwift
RxCocoa
RxDataSources
RxGesture
Alamofire
RxReachability
SnapKit
NaverMap
RealmSwift
- [RxSwift] 검색한 위치가 GeocodeLocation을 할 수 없는 지역일 경우 런타임 오류 이슈
- [RxSwift] 어노테이션 선택 시 콜렉션뷰 스크롤 이벤트때문에 여러 마커를 선택하고 오는 이슈
- [RxSwift] 왓챠식 3중 필터 구현기
- [RxSwift] Location이 업데이트 될 때만 Network Call 하도록 구현하기
- [UIKit] DiffableDatasource에서 헤더만 apply가 되지 않는 이슈
- [UIKit] Presentation Layer Model을 활용하여 Local DB에 Image Data가 저장되지 않게 구현하기
Why
- 약 4주라는 기간 안에 앱스토어 출시라는 목표를 잡았습니다. 디자인, 기획 등이 개발 중에도 수정되어, 서비스의 방향과 스펙, UI 등이 변경될 수 있다고 생각했습니다. 핵심 비즈니스 로직과 변경이 자주 발생하는 외부의 레이어를 명확하게 분리하여 결합도를 낮출 수 있는 구조 설계를 고민했고, Clean-Architecture을 채택하게 되었습니다.
Result
-
ViewModel의 비즈니스 로직들을 UseCase로, 네트워크나 외부 프레임워크에 대한 요청은 Repository로 분리해 각 레이어의 역할을 분명하게 나누어, 코드의 결합도를 낮추고, 의존성이 Domain Layer를 향하도록 구현할 수 있었습니다.
-
MVVM 구조에서 ViewModel이 모든 비즈니스 로직을 처리하는 것을 피할 수 있었습니다.
-
각각의 레이어를 역할에 따라 분리하여 방대한 양의 코드를 쉽게 파악할 수 있었습니다.
Why
- 뷰가 화면을 그리는 역할만 담당하고, 비즈니스 로직에 대한 분리를 위해 MVVM 패턴을 도입했습니다.
- iOS MVVM은 표준이 없고 구현하는 사람마다 패턴이 다를 수 있습니다. MVVM 패턴을 정형화하고, 데이터 흐름을 단방향으로 관리하기 위해 Input/Output 패턴을 활용했습니다.
Result
-
화면에서 일어나는 모든 이벤트를 Input으로 정의하여 비즈니스 로직을 요청하고, 결과로 갱신되는 값들을 Output에 바인딩해 뷰 컨트롤러는 Ouput을 보고 화면을 그리도록 구현할 수 있었습니다.
-
Input/Output 패턴을 활용해 일관성 있는 구조의 뷰모델 코드를 만들 수 있어, 가독성을 높일 수 있었습니다.
Why
- 각 객체에서 연속된 escaping closure으로 인한 연속된 콜백의 데이터 흐름을 피하고 싶었습니다.
- Notification Center, GCD등 복합적이고 다양한 비동기 API를 활용하기 보단, 일관된 비동기 프레임워크 활용하고 싶었습니다.
Result
-
escaping closure가 아닌 RxSwift의 Operator를 활용하여 코드 양이 감소하고, 이해하기 쉬워졌습니다. 코드의 방대해짐과 실수를 방지할 수 있었습니다.
-
오로지 RxSwift만 활용해 하나의 비동기 코드로 개발할 수 있었고, 기존의 복합적인 비동기코드의 가독성을 올리고 유지보수를 쉽게 만들 수 있었습니다.
-
RxTraits를 활용해 Thread 관리를 쉽고 간편하게 할 수 있었습니다.
주막 서비스의 주차별 개발 일지를 보고 싶으시다면! 🍶 주막 프로젝트 Iteration