Banchan App
👀 Overview
한줄 소개 | 음식을 장바구니에 담고 주문을 하며, 20분 뒤에 음식이 도착했음을 알림 받을 수 있는 반찬 앱 |
진행기간 | 2022.08.08 ~ 2022.08.26 |
Skills | Room, Hilt, Glide, Recyclerview MultiViewType, WorkManager, AlarmManager, Retrofit, Flow |
팀구성 | Android 2 |
❓ 개발 목표
해당 프로젝트는 아래의 내용을 증명하는 것을 목표로 함.
- Flow에 대한 이해
- RecyclerView Multi ViewType & DiffUtil 정복
- Domain Layer
- 코드의 통일성
🍀 서비스 내용
고객은 대표 음식, 메인 요리, 국물 요리, 밑반찬을 선택해서 음식을 주문할 수 있습니다.
장바구니에 담아 골라먹는 재미를 느껴볼 수 있습니다. 주문 시작 시 20분 뒤에 도착하는 음식을 신선하게 먹을 수 있습니다.
까먹지 않고 알림을 받아 고객님에게 리마인드 시켜줄 수 있습니다.
🛠 기술 스택
Room
- Flow를 반환해주는 사용하기 편한 DataBase 라이브러리
Hilt
- Android에 특화된 의존성 주입 라이브러리
Glide
- 간편한 기능을 제공하는 이미지 라이브러리
- 이미지 캐싱처리
- Place Holder
Recyclerview
- 스크롤 화면을 구현하는데 있어 RecyclerView와 MultiViewType으로 구현하기로 결정했다.
- 자세한 내용은 Trouble-Shooting에 기재함
WorkManager
- 백그라운드에서 필요되는 작업을 수행하기 위해 사용
AlarmManager
- 주문 후 사용자에게 정확한 시간에 맞추어 알려주기 위함
Retrofit
- 네트워크 서비스를 구현하기 위한 라이브러리
Flow
- Reactive한 데이터를 감지하고 뷰에 적용하기 위함
🖥 개발 내용
이때 장바구니 화면과 주문 내역 화면을 중심으로 개발했으며, Multi View Type을 이용해 뷰의 재사용성을 높여 효율적인 화면 개발에 초점을 두며 개발했습니다. 또한 플로우를 활용해 데이터베이스가 변경되는 이력을 감지하고 이를 뷰에 즉각적인 변화를 적용했습니다.
Android Event Wrapper
Testcode
📈 성장 경험
-
프로젝트 내용 가장 기억에 남던 프로젝트는 캠프 마지막 프로젝트인 반찬 앱 만들기입니다. 이 프로젝트는 3주 동안 2명이서 진행되는 사용자가 메인요리, 국물요리, 밑반찬 상품들을 골라 주문하는 앱 만들기 입니다. 사용자는 주문하기 전에 장바구니에 상품들을 담고 주문할 수 있으며, 최근에 본 상품 목록을 확인할 수 있습니다. 또한 배달이 완료되었음을 알림을 통해서도 확인할 수 있고, 이전의 주문 내역들도 확인할 수 있습니다.
-
개발 방식 저는 이 프로젝트의 목표 중 하나로 코드의 통일성을 추구했습니다. 그래서 코드 스타일을 최대한 유사히 맞추려고 노력을 했는데 그 부분 중 하나는 소통이었습니다. 소통의 첫번째로 개발할 때 기준이 될 코딩 컨벤션을 정하고, 슬랙을 통해서나 또는 Comment를 달아서 컨벤션에서 어긋나는 부분을 최대한 수정을 하며 최대한 유사한 코드 스타일을 가지도록 했습니다. 또한 요구사항 정의서를 작성해 필요한 기능들을 세부적으로 정의하고 이에 대해 각자가 맡을 역할들을 분배했습니다. 그 후 각자의 주간 스프린트와 일일 스크럼을 작성하며 최대한 자신의 할 일들을 개발해 나갔습니다. 고민했던 내용들이 있다면, 깃 위키의 트러블 슈팅에 이를 작성하고 해결하면 해결안도 같이 작성을 했습니다.
- 사용 기술
- Room - 사용자 장바구니와 주문 내역 등을 저장하는데 사용됨
- Hilt - Android에 특화된 의존성 주입 라이브러리
- Glide - 간편하게 이미지를 로드하고 이를 뷰에 띄워주는데 사용됨
- WorkManager - 백그라운드에서 필요되는 작업을 수행하기 위해 사용
- AlarmManager - 주문 후 사용자에게 정확한 시간에 맞추어 알려주기 위함
- Retrofit - 네트워크 서비스를 구현하기 위한 라이브러리
- Flow - Reactive한 데이터를 감지하고 뷰에 적용하기 위함
-
배웠던 점(내가 맡은 역할) 저는 이 프로젝트에서 장바구니 기능과 주문 기능을 구현했습니다. 초기에는 화면이 onStart가 될 때 화면을 직접 갱신하는 방향으로 구현했었습니다. 하지만, Flow를 제대로 이해하지 않고 사용하다보니 상당히 비효율 적인 방식임을 후에 깨달았습니다. Room에서는 데이터가 변화되면 이를 flow로 반환해 변화되는 상황들을 소비자에게 알려줄 수 있습니다. 이를 적용해 장바구니가 변경되는 상황에 따라 메인 화면에서 장바구니 뱃지를 변경해주는 방식으로 교체했습니다. 주문 상세 내역에서도 배달이 완료되는 시간이 되었음에도, 해당 화면에서는 배달 중이라는 화면이 갱신이 일어나기 전까지 그대로 유지되었습니다. 이 또한 flow를 이용해 개선을 할 수 있었습니다. 또한 기존에는 NestedScrollView와 RecyclerView를 중첩해서 사용했으나 이것이 비효율적임을 이해하고, RecyclerView의 Multi View Type을 이용하면서 ViewHolder를 재사용할 수 있는 view를 그릴 수 있게 되었습니다. 그리고 Payload를 활용해 아이템이 갱신되었을 때 전체를 갱신하는 것이 아닌 그 아이템의 변화만 적용하게 되어 더 효율적인 개발을 수행할 수 있었습니다.
- 트러블 슈팅 앞서 ScrollView와 RecyclerView를 중첩해서 사용하는 것이 비효율적임을 이해했다고 했는데, 이 부분이 저희가 가졌던 가장 큰 트러블 슈팅이었습니다. NestedScrollView안에 RecyclerView를 사용할 경우, RecyclerView는 아이템을 전부 미리 생성하게 되고, 이에 따라 뷰를 재사용하여 메모리 효율을 높일 수 있는 RecyclerView의 장점이 사라지게 됩니다. 그렇다면 이를 해결할 수 있던 방안은 크게 ConcatAdapter과 Multi View Type 이 있으며, 이 중 하나를 선택하게 되었습니다. ConcatAdapter의 Adapter들은 각자의 ViewHolder Pool을 가지고 있어 서로의 ViewHolder를 재사용할 수 없습니다. 즉, 기존 문제인 뷰의 재사용성을 높이지 못한다는 것을 해결할 수 없다는 의미였습니다. 그래서 저흰 Multi View Type을 활용해 이 문제를 해결하고 또 Multi View Type들을 직접 정의해보면서 막연히 쓰고 있던 RecyclerView를 더 우리의 것으로 만들고자 했습니다.