지도 · 데이터
지도와 데이터를 다루며
MVP 패턴으로 빠르게 출시해 3년을 운영했습니다. 지도와 데이터를 다루며 마주친 문제들을 코드로 풀었고, 유지보수의 한계도 몸으로 배웠습니다.
-
동기화
변경분만 받는 동기화 전국 식당 마커를 매번 전량 내려받지 않고, 마지막 갱신 이후 바뀐 곳과 삭제된 곳만 받아 Realm에 반영했습니다. 로컬 데이터로 먼저 지도를 그린 뒤 변경분만 맞춰 시작 속도와 오프라인 대응, 트래픽을 함께 챙겼습니다.
-
지도
겹친 핀도 개별 선택되게 좌표가 완전히 겹친 식당들은 핀이 포개져 고를 수 없어서, 경도를 조금씩 밀어 분산시켜 하나씩 선택되게 했습니다.
-
학습
MVP의 한계가 아키텍처 학습의 출발점 화면과 데이터가 한 레이어에 뒤섞인 구조로 개발하다가 대규모 업데이트에서 유지보수 한계를 겪었습니다. 이 경험이 Clean Architecture를 학습하고 다음 실무에서 구조를 직접 설계하는 계기가 됐습니다.
MarkerModelManager.swift · 요지
func fetchRawData() { // 로컬에 데이터가 있으면 Realm으로 먼저 그린다 haveStoredData ? fetchFromRealm() : fetchFromServer() } // 마지막 갱신 시각을 실어 변경분만 요청 func syncDelta() { let dto = AVIROMapModelDTO(time: updateTime) api.loadPlaces(dto) { result in result.updatedPlace.forEach { realm.add($0, update: .modified) // upsert } result.deletedPlace.forEach { realm.delete(placeBy: $0) // 삭제 반영 } updateTime = Date() // 다음 변경분 기준 } }