- 개발 배경
- 제대로 아는 것도 없으면서 새로 배우는 것에만 목매고 있는 최병채. 인터넷의 대부분 강의는 기초적인 내용이라 재미 없는 와중, 인프런의 이 강의를 발견했다.
- MAD. Modern Android Development 의 줄임말. 말만 들어도 미칠것만 같아 바로 수강했다. 이미 아는 내용이 많았지만 그래도 어느정도 새로 배우는 것과 하나의 완성된 앱을 만드는 것에 굉장한 흥미를 느꼈다.
- 근데 Compose를 배우기엔 아직 갈길이 멀다. 이젠 아는것 부터 제대로 갈고 닦자.
- 나는 클론 코딩으로 공부하는게 그렇게 재밌다. 개념과 사용법을 한번에 배울 수 있으니 얼마나 행복한가.
- 앱 설명
- KaKao Open Api를 이용해 도서 검색을 하는 앱이다.
- 검색 창을 통해 원하는 검색어로 책을 검색 할 수 있습니다.
- 책을 클릭하면 상세페이지로 넘어가며, 즐겨찾기 한 책을 관리할 수 있습니다.
- 설정 창에서 정확도순, 최근순 정렬을 지정할 수 있고, 캐시 삭제도 할 수 있습니다.
- 사용한 기술
- Android App Architecture
- Android Jetpack Navigation, WorkManager, Room DB, Paging
- Coroutine Flow
- Hilt
- 배운 것들
-
- MAD(Modern Android Development)를 통해 안드로이드의 최신 기술을 익힐 수 있었다.
- 끊임없이 진화하는 안드로이드의 발전 속도가 부담스럽기도 하지만 그만큼 배울 것이 많아서 신난다.
- 하나의 기술을 한번에 익히는건 불가능하다. 여러번 곱씹어가며 제대로 익혀나가야겠다.
- 생각치 못한 에러가 많이 생겼었다. jetpack의 버전 이슈가 가장 머리 아팠었다.
-
개발 순서
-
gradle 버전 11로 바꾸기
-
ui -> view 패키지 만들고 3개의 프래그먼트 만들기
-
뷰바인딩 설정 및 프래그먼트 코드 정리
-
string.xml 에 프래그먼트 이름 정의하기
-
각 프래그먼트 레이아웃 컨스트로 바꾸기
-
바텀네비게이션 뷰 넣기
- 6-1. 아이콘 3개 넣기
- 6-2. 메뉴 만들기
-
메인 액티비티xml에 바텀 내비, 프레임레이아웃 추가하기
- 7-1. 바텀 내비의 높이 56dp는 머테리얼 디자인의 가이드 높이임
-
메인 액티비티 코틀린에 바텀내비 연결하기
-
레트로핏, 모시, 로깅 인터셉터 의존성 추가
-
카카오 API 가입 및 Response 클래스 만들기
-
util 패키지 만들어서 API 키와 URL 저장하기
-
키 노출 방지를 위해 암호화 하기
-
api 패키지 안에 레트로핏 전부 만들기
-
레포지토리 패키지 만들어서 레포 만들기
-
라이프사이클, 코루틴 의존성 추가
-
뷰모델과 팩토리 만들기
-
메인액티비티kt에서 뷰모델 초기화 하기
-
이미지 다루기 위한 Coil 의존성 추가하기
-
리사이클러뷰 아이템 xml 만들기
-
뷰홀더 및 어댑터 클래스 만들기
-
리사이클러 뷰 의존성 추가 ? 왜??
-
검색 프래그먼트 xml 구현하기
-
검색 프래그먼트 kt 코드 작성
- 23-1. 뷰모델 가져오기
- 23-2. 리사이클러뷰 초기화
- 23-4. 검색창 동작 정의
-
뷰모델에 saveStateHandle 로 쿼리값 저장하기
- 24-1. 의존성 추가
- 24-2. 뷰모델에 코드 추가하기
- 24-3. 뷰모델 프로바이더 코드 고치기
-
jetpack 내비게이션 적용하기
- 25-1. 의존성 추가
- 25-2. 내비 그래프 만들기, id는 메뉴와 동일한 id로!
- 25-3. 액티비티 메인xml의 프레임레이아웃에 컨테이너 넣기
- 25-4. 액티비티 메인kt에서 내비게이션 연동하기
- 25-5. 앱바 타이틀을 라벨값과 연동하기
-
safeArgs의존성 추가
-
웹뷰 표시용 프래그먼트 만들기
-
safeArgs로 전달하기 위해 book 클래스 직렬화 하기
- 28-1. Parcelable을 이용하자
-
BookFragment 라벨 값 정의
-
내비 그래프에 북 프래그먼트 추가
- 30-1. Arguments 받을 수 있도록 속성 추가하기
- 30-2. 검색과 좋아요 프래그먼트에서 북 프래그먼트 연결하기
-
어댑터에서 뷰홀더에 대해 클릭리스너 만들어주기
- 31-1. 검색 프래그먼트에서 리스너 설정해주기
-
북프래그먼트 셋업하기
- 32-1. 뷰바인딩 설정
- 32-2. 웹뷰 설정
-
Room DB 구현하기
- room 의존성 추가하기
- Book클래스에 @Entity 넣기
- 기본키와 항목 지정하기
- db 패키지 만들기
- Dao 만들기
- db 클래스 만들기
- Book의 리스트 타입을 저장하기 위해서 직렬화가 필요
- 의존성 추가
- 컨버터 클래스 작성
- DB 클래스에 컨버터 등록
-
Room DB와 UI 연동하기
- 레포지터리에 DB 조작 함수들 추가하기
- 메인 액티비티 kt 에서 db 생성하기
- 뷰모델에 레포연동 함수 작성하기
- 북 프래그먼트 xml에 FAB 추가하기
- 북 프래그먼트 kt에서 기능 정의하기
- 좋아요 프래그먼트 xml 꾸미기
- 좋아요 프래그먼트 kt 작성하기
- 리사이클러뷰 초기화
- 뷰모델의 favorite book을 옵저빙
- 데이터 삭제 기능 만들기
-
Room 응답을 Livedata에서 flow로 변환하기
- DAO에서 Livedata를 flow로 수정
- 레포지토리 수정
- 뷰모델 수정
- 좋아요 프래그먼트 옵저브를 flow로 바꾸기
-
flow에서 stateFlow로 바꾸기
- 뷰모델 또 고쳐!
- 좋아요 프래그먼트 또 고쳐!
- 필수는 아닌데 보기 싫으니 확장함수로 만들기
- 뷰모델 또 고쳐
-
DataStore를 이용해 앱 설정화면 만들기
- 의존성 추가
- 세팅 프래그먼트 화면 만들기, 라디오버튼 이용
- sort 이넘 클래스 만들기
- 레포지토리에 값을 불러오고 저장하는 함수 만들기
- 뷰모델에 함수 만들기
- 세팅 프래그먼트 kt 코드 작성
- 메인 액티비티에 dataStore 변수 추가
-
Room 응답에 Paging 적용하기
- 의존성 추가
- Dao에 페이징 소스 반환 함수 만들기
- 레포에 함수 추가
- 뷰모델에 함수 추가
- 페이징을 처리할 수 있는 리사이클러 어댑터 만들기
- 좋아요 프래그먼트에서 결과 표시하기
-
Retrofit 응답에 Paging 적용하기
- 레포에 페이징소스 클래스 만들기
- 레포에 함수 만들기
- 뷰모델에 함수 만들기
- 검색 프래그먼트에 결과 표시하기
- 확장함수를 만들어서 사용하자
-
네트워크 로딩 상태 핸들링 하기
- 검색 프래그먼트 xml 파일 수정
- 검색 프래그먼트 kt에 리스너 달기
- 상태 어댑터를 만들자
- 레이아웃 하나 만들기
- 뷰홀더도 만들자!
- 검색 프래그먼트 kt에서 만든걸 모두 연결하자
-
워크매니저를 이용해 주기적으로 앱 캐시를 자동 정리해보자
- 의존성 추가
- 세팅 화면 수정
- 버튼 설정을 저장하는 데이터스토어 구성
- 레포에 메소드 추가
- 뷰모델 수정
- 워커 패키지 생성 후 백그라운드 작업 내용 담기
- 뷰모델 또 수정
- 뷰모델 팩토리에 반영하기
- 메인액티비티 수정
- 세팅화면에서 버튼 동작 구현
-
힐트 준비하기
- 의존성 추가
- 어플리케이션 클래스 작성
- 매니페스트에 등록하기
- di 패키지 작성 후 모듈 클래스 만들기
- 안쓰게 된 제공자들 다 주석처리
- 레포 주입 모듈 만들기
-
힐트 의존성 주입하기
- 레포에 의존성 주입하기
- 뷰모델에 의존성 주입하기
- delegate 의존성 추가하기
- 뷰모델 팩토리 버려
- 메인액티비티 설정
- 워크매니저 의존성 주입
- 앱모듈에 의존성 정의
- 워커에 의존성 주입
- 어플 고치기
- 매니페스트 수정하기
-
관심사에 따라 뷰모델 분리하기
- 뷰모델 클래스 생성하기
- 프래그먼트에서 뷰모델 다시 초기화하기
-
groovy의 gradle 파일을 KTS로 바꾸기
- 빌드 그래들 파일 바꾸기, 과정 개많음
- 세팅 그래들 파일 바꾸기
- build src 디렉토리 만들기
-
로컬 유닛 테스트 맛보기
- 필요한 의존성 추가
- 계산기 클래스를 만들고 단위테스트를 해보자
- 계산기 클래스 만들기
- 테스트 클래스 만들기
-
Instrumented Unit Test 맛보기
- 의존성 추가
- 매인 엑티비티 테스트 작성하기
- Dao 테스트 작성하기
- 한번에 실행하기 위한 Suite 클래스 만들기
-
통합 테스트 맛보기
- 뷰모델과 레포를 통합 테스트 해보자
- 페이크 레포 클래스 만들기
- 뷰모델 테스트 클래스 만들기
- 테스트 클래스에 힐트로 의존성 주입을 해보자
- 의존성 추가
- 힐트 런너 클래스
-
종단간 테스트 맛보기
- 에스프레소 의존성 추가
- 폰 개발자 옵션에서 애니메이션 다 끄기
- 아니면 그래들에서 직접 꺼주기
- 메인액티비티 테스트 코드 작성