SpartaFinalProjectAndroid / OFFROADER

0 stars 0 forks source link

OFFROADER

Slide 2

바로가기 링크

앱 소개

최신 등산 정보 및 유용한 등산 팁을 제공하여 등산을 더욱 쉽고 즐겁게 만들어주는 앱

분류 내용
아키텍쳐 MVVM
라이브러리 LifeCycle, LiveData, Lottie, Media3, Navigation, Splash, ViewModel
비동기 처리 Coroutine
데이터 처리 Gson, Parcelize, SharedPreferences
데이터베이스 Google Authentication, Google Firestore, Google Storage, RoomDatabase
API 통신 Google Login, KBS API, MBC API, NaverMaps API, OkHttp, OpenAi API, OpenWeather API, Retrofit, SBS API
이미지 로더 Bitmap, Glide, ImagePicker
UI Accordion UI, AlertDialog, BLUR, BottomSheetDialog, CoordinatorLayout, CustomDialog, DialogFragment, ExoPlayer, FloatingActionBubble, Fragment, ListAdapter, MaterialDesign, MotionLayout, MultiViewType, RecyclerViewAdapter, TapLayout, ViewPager2, XML

홈 페이지

산 리스트 페이지

지도 페이지

커뮤니티 페이지

내 정보 페이지

산 정보 페이지

챗봇 페이지

1-ezgif com-resize 2-ezgif com-resize

라디오 페이지

Screen_recording_20240326_161208-ezgif com-resize Screen_recording_20240326_160813-ezgif com-resize

화면 별 적용 기술 소개

MainActivity

각 방송국의 해당하는 채널, 좋아요 한 채널 리스트 표시

HomeFragment

추천 산 및 이벤트 등 다양한 정보를 진입시 표시

SanListFragment

100대 명산 리스트를 표시

SanMapFragment

지도에서 산 위치에 마커를 표시

CommunityFragment

로그인 사용자만 이용할 수 있는 커뮤니티

MyDetailFragment

내 정보 페이지 및 북마크 리스트

SanDetailActivity

산의 정보들을 표시

AddPostActivity

게시글 업로드

MyPostActivity

내 글 목록

ChatBotActivity

챗봇

RecordActivity

등산 경로에 대한 정보를 확인할 수 있다.

지도 프래그먼트에서 기록 종료 시 해당 액티비티로 넘어와 등산시각, 이동거리, 소요시간, 경로를 확인할 수 있다.

기술적 의사결정

1. Firebase RealTime DB VS Firestore

클라우드에 저장하는 방법이 두 가지 있어서 시작하기에 앞서 둘 중 어느 것을 사용할 지 고민.

Firestore을 선택한 이유

  1. 더 계층이 복합적인 데이터를 저장할 수 있다.
  2. 쿼리가 인덱싱이 되어있고 정렬 및 필터링 기능에 제한이 없다.
  3. uptime이 상대적으로 빠르다
  4. 보안이 더 강하다
  5. 사용 가격이 더 저렴하다
  6. Firebase 측에서 이용을 권한다.

2. BottomNavigationView VS TapLayout/ViewPager2

BottomNavigationView 와 TapLayout/ViewPager2의 가장 큰 차이점은 좌우 스크롤 기능의 유무이다. 앱을 처음 기획할 때 양옆 슬라이드 기능이 홈화면의 리사이클러뷰와 겹치고 몇 안드로이드 기기에는 옆으로 슬라이드하여 뒤로가기 기능이 생겼기 때문에 UX를 고려하여 슬라이드 기능을 넣지 말자고 이야기가 나왔고 따라서 BottomNavigationView로 진행하였다.

하지만 나중에 많은 데이터 및 사진을 표시해야 하는 화면(SanListFragment)에서 이미지 로딩 시간이 너무 길어지는 문제가 생겼다. ViewPager를 사용하면 첫 메인 화면에서 양 옆에 있는 프래그먼트를 미리 로딩해주기 때문에 이미지 로딩 시간을 단축 해 줄 수 있다는 장점이 있다. 따라서 ViewPager로 수정하고 슬라이드 기능을 제거하는 방향으로 진행하였다.

