TripDraw 학습 내용

TripDraw 팀프로젝트를 진행하며 학습한 내용을 자세히 정리하였습니다.
## 💡 학습한 부분 우아한테크코스 과정을 거치며 객체지향, 도메인, 개발 전반의 개념을 학습 후 도입해본 프로젝트입니다. 아키텍처 패턴을 다양한 관점으로 바라보며 관심사 분리, 테스트 성 등 아키텍처 패턴을 사용했을 때의 이점을 끌어낼 수 있도록 고민하며 코드를 작성하였습니다. 팀의 리드로서 팀을 이끌고 모든 부분에 대해 확실하게 학습할 수 있는 계기가 되었습니다. 일정 추산, 팀원 간의 갈등 해소 등 개발 외적으로도 많이 성장하게 되었습니다.
- **도메인에 대한 개념 학습 및 객체지향적으로 코드를 작성하는 연습** 개발 패러다임의 근본 중 하나인 객체지향적인 코드를 통하여 객체들에 적절한 책임을 부여하도록 코드를 작성하였습니다. 도메인 모델을 확립 후 비지니스 로직을 도메인 모델에 배치하려 노력하였습니다. 이를 통해 뷰모델이 비대해지는 현상을 피할 수 있도록 하였습니다. 또한 외부의 변화에 흔들리지 않는 도메인을 구축하려 노력하였습니다.
- **아키텍처 패턴 전반에 대한 이해** UI 아키텍처 패턴의 핵심이라고 생각하는 관심사 분리를 고려하며 코드를 작성하였습니다. 뷰, 도메인, 데이터 레이어를 나누고 각 레이어의 변경 사항이 다른 레이어에 전파되지 않도록 고려하였습니다. 레이어 내부에서도 변경 사항이 최대한 전파되지 않을 수 있는 구조와 네이밍에 대해 고려하였습니다. 테스트를 위한 구조를 고려하고 유닛테스트의 용이성을 위하여 안드로이드 의존성을 최대한 제거하려 노력하였습니다.
- **테스트 도입** 유닛 테스트를 통하여 비지니스 로직에 대한 검증과 뷰모델의 검증을 시도하였습니다. 테스트 더블에 대해 학습하고 적용하였습니다.
- **기술에 대한 이해도 있는 접근 및 최적화 시도** 위치 트래킹 기능 개발 시 여러 가지 방법 중 다양한 요소를 고려하여 기술을 채택 하였습니다. - 사용자 편의성 ex) 백그라운드 위치 권한을 우회하기 위해 BroadcastReceiver 대신 Foreground service사용 - 배터리, 발열 등 성능 ex) 배터리, 발열에 대한 최적화를 위해 service 대신 AlarmManager를 도입
- **서버통신 오류처리(callAdapter)관련 보일러플레이트 코드 제거** 서버 통신관련 오류처리를 계속 발전시키려고 시도하였습니다. sealed class의 경우의 수 각각에 대한 처리 로직을 매번 작성해주어야 해서 많은 보일러플레이트 코드가 생성되는 것을 개선하였습니다. process라는 유틸 함수를 제작하여 일반적인 상황에 대한 기본 핸들러를 달아주어 매번 처리 로직을 작성하지 않도록 개선하였습니다. [process 함수 코드](https://github.com/woowacourse-teams/2023-trip-draw/blob/develop-android/android/app/src/main/java/com/teamtripdraw/android/data/httpClient/retrofitAdapter/responseState/ResponseState.kt)
- **OkHttp 학습 내용 적용 및 최적화** Http 통신 라이브러리인 OKhttp와 Retrofit에 대한 학습 내용을 적용하였습니다. 서버 통신 시 쓰레드 처리를 해주는 OKHttp Dispatcher에 대한 학습 후 성능 최적화를 위해 MaxRequestsPerHost를 10으로 변경하여 성능을 개선했습니다. [서버 통신 스레드 관련 학습 블로그 글](https://mccoy-devloper.tistory.com/127) [레트로핏 학습 블로그 글](https://mccoy-devloper.tistory.com/126) OkHttp connectionPool과 threadPool을 관리하는 방법에 대하여 학습하여 OKhttp client를 여러 개 생성할 때 자원이 낭비되지 않도록 connectionPool과 threadPool 을 공유하도록 설정하였습니다.
- **촘촘한 오류처리** 오류가 자주 일어나는 지점을 정의하고 이에 대한 에러 핸들러를 범용적으로 사용할 수 있도록 작성하여 매번 같은 로직을 배치하지 않도록 하였습니다. 이를 통해 개별적인 오류처리의 경우 간결하게 작성하여 유지보수성을 높였습니다. 오류가 다수 발생하는 지점 및 관련 핸들러 - 서버 통신 → callAdapter 커스텀을 통한 핸들러 - 로컬 I/O → coroutineExceptionHandler - 그 외의 다양한 오류 → UncaughtExceptionHandelr + Crashlytics조합을 통한 사용자 경험 개선
- **모니터링 시스템 도입** 오류에 대한 빠른 대응을 위해 원격 로깅 및 모니터링 시스템을 구축하였습니다. Crashlytics를 도입하고 슬랙과 연동하여 빠른 알림을 받을 수 있도록 하였습니다. Sentry를 도입하여 원격으로 에러 정보를 수집하여 에러의 원인을 파악하기 쉽게 하였습니다. [Sentry 도입에 관한 블로그 글](https://mccoy-devloper.tistory.com/131)
## 🖥 담당한 기능 (Android) 기초세팅 - 안드로이드 - [모듈분리(domain, support)](https://github.com/woowacourse-teams/2023-trip-draw/issues/1) - gradle 관리(version catalog를 통한 버전관리) - [DI 기초세팅 시 수동 DI 세팅](https://github.com/woowacourse-teams/2023-trip-draw/issues/43) (안드로이드 수동 DI 공식문서 참고)(현재 Hilt로 변경) - [Release, Dev 버전 분리 및 관련 처리 (각종 log tool 사용여부, baseurl)](https://github.com/woowacourse-teams/2023-trip-draw/issues/248) - Http 클라이언트(Retrofit2, OkHttp) - Sealed class를 통한 서버 통신 응답 상황 분기 처리 (callAdapter커스텀 사용) - [callAdapter커스텀 관련 보일러플레이트 코드 제거용 process 함수 생성](https://github.com/woowacourse-teams/2023-trip-draw/issues/3#callAdapter%20%EA%B4%80%EB%A0%A8%20util%20%ED%95%A8%EC%88%98%20%EC%9E%91%EC%84%B1) - [okhttp 커넥션풀, maxRequest 조절, Interceptor 설정](https://github.com/woowacourse-teams/2023-trip-draw/issues/3#OKhttp%20maxRequestsPerHost%EC%88%98%2010%EC%9C%BC%EB%A1%9C%20%EC%A1%B0%EC%A0%95) - Log 및 에러 모니터링 툴 Sentry, firebase crashlytics 세팅 - [Firebasse Crashlttics, Timber, sentry 를 이용하여 Releaese 와 debug 버전 별로 로컬 혹은 원격에 로깅 하는 기준을 잡고 이에 대한 처리를 담당하는 logUtil 제작](https://mccoy-devloper.tistory.com/131) - Firebase Crashlytics 세팅 - Sentry 세팅 - 소셜로그인 및 토큰 관련 처리 - [카카오 소셜로그인 도입](https://github.com/woowacourse-teams/2023-trip-draw/issues/266) - [자체 access token 관리 및 refresh token을 통하여 자동 갱신 로직 작성(callAdapter에 도입)](https://github.com/woowacourse-teams/2023-trip-draw/issues/352) - 위치 트래킹 및 지도 위치 표시 기능 개발 - 네이버 지도 관련 기능 개발 - [fusedLocationClient, AlarmManager, Service 를 사용하여 일정 기간마다 위치정보를 서버에 저장하는 기능 개발(위치 트래킹)](https://github.com/woowacourse-teams/2023-trip-draw/issues/75) - 위치 트래킹 기능 백그라운드 기능 최적화 - 위치 관련 권한 처리 - [bindService를 통하여 서버 업데이트 사항 해당 액티비티가 켜져 있다면 최신화하는 기능 개발](https://github.com/woowacourse-teams/2023-trip-draw/issues/193)
## 🛠 사용 기술 및 라이브러리 - 아키텍쳐 패턴 : MVVM - AAC : Databinding, Livedata, ViewModel - 통신 : OkHttp3, Retrofit2 - Async Task : Coroutine - 직렬화 : Parcelable(Pacelize) - Third Party Library : Glide, Moshi - 협업 : Git flow - DI : Hilt