You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
내 주변 바틀샵에 대한 정보를 지도를 통해 제공
바틀샵 정보와 합리적인 구매를 위한 가격 비교 및 앱 내 바틀 픽업예약을 통한 편리한 예약시스템
🛠️ 기술스택
🚀 트러블 슈팅
1) UIViewRepresentable 을 활용한 네이버 지도 API 구현
SwiftUI 프레임워크를 기반으로 진행했기 때문에 네이버 지도 API를 사용하기 위해선 UIViewRepresentable 프로토콜을 채택하여 구현해야 했습니다.
홈 뷰에서는 전체 바틀샵에 대한 마커와 북마크한 바틀샵에 대한 마커를 띄워줘야 했는데 초기 개발 당시 makeUIView 함수에서 마커를 띄워준 후 북마크 버튼 터치 시 updateUIView에서 마커를 띄워주도록 구현했습니다.
하지만, 여기서 뷰를 초기화해주지 않으면 마커가 중복되어 쌓이게 될 뿐만 아니라 메모리 효율이 현저히 떨어진다는 문제점이 발생했습니다.
이에 대한 트러블슈팅으로 Apple 개발자 공식 문서를 참고하던 중 "UIViewRepresentable 프로토콜 채택 시 다른 SwiftUI 뷰와 상호작용하기 위해서 Coordinator를 사용하여 target-action을 전달한다"는 부분에 착안하여 해결 방안을 구성했습니다.
따라서, 초기에 전체 바틀샵에 대한 마커를 보여줬던 makeUIView에서는 네이버 지도 자체만 전달하도록 했습니다. 또한, 맵 뷰에서 발생하는 모든 이벤트를 처리했던 ‘updateUIView`에 대한 의존도를 최소화하여 불필요한 메모리 누수를 줄였습니다.
이외 발생하는 모든 매소드를 Coordinator에서 처리하도록 리팩토링
2) 불필요한 Coordinator 메서드 중복 생성 이슈
네이버 맵을 전달받은 SwiftUI 뷰에서 사용하기 편하게 shared라는 상수를 static으로 싱글톤화하여 Coordinator.shared로 접근할 수 있게 선언
코드의 효율성을 위해 CLLocationManagerDelegate 또한 Coordinator에 채택하여 협업 과정에서 맵에 대한 정보를 받아올 시 팀원들 모두 간편하게 사용할 수 있게 구현
3) 앱 진입 시 로딩 속도 최적화
앱 출시 당시 약 100개의 바틀샵 데이터 각 바틀샵 별 바틀 정보 뿐만 아니라 유저 데이터를 로딩 시 불러와야 했으나 정확한 데이터 로드 시점 파악 불가
따라서, DispatchQueue를 활용하여 강제적으로 데이터 로드 시간 확보
이후, 각 데이터 별 ViewModel에서 데이터가 로드되는 시점을 Boolean 값으로 판단하여 View에 전달하는 로직을 통해 강제적인 로딩 시간 지연이 아닌 데이터가 로드된 시점에 메인 화면으로 진입할 수 있게 리팩토링
또한, FirestoreDatabase 데이터를 불러올 때 전체 데이터가 아닌 필요한 데이터를 whereField로 처리하여 이 과정에서 발생하는 로딩 지연을 리팩토링
📱 주요기능과 스크린샷
소셜 로그인 뷰
이메일 로그인 뷰
회원가입 뷰
스플래시 뷰
주변 탭
내 주변 둘러보기 뷰
북마크 탭
검색 뷰
바틀샵 디테일 뷰 (상품검색)
바틀샵 디테일 뷰 (공지사항)
바틀샵 큐레이션 뷰
매장정보 뷰
예약진행 뷰
장바구니 뷰
예약화면
알림 탭
마이페이지 뷰
설정 뷰
예약내역
번호 변경
💻 개발 도구 및 활용한 기술
개발 언어 : Swift
개발 환경 : Swift5 16.2, SE ~ iPhone 14 Pro 호환, 가로모드, 다크모드 미지원