3. List Adapter VS RecyclerView Adapter

List Adapter는 DIFFUTIL을 사용하여 submit만 해주면 그 안의 아이템과 아이템 내용을 비교하여 자동으로 업데이트 시켜주기 때문에 RecyclerView Adapter 대신에 무조건 List Adapter가 나을 것이라고 판단하고 있었는데 똑같은 어댑터를 다른 액티비티 또는 프래그먼트에서 재사용하게 될 경우에는 List Adapter의 재사용이 불가능하다는 점을 배웠다. 그래서 앞으로 Adapter 재사용의 유무에 의사결정을 진행하기로 하였다.

4. documentSnapShotListener VS addOnSuccessListener

DocumentSnapShotListener은 실시간 업데이트를 해주고 addOnSuccessListener은 함수가 실행 될때에만 한 번 값을 가져오기 때문에 실시간 업데이트가 필요한 커뮤니티에서는 DocumentSnapShotListener을 사용하고 산 리스트를 받아오는 부분 및 산의 좌표를 받아오는 기능은 addOnSuccessListener을 사용하였다.

5. Firestore Storage : 메모리 VS 로컬 파일 VS URL

로컬 파일 저장은 사용자가 오프라인에서도 파일을 접근할 수 있다는 장점이 있지만 용량을 많이 차지한다. 오프로더 앱의 커뮤니티는 기획 상 온라인 상에서만 사용 가능하도록 했기 때문에 로컬 파일은 사용하지 않았다. 그럼 이제 메모리 또는 URL을 사용해주어야하는데 메모리를 사용해보니 파일 다운로드는 용이하지만 메모리에 전체 파일 콘텐츠를 로드해야 하기 때문에 앱의 가용 메모리보다 큰 파일을 요청하면 앱이 다운되는 문제가 생길 수 있다. 이 때문에 다운로드할 최대 바이트 수를 지정하는데 이미지의 크기가 이보다 크면 저장이 안되는 오류가 떴다. 따라서 용량 및 메모리에 큰 제약 없이 원하는 사진을 올릴 수 있는 URL 다운로드 방식을 선택하였다.

6. 네이버지도 API VS 구글 지도 API

국내 사용자 기준에 맞춰 익숙한 네이버지도를 사용

레이어 중에 등산로가 제공되어 확인이 용이함

7. Glide VS Coil

글라이드와 코일의 결정적 차이점은 현대 이미지 포맷팅 지원 기능 및 캐싱 기능의 차이이다. 우선 오프로더 앱은 산리스트 부분에서 이미지 로딩을 매우 많이 해주고 이때 이미지가 로딩하는 초기 시간이 많이 걸린다는 단점이 있다. 같은 이미지를 로딩하는 시간이 다시 사용되지 않으려면 어느정도의 캐싱 기능을 필요로 하기 때문에 글라이드를 선택하게 되었다.

Untitled

트러블슈팅

1. 홈

2. 산 리스트

3. 지도

4. 챗봇

5. 라디오

6. 산 정보

7. 마이 페이지

8. 커뮤니티

이름 구분 MBTI 블로그 깃허브 한마디
김은이 리더 ISTP 블로그 깃허브 잘 해보아요! :)))
이민용 부리더 INFP 블로그 깃허브 화이팅 화이팅!
김기원 팀원 INTP 블로그 깃허브 윈 드디어
박상우 팀원 ENTP 블로그 깃허브 가 보자구요!
한병철 팀원 ISTJ 블로그 깃허브

개선 예정

  1. 산 리스트 좋아요 클릭
  2. 업적 (산 실시간 위치 마킹이 이제 막 구현되어 추후 업적과 연동할 예정입니다.)
  3. 등산 기록 모아보기