Unsplash API를 활용해 이미지를 탐색하고, 보관함에 저장하는 안드로이드 앱입니다.
- Clean Architecture를 기반으로 MVVM 패턴에 따라 모듈화 하였습니다.
![](https://private-user-images.githubusercontent.com/98435928/410300747-263cb50d-8030-418c-ac6e-26526e97255f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk5MzA2OTYsIm5iZiI6MTczOTkzMDM5NiwicGF0aCI6Ii85ODQzNTkyOC80MTAzMDA3NDctMjYzY2I1MGQtODAzMC00MThjLWFjNmUtMjY1MjZlOTcyNTVmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE5VDAxNTk1NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWJiZTJhOTk5MWRhMzRiNTcwNjk5ZmQwODZkMTcyZjBmNmRjZjI4YjA5NGU0NDE4NmJlYWE4MDc3NTViMTFlMzYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.0Q4bHfL7JcCJR8qDwlEuF7WP_5cqt01czs3qFSMAhRc)
-
Git Flow 전략 사용
- 기능별로 Branch를 분리하여 개발을 진행하였습니다.
- 모든 브랜치는 Pull Request에 리뷰를 진행한 후 squash merge 하였습니다.
- Git 관리는 Sourcetree 툴을 사용하였습니다.
![](https://private-user-images.githubusercontent.com/98435928/410336224-bd8134d5-bc9c-43eb-aff9-a776e4ce5f46.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk5MzA2OTYsIm5iZiI6MTczOTkzMDM5NiwicGF0aCI6Ii85ODQzNTkyOC80MTAzMzYyMjQtYmQ4MTM0ZDUtYmM5Yy00M2ViLWFmZjktYTc3NmU0Y2U1ZjQ2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE5VDAxNTk1NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTNjYjY2MTY4M2RlMDQwYmM0NTM1MTFjZWQxNjc5MWMwNTgzY2QxNmU1MTAyMjc0OTM3N2FjYjA3YTI3YTMzNzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.haLalvPC5__9dAPKf23AK6GaOnG6X34otoLu40T53fA)
- 실제 활용 예시
![]() Develop branch |
![]() Feature branch |
-
CI/CD
- Github Actions 을 활용하여 CI/CD 파이프라인을 구축하여 빌드, 테스트, 배포와 같은 작업을 자동화 하였습니다.
- 다양한 수준의 자동화된 테스트(단위 및 통합 테스트)를 실행하여 제대로 working 하도록 검증하는 것 을 목표로 하였습니다.
-
API Test
- Okhttp-profiler 를 이용하여 OkHttp 요청 또는 응답 헤더를 디버깅 하고, api 호출 작업을 tracking 하였습니다.
-
네트워크 트래픽
- 사용자 경험을 향상시키는 것을 목적으로
Job
및Debounce
를 활용하여 잦은 호출 방지를 유도하였습니다. RemoteMediator
를 활용하여 네트워크와 로컬을 연동하여 새로운 데이터 필요시에만 API 호출하도록 구현하였습니다.
- 사용자 경험을 향상시키는 것을 목적으로
-
UI 렌더링
DiffUtil
로 변경 부분만 감지하여 다시 그리도록 하여 UI 업데이트 작업을 최소화 하였습니다.Room DB
를 활용하여 로컬 캐싱으로 오프라인 지원 및 UX 개선하였습니다.
-
apk 사이즈
R8 build
를 적용하여 앱 크기 축소화 및 경량화 하여 약 55.13% 용량 감소하였습니다.
R8 적용 전 |
---|
![]() |
R8 적용 후 |
![]() |
프로젝트를 진행하며 겪은 기술적 문제를 해결해 가는 과정과 이를 통해 배운 점을 정리하여 기록하였습니다.
자세한 내용은 해당 Wiki 페이지에서 확인하실 수 있습니다.
-
메인 화면에서는 매일 새로운 list의 image를 보여줍니다.
-
이미지를 클릭하면 해당 이미지에 대한 상세 정보를 확인할 수 있습니다.
- 내용 (description)
- 사용자 (user name)
- 좋아요수 (likes)
- 업로드 날짜 (created at)
-
이미지의 하트버튼을 누르면 하트 아이콘의 색깔이 채워지고, 해당 이미지가 내 보관함에 저장됩니다.
-
다시 클릭하면 하트 아이콘의 색깔이 비워잠과 동시에 보관함에서 제거됩니다.
-
저장된 이미지는 북마크 페이지에서 저장했던 이미지의 최신순으로 보이고,
보관한 이미지들은 앱 재시작 후에도 다시 확인할 수 있습니다. -
북마크 기능은 홈 화면에서, 상세 페이지에서, 보관함에서 모두 적용됩니다.
-
검색창에 문자를 입력하면 자동으로 search 활동이 시작되고, 키워드에 해당하는 이미지들이 홈화면에 대체되어 출력됩니다.
-
검색어를 입력하지 않으면, 초기에 보였던 이미지들이 기본적으로 보여집니다.
구분 | skill |
---|---|
Language | Koltin |
Architecture | MVVM |
DI | Hilt |
Networking | Retrofit Okhttp |
Asynchronous | Coroutine Flow |
Jetpack | AAC LiveData ViewModel Databinding |
Local DB | Room Pager |
Image | Glide Cardview |
Collaboration | Slack Sourcetree |
ETC | Paging3 DiffUtil Timber |