Skip to content

Jetpack과 Architecture, Kakao 책 검색 API를 이용한 도서 검색 앱

Notifications You must be signed in to change notification settings

chlqudco/KakaoBookSearch

Repository files navigation

인프런 강의 클론코딩 프로젝트 입니다.

  • 개발 배경
    • 제대로 아는 것도 없으면서 새로 배우는 것에만 목매고 있는 최병채. 인터넷의 대부분 강의는 기초적인 내용이라 재미 없는 와중, 인프런의 이 강의를 발견했다.
    • MAD. Modern Android Development 의 줄임말. 말만 들어도 미칠것만 같아 바로 수강했다. 이미 아는 내용이 많았지만 그래도 어느정도 새로 배우는 것과 하나의 완성된 앱을 만드는 것에 굉장한 흥미를 느꼈다.
    • 근데 Compose를 배우기엔 아직 갈길이 멀다. 이젠 아는것 부터 제대로 갈고 닦자.
    • 나는 클론 코딩으로 공부하는게 그렇게 재밌다. 개념과 사용법을 한번에 배울 수 있으니 얼마나 행복한가.

  • 앱 설명
    • KaKao Open Api를 이용해 도서 검색을 하는 앱이다.
    • 검색 창을 통해 원하는 검색어로 책을 검색 할 수 있습니다.
    • 책을 클릭하면 상세페이지로 넘어가며, 즐겨찾기 한 책을 관리할 수 있습니다.
    • 설정 창에서 정확도순, 최근순 정렬을 지정할 수 있고, 캐시 삭제도 할 수 있습니다.

  • 화면 예시
  • KakaoTalk_20221110_192742632_02 KakaoTalk_20221110_192742632 KakaoTalk_20221110_192742632_01

  • 사용한 기술
    • Android App Architecture
    • Android Jetpack Navigation, WorkManager, Room DB, Paging
    • Coroutine Flow
    • Hilt

  • 배운 것들
      • MAD(Modern Android Development)를 통해 안드로이드의 최신 기술을 익힐 수 있었다.
    • 끊임없이 진화하는 안드로이드의 발전 속도가 부담스럽기도 하지만 그만큼 배울 것이 많아서 신난다.
    • 하나의 기술을 한번에 익히는건 불가능하다. 여러번 곱씹어가며 제대로 익혀나가야겠다.
    • 생각치 못한 에러가 많이 생겼었다. jetpack의 버전 이슈가 가장 머리 아팠었다.

