내 주변 바틀샵에 대한 정보를 지도를 통해 제공
바틀샵 정보와 합리적인 구매를 위한 가격 비교 및 앱 내 바틀 픽업예약을 통한 편리한 예약시스템
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 호환, 가로모드, 다크모드 미지원
- 디자인 툴 : Figma
- 협업 도구 : Github, Team Notion
- 활용한 기술
- Xcode
- FCM, Firebase function
- KakaoSDKAuth, FBSDKCoreKit, GoogleSignIn, AppleLogin
- FirebaseAuth, FiresStore, Firebase Storage
- NaverMap API
- CoreData
![]() |
![]() |
---|---|
멋쟁이사자처럼 앱스쿨 최종프로젝트 최우수상 |
멋쟁이사자처럼 앱스쿨 해커톤 대상 |
- Bottles-V2-Info.plist
- GoogleService-Info.plist
- Podfile
$ pod install
안은노 | 강창현 | 고범석 | 김영서 | 서찬호 |
---|---|---|---|---|
@Eunno-An | @Changhyun-Kyle | @bamsak | @yngddo | @SeoChanHo |
봉혜미 | 신미지 | 이진아 | 장다영 | 최현종 |
---|---|---|---|---|
@hyemib | @SMizzz | @l1004ga | @Da01002 | @EthanColdChoi |