PROJECT

AVIRO

동아리 팀(기획·디자인·서버·Android) · iOS 전담 · 2023.05–2026.04

개발자로 전환한 뒤 팀으로 출시한 첫 앱입니다. 2023년부터 3년간 운영하다 2026년 4월 서비스를 정리했습니다.

누적 유저 1,300+ · App Store 평점 4.9 · 등록 비건 식당 1,300+ · 리뷰 200+

지도 · 데이터

지도와 데이터를 다루며

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()                 // 다음 변경분 기준
    }
}