개발 순서

  1. gradle 버전 11로 바꾸기

  2. ui -> view 패키지 만들고 3개의 프래그먼트 만들기

  3. 뷰바인딩 설정 및 프래그먼트 코드 정리

  4. string.xml 에 프래그먼트 이름 정의하기

  5. 각 프래그먼트 레이아웃 컨스트로 바꾸기

  6. 바텀네비게이션 뷰 넣기

    • 6-1. 아이콘 3개 넣기
    • 6-2. 메뉴 만들기
  7. 메인 액티비티xml에 바텀 내비, 프레임레이아웃 추가하기

    • 7-1. 바텀 내비의 높이 56dp는 머테리얼 디자인의 가이드 높이임
  8. 메인 액티비티 코틀린에 바텀내비 연결하기

  9. 레트로핏, 모시, 로깅 인터셉터 의존성 추가

  10. 카카오 API 가입 및 Response 클래스 만들기

  11. util 패키지 만들어서 API 키와 URL 저장하기

  12. 키 노출 방지를 위해 암호화 하기

  13. api 패키지 안에 레트로핏 전부 만들기

  14. 레포지토리 패키지 만들어서 레포 만들기

  15. 라이프사이클, 코루틴 의존성 추가

  16. 뷰모델과 팩토리 만들기

  17. 메인액티비티kt에서 뷰모델 초기화 하기

  18. 이미지 다루기 위한 Coil 의존성 추가하기

  19. 리사이클러뷰 아이템 xml 만들기

  20. 뷰홀더 및 어댑터 클래스 만들기

  21. 리사이클러 뷰 의존성 추가 ? 왜??

  22. 검색 프래그먼트 xml 구현하기

  23. 검색 프래그먼트 kt 코드 작성

    • 23-1. 뷰모델 가져오기
    • 23-2. 리사이클러뷰 초기화
    • 23-4. 검색창 동작 정의
  24. 뷰모델에 saveStateHandle 로 쿼리값 저장하기

    • 24-1. 의존성 추가
    • 24-2. 뷰모델에 코드 추가하기
    • 24-3. 뷰모델 프로바이더 코드 고치기
  25. jetpack 내비게이션 적용하기

    • 25-1. 의존성 추가
    • 25-2. 내비 그래프 만들기, id는 메뉴와 동일한 id로!
    • 25-3. 액티비티 메인xml의 프레임레이아웃에 컨테이너 넣기
    • 25-4. 액티비티 메인kt에서 내비게이션 연동하기
    • 25-5. 앱바 타이틀을 라벨값과 연동하기
  26. safeArgs의존성 추가

  27. 웹뷰 표시용 프래그먼트 만들기

  28. safeArgs로 전달하기 위해 book 클래스 직렬화 하기

    • 28-1. Parcelable을 이용하자
  29. BookFragment 라벨 값 정의

  30. 내비 그래프에 북 프래그먼트 추가

    • 30-1. Arguments 받을 수 있도록 속성 추가하기
    • 30-2. 검색과 좋아요 프래그먼트에서 북 프래그먼트 연결하기
  31. 어댑터에서 뷰홀더에 대해 클릭리스너 만들어주기

    • 31-1. 검색 프래그먼트에서 리스너 설정해주기
  32. 북프래그먼트 셋업하기

    • 32-1. 뷰바인딩 설정
    • 32-2. 웹뷰 설정
  33. Room DB 구현하기

    • room 의존성 추가하기
    • Book클래스에 @Entity 넣기
    • 기본키와 항목 지정하기
    • db 패키지 만들기
    • Dao 만들기
    • db 클래스 만들기
    • Book의 리스트 타입을 저장하기 위해서 직렬화가 필요
      • 의존성 추가
      • 컨버터 클래스 작성
      • DB 클래스에 컨버터 등록
  34. Room DB와 UI 연동하기

    • 레포지터리에 DB 조작 함수들 추가하기
    • 메인 액티비티 kt 에서 db 생성하기
    • 뷰모델에 레포연동 함수 작성하기
    • 북 프래그먼트 xml에 FAB 추가하기
    • 북 프래그먼트 kt에서 기능 정의하기
    • 좋아요 프래그먼트 xml 꾸미기
    • 좋아요 프래그먼트 kt 작성하기
      • 리사이클러뷰 초기화
      • 뷰모델의 favorite book을 옵저빙
      • 데이터 삭제 기능 만들기
  35. Room 응답을 Livedata에서 flow로 변환하기

    • DAO에서 Livedata를 flow로 수정
    • 레포지토리 수정
    • 뷰모델 수정
    • 좋아요 프래그먼트 옵저브를 flow로 바꾸기
  36. flow에서 stateFlow로 바꾸기

    • 뷰모델 또 고쳐!
    • 좋아요 프래그먼트 또 고쳐!
    • 필수는 아닌데 보기 싫으니 확장함수로 만들기
    • 뷰모델 또 고쳐
  37. DataStore를 이용해 앱 설정화면 만들기

    • 의존성 추가
    • 세팅 프래그먼트 화면 만들기, 라디오버튼 이용
    • sort 이넘 클래스 만들기
    • 레포지토리에 값을 불러오고 저장하는 함수 만들기
    • 뷰모델에 함수 만들기
    • 세팅 프래그먼트 kt 코드 작성
    • 메인 액티비티에 dataStore 변수 추가
  38. Room 응답에 Paging 적용하기

    • 의존성 추가
    • Dao에 페이징 소스 반환 함수 만들기
    • 레포에 함수 추가
    • 뷰모델에 함수 추가
    • 페이징을 처리할 수 있는 리사이클러 어댑터 만들기
    • 좋아요 프래그먼트에서 결과 표시하기
  39. Retrofit 응답에 Paging 적용하기

    • 레포에 페이징소스 클래스 만들기
    • 레포에 함수 만들기
    • 뷰모델에 함수 만들기
    • 검색 프래그먼트에 결과 표시하기
    • 확장함수를 만들어서 사용하자
  40. 네트워크 로딩 상태 핸들링 하기

    • 검색 프래그먼트 xml 파일 수정
    • 검색 프래그먼트 kt에 리스너 달기
    • 상태 어댑터를 만들자
    • 레이아웃 하나 만들기
    • 뷰홀더도 만들자!
    • 검색 프래그먼트 kt에서 만든걸 모두 연결하자
  41. 워크매니저를 이용해 주기적으로 앱 캐시를 자동 정리해보자

    • 의존성 추가
    • 세팅 화면 수정
    • 버튼 설정을 저장하는 데이터스토어 구성
    • 레포에 메소드 추가
    • 뷰모델 수정
    • 워커 패키지 생성 후 백그라운드 작업 내용 담기
    • 뷰모델 또 수정
    • 뷰모델 팩토리에 반영하기
    • 메인액티비티 수정
    • 세팅화면에서 버튼 동작 구현
  42. 힐트 준비하기

    • 의존성 추가
    • 어플리케이션 클래스 작성
    • 매니페스트에 등록하기
    • di 패키지 작성 후 모듈 클래스 만들기
    • 안쓰게 된 제공자들 다 주석처리
    • 레포 주입 모듈 만들기
  43. 힐트 의존성 주입하기

    • 레포에 의존성 주입하기
    • 뷰모델에 의존성 주입하기
    • delegate 의존성 추가하기
    • 뷰모델 팩토리 버려
    • 메인액티비티 설정
    • 워크매니저 의존성 주입
    • 앱모듈에 의존성 정의
    • 워커에 의존성 주입
    • 어플 고치기
    • 매니페스트 수정하기
  44. 관심사에 따라 뷰모델 분리하기

    • 뷰모델 클래스 생성하기
    • 프래그먼트에서 뷰모델 다시 초기화하기
  45. groovy의 gradle 파일을 KTS로 바꾸기

    • 빌드 그래들 파일 바꾸기, 과정 개많음
    • 세팅 그래들 파일 바꾸기
    • build src 디렉토리 만들기
  46. 로컬 유닛 테스트 맛보기

    • 필요한 의존성 추가
    • 계산기 클래스를 만들고 단위테스트를 해보자
    • 계산기 클래스 만들기
    • 테스트 클래스 만들기
  47. Instrumented Unit Test 맛보기

    • 의존성 추가
    • 매인 엑티비티 테스트 작성하기
    • Dao 테스트 작성하기
    • 한번에 실행하기 위한 Suite 클래스 만들기
  48. 통합 테스트 맛보기

    • 뷰모델과 레포를 통합 테스트 해보자
    • 페이크 레포 클래스 만들기
    • 뷰모델 테스트 클래스 만들기
    • 테스트 클래스에 힐트로 의존성 주입을 해보자
    • 의존성 추가
    • 힐트 런너 클래스
  49. 종단간 테스트 맛보기

    • 에스프레소 의존성 추가
    • 폰 개발자 옵션에서 애니메이션 다 끄기
    • 아니면 그래들에서 직접 꺼주기
    • 메인액티비티 테스트 코드 작성

About

Jetpack과 Architecture, Kakao 책 검색 API를 이용한 도서 검색 앱

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages