Unsplash API를 활용해 이미지를 탐색하고, 보관함에 저장하는 안드로이드 앱입니다.
- Clean Architecture를 기반으로 MVVM 패턴에 따라 모듈화 하였습니다.
![](https://private-user-images.githubusercontent.com/98435928/410300747-263cb50d-8030-418c-ac6e-26526e97255f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0NjE3NzEsIm5iZiI6MTczOTQ2MTQ3MSwicGF0aCI6Ii85ODQzNTkyOC80MTAzMDA3NDctMjYzY2I1MGQtODAzMC00MThjLWFjNmUtMjY1MjZlOTcyNTVmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEzVDE1NDQzMVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTE2ZGM5ZWFlMjUzNTY0ZjljZGQwYTBlMjYyMGVjNDlmZDZiZWE5MTg3NTBiYjU3YWM5NWZiMTBkMGM3Y2UzMWEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.UhqGpuxkozwFxOXR80CRf65jV9pl8NDV2ytfts_1Fj8)
-
Git Flow 전략 사용
- 기능별로 Branch를 분리하여 개발을 진행하였습니다.
- 모든 브랜치는 Pull Request에 리뷰를 진행한 후 merge 하였습니다.
- Git 관리는 Sourcetree 툴을 사용하였습니다.
![](https://private-user-images.githubusercontent.com/98435928/410336224-bd8134d5-bc9c-43eb-aff9-a776e4ce5f46.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0NjE3NzEsIm5iZiI6MTczOTQ2MTQ3MSwicGF0aCI6Ii85ODQzNTkyOC80MTAzMzYyMjQtYmQ4MTM0ZDUtYmM5Yy00M2ViLWFmZjktYTc3NmU0Y2U1ZjQ2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEzVDE1NDQzMVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZlY2UyMWQ0MjNmYWExYmRjY2Y2MjA4MTc4Njk1YTFmMTQ4MWQ4NjM1MWZmYTI4YmZkNzIyNTExZTdkM2Y5YTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.o6GVYYSGJhM3psY0hA5hFIDZ0SVpnWKX6mhmQ-eVhGw)
- 실제 활용된 모습
![]() Develop branch |
![]() Feature branch |
-
CI/CD
- Github Actions 을 활용하여 CI/CD 파이프라인을 구축하여 빌드, 테스트, 배포와 같은 작업을 자동화하였습니다.
- 다양한 수준의 자동화된 테스트(단위 및 통합 테스트)를 실행하여 제대로 working 하도록 검증하는 것 을 목표로 하였습니다.
-
API Test
- Okhttp-profiler 를 이용하여 OkHttp 요청 또는 응답 헤더를 디버깅 하고, api 호출 작업을 tracking 하였습니다.
-
사용자 경험을 향상시키는 것을 목적으로
Job
및Debounce
를 활용하여 효율적인 api 호출 작업을 유도하였습니다. -
DiffUtil
로 변경 부분만 감지하여 다시 그리도록 하여 UI 업데이트 작업을 최소화 하였습니다. -
Room DB
캐시에서 UI를 구동하도록 하고 새로운 데이터 필요시에만 네트워크 호출을 하도록 구현하여 오프라인 지원 및 불필요한 네트워크 통신을 줄였습니다. -
R8 build
를 적용하여 앱(apk) 크기 축소화 및 경량화 하여 성능 개선 및 최적화하였습니다.
적용 전 | |
적용 후 | |
![]() |
프로젝트를 진행하며 겪은 기술적 문제를 해결해 가는 과정과 이를 통해 배운 점을 정리하여 기록하였습니다.
자세한 내용은 해당 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 |