Skip to content

멋쟁이사자처럼 앱스쿨1기 최종프로젝트 - Bottles

License

Notifications You must be signed in to change notification settings

Changhyun-Kyle/finalproject-bottles

 
 

Repository files navigation

Bottles(바틀즈)

📖 목차


🍷 프로젝트 소개

내 주변 바틀샵에 대한 정보를 지도를 통해 제공
바틀샵 정보와 합리적인 구매를 위한 가격 비교 및 앱 내 바틀 픽업예약을 통한 편리한 예약시스템


🛠️ 기술스택


🚀 트러블 슈팅

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로 처리하여 이 과정에서 발생하는 로딩 지연을 리팩토링

📱 주요기능과 스크린샷

IMG_7707 IMG_7708 IMG_7709 IMG_7694
소셜 로그인 뷰 이메일 로그인 뷰 회원가입 뷰 스플래시 뷰
IMG_7711 IMG_7695 IMG_7696 IMG_7703
주변 탭 내 주변 둘러보기 뷰 북마크 탭 검색 뷰
IMG_7716 IMG_7719 IMG_7718 IMG_7717
바틀샵 디테일 뷰
(상품검색)
바틀샵 디테일 뷰
(공지사항)
바틀샵 큐레이션 뷰 매장정보 뷰
IMG_7713 IMG_7706 IMG_7715 IMG_7698
예약진행 뷰 장바구니 뷰 예약화면 알림 탭
IMG_7699 IMG_7700 IMG_7701 IMG_7712
마이페이지 뷰 설정 뷰 예약내역 번호 변경

💻 개발 도구 및 활용한 기술

  • 개발 언어 : 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

🏅 수상내역

스크린샷 2024-07-15 오후 7 32 44 223365235-da8b4ee6-fb8c-4cf0-b2cb-13a87fffab34
멋쟁이사자처럼 앱스쿨 최종프로젝트 최우수상 멋쟁이사자처럼 앱스쿨 해커톤 대상

📓 설치 / 실행 방법

1️⃣ 아래 파일은 필수 파일이므로 다음 이메일로 파일을 요청 😝

(changhyun.kyle@gmail.com)

- Bottles-V2-Info.plist
- GoogleService-Info.plist
- Podfile

2️⃣ 아래와 같이 pod 파일을 설치 🤗

$ pod install

3️⃣ Bottles_V2.xcworkspace 파일 실행 😎


👨‍👩‍👦‍👦 참여자

안은노 강창현 고범석 김영서 서찬호
@Eunno-An @Changhyun-Kyle @bamsak @yngddo @SeoChanHo
봉혜미 신미지 이진아 장다영 최현종
@hyemib @SMizzz @l1004ga @Da01002 @EthanColdChoi

📝 라이센스

"Bottles" is available under the MIT license. See the LICENSE file for more info.

About

멋쟁이사자처럼 앱스쿨1기 최종프로젝트 - Bottles

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages

  • Swift 100.0%