맛집, 여행지 등 나만의 장소를 기록하는 서비스
- 개발 인원: iOS 1
- 개발 기간: 24.09.11 ~ 진행 중 (24.10.04 출시)
- 최소 버전: iOS 16.0
- 🎨 View Drawing:
SwiftUI - 🏛️ Architecture:
MVVM - ♻️ Asynchronous:
Combine - 📡 Network:
URLSession - 📦 DB:
RealmSwift - 🍎 Apple Framework:
PhotosUIMessageUI - 🎸 기타:
NMapsMap
- 나만의 장소 기록 조회 / 작성 / 수정 / 삭제 기능
- 캘린더 / 지도 / 타임라인 뷰를 통해 다양한 형태로 기록 확인
- 나만의 장소 기록 검색
- Input&Output 패턴을 적용하여 View와 Data 분리
- ViewModelType 프로토콜을 사용하여 ViewModel 추상화
- PassthroughSubject로 구성된 Input과 @Published로 구성된 Output을 사용
- 재사용되는 NavigationBar와 HideKeyboardModifier를 ViewModifier로 구성
- ViewModifier와 View Extension을 통해서 코드 중복 제거 및 재사용성 증가
- class인 Realm 모델을 직접 View에서 사용할 때 삭제 시 오류 발생
- struct인 PresentModel을 분리해서 사용
- Realm의 CRUD를 담당하는 객체에 ObservableObject를 채택하여 데이터 변경 시 View Rendering이 일어나도록 함
- LazyVGrid를 사용한 커스텀 캘린더 구현
- 기록이 있는 날짜와 없는 날짜를 구분하여 화면 분기 처리
- cocoapod을 통해 네이버 지도 SDK 설치
- UIViewRepresentable을 채택하여 Coordinator를 통한 위치 권한과 Data 핸들링
- URL Scheme을 통한 길찾기 기능 구현
- 마커들을 Dictionary로 관리하여 중복된 위치에 마커가 그려지는 것을 방지
- Data 변경 시 Dictionary와 Data를 비교하여 변경된 부분에 대해서만 마커를 새로 그리거나 삭제하도록 구성
- RootView의 onAppear 시점에 Notification Center를 구독하여 전역적인 처리
- windowScene을 통해 뷰 계층 구조에 상관 없이 최상단에 띄울 수 있도록 함
- MFMailComposeViewController를 통해 이메일로 문의하기 기능 구현
- 빠른 대응을 위해 사용자의 Device Model, Device OS, App Version을 메일 양식에 추가
- 인스턴스 생성 비용이 큰 DateFormatter()를 static으로 만들어 리소스 낭비 방지
- class인 Realm 모델을 직접 View에서 사용할 때 삭제 시 오류 발생
- struct인 PresentModel을 분리해서 사용
- Realm의 CRUD를 담당하는 객체 분리
- ObservableObject를 채택하여 데이터 변경 시 View Rendering이 일어나도록 함
- 출시 성공
- SwiftUI에 익숙해짐
- 지도와 커스텀 캘린더 구현이 생각보다 오래 걸림
- 프로젝트 전체 MVVM으로 고치기