Skip to content

robot156/ImageSearchApp

Repository files navigation

이미지 검색 앱

이미지검색앱은 MVVM 아키텍처를 기반으로 하고 있고 Hilt, Coroutines, Flow, Jetpack을 사용하여 모던 안드로이드 앱개발을 지향하고 있습니다.

Screenshots



기술 스택 및 오픈소스 라이브러리

  • 최소 API 레벨 21
  • Kotlin 기반, 코루틴 + Flow 를 사용한 비동기 처리
  • Jetpack
    • Lifecycle
    • ViewModel
    • DataBinding
    • Room
    • Hilt
    • Paging3
  • Architecture
    • Clean Architecture
    • MVVM Architecture
    • Repository Pattern
  • Retrofit2 & OkHttp3
    • Rest Api 통신과 Http 로그 추적
  • Kotlin Serializable
    • JSON 파싱 라이브러리
  • Timber

Build-Logic

Convention Plugins

build-logic 모듈에서는 공통으로 사용되는 라이브러리들을 커스텀 플러그인을 통해 정의합니다.

이를 통해 기존 gradle.kts들에서 반복되는 보일러플레이트를 줄이고 해당 라이브러리를 하나의 파일로 관리할 수 있습니다.


Version Catalogs

[versions]
androidxCore = "1.9.0"

[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "androidxCore" }

buildSrc 폴더에서 코틀린 클래스로 관리하던 라이브러리 소스들을 libs.toml로 이전하였습니다.

toml의 직관적인 규칙을 통해 플러그인과 라이브러리를 간편하게 작성하고 관리할 수 있습니다.


Architecture OverView

Architecture

각 계층은 단방향 이벤트/데이터 흐름을 따릅니다. UI Layer는 사용자 이벤트를 Domain Layer로 내보내고 Domain Layer는 데이터를 Data Layer로 전송합니다. Data Layer는 스트림으로 데이터를 레포지토리에 노출합니다.


UI Layer

Ui Layer

View에서는 사용자 Event를 ViewModel로 전달하고 ViewModel을 관찰하여 변경된 데이터를 UI에 노출하는 역할을 합니다.

ViewModel은 View에서 전달 받은 Event Data를 하위 계층인 Domain UseCase에 전달하고 데이터의 상태를 Flow Stream을 통해 관찰하여 Flow ViewHolder인 StateFlow를 통해 View에게 변경사항을 알려줍니다.


Domain Layer

Domain Layer

비즈니스 로직을 담당하는 계층입니다. 변경될 수 있는 모든 외부 세계로부터 독립되어 있는 특징을 갖고 있습니다.

데이터 레이어와의 의존성을 느슨하게 만들기 위해 Repository pattern을 통해 Interface를 주입받아서 데이터 레이어에 접근합니다.

Data Layer

Data Layer

클린아키텍처에서, 가장 바깥층에 있는 계층으로 Retrofit을 통해 Remote 데이터를 주고받고, Room을 통해 로컬 데이터베이스에 접근하여 데이터를 수정, 조회합니다.

필요에 따라 이 계층에서 Remote 데이터를 로컬에 저장하여 데이터를 관리하는 플로우를 작성할 수도 있습니다.

Open API

https://unsplash.com/ko UnSplash API는 페이징을 지원하는 오픈 라이선스 이미지 검색 API입니다.