🗺️MapMory는 지도 기반 추억 기록 어플리케이션 입니다.
어떤 장소에서 어떤 감정을 느꼈는지 텍스트로 기반할 뿐만 아니라, 감정도 기록할 수 있습니다!!
📱주요 기능
- AppleMap을 통한 지도 표현
- 위치, 사진, 텍스트를 포함한 사용자 기록 저장
- 위치 검색 기능
- 현재 위치 표시 및 이동
- 다크 모드 지원
📋핵심 기술
MapKit
을 통한 지도 표시RealmSwift
를 통한 사용자 입력 데이터 저장 기능 구현Alamofire
네트워크 통신Custom Observable
+MVVM
을 통한Reactive Programming
소급 적용CoreLocation
을 사용한 사용자 현재 위치 확인 구현PHPickerViewController
를 활용한 사용자 사진 입력 구현Firebase Crashlytics
를 활용한 Run Time Error 추적 및 관리Toast
를 사용한 사용자 Notification 구현systemColor
orAsset Color Set
을 활용한 다크모드 지원EmojiPicker
를 통한 이모지 입력 구현
🌎개발 환경
ver. 1.0 개발 기간: 2023.09.23. ~ 11.02.
출시 및 업데이트: 2023.11. 02. ~ 현재
개발 인원: 1인
개발 언어: Swift
Minimum Deployment: iOS 15.0+:UISheetPresentationController
⚙️기술 스택
- Framework:
UIKit
- Design Pattern:
MVVC
,Singleton
,Router Pattern
- Package Management:
SPM
,CocoaPods
- Library:
Alamofire
,realmSwift
,SnapKit
,Then
,Toast
,Firebase Cloud Messaging
,Firebase Crashlytics
,EmojiPicker
- Etc:
PHPickerViewController
- 이슈 발행, branch 분기 및 작업 수행, Pull request를 활용한 형상 관리 진행를 진행.
- 뷰와 뷰 모델의 분리를 위해
MVVM
을 적용하고, 동적으로 뷰에 반영 하기 위해 Custom Observable을 구현. - 코드는 다음과 같으며, Observable 클래스는 타입을 대신하는 역할을 수행하고 내부의 Value 값을 할당하면 didSet을 통해 Closure를 실행시키고 Closure를 통해 뷰에 그 값을 전달 하는 구조.
class Observable<T>{
private var notifier: ((T)->Void)?
var value: T {
didSet{
notifier?(value)
}
}
init(value: T) {
self.value = value
}
func bind(closure: @escaping (T)->Void){
self.notifier = closure
}
}
- Alamofire의 URLRequestConvertible Protocol을 통해 Router Pattern을 구현.
- Router Pattern을 통해 API request를 추상화하면 API 호출당 1:1 대응 하지 않아도 되어 코드가 간결해지고 유지 보수성을 높일 수 있는 장점이 있다.
enum Router: URLRequestConvertible{
case ...
private var baseURL: URL{ switch self { ... } }
private var endPoint: String{ switch self { ... } }
var header: HTTPHeaders{ switch self { ... } }
var method: HTTPMethod{ switch self { ... } }
var query: [String: String]{ switch self { ... } }
func asURLRequest() throws -> URLRequest { ... }
}