Skip to content

Gun-HelloWorld/Android_MVVM_CleanArchitecture

Repository files navigation

Android MVVM Clean Architecture


MVVM & Clean Architecture 패턴을 적용하고 Marvel의 Public API를 통해 수집한 데이터를 표시하는 안드로이드 샘플 앱


화면

Home Detail

Search Favorite

적용 범위

  • 홈 화면 - 상단 로고 애니메이션, 배너, 카테고리별 아이템 표시
  • 아이템 상세 화면 - 각 콘텐츠 상세화면 표시
  • 검색 화면 - 검색 결과 표시
  • 즐겨찾기 화면 - 로컬 기반 즐겨찾기 컬렉션 표시

기술 스택 및 라이브러리

  • Kotlin
    • 안드로이드 공식 프로그래밍 기본 언어입니다.
  • Coroutine
    • Android의 비동기 프로그래밍에 권장되는 솔루션이며 경량 스레드라고도 표현합니다.
  • Flow
    • 여러 값을 순차적으로 방출하는 비동기 데이터 스트림을 지원합니다.
  • StateFlow
    • 초기값과 마지막 값을 보유하며 중복된 데이터를 발행하지 않아 주로 화면에 표시할 UI 데이터에 사용됩니다.
  • SharedFlow
    • 초기값과 마지막 값을 값을 보유하지 않고 중복된 데이터를 발행하여 주로 일회성 이벤트 액션에 사용됩니다.
  • Gradle Kotlin DSL
    • Gradle 스크립트 언어로, 자동완성 지원 및 가독성 확보 이점을 확보하기 위해 사용합니다.
  • Hilt
    • Dagger2 기반 안드로이드 전용 DI 라이브러리입니다.
  • Retrofit2, OkHttp3
    • REST API를 호출하기 위한 비동기 네트워크 처리를 단순화 시켜줍니다.
  • Gson
    • Json 포맷의 요청/응답 데이터를 쉽게 파싱할 수 있도록 도와줍니다.
  • AAC-Navigation
    • Android 스튜디오의 Navigation Editor를 사용하여 앱의 탐색 그래프를 지원하며, Fragment 기반 화면 이동 처리를 도와줍니다.
  • AAC-DataBinding
    • View 바인딩 절차를 간소화하고 View 클래스에서 담당하는 로직을 xml 상에서 처리하여 View 클래스의 역할을 분담하도록 할 수 있습니다.
  • AAC-ViewModel
    • 화면 회전 시 View가 재생성 되지만 관련 데이터가 소멸되지 않도록 보장하며, 사용자 이벤트를 처리하고 View에서 표시해야 할 데이터 및 상태를 관리합니다.
  • AAC-Paging3
    • 화면에 표시된 데이터 리스트를 끝까지 스크롤 시 자동으로 다음 데이터 세트를 요청하여 효율적인 페이징 처리를 쉽게 도와줍니다.
  • AAC-Room
    • SQLite를 보다 쉽게 사용할 수 있도록 도와주며, 직접적인 Thread Switching 없이도 DAO 인터페이스이 쿼리 함수에 Kotlin의 suspend 키워드를 명시하여 내부적으로 비동기처리 되도록 지원합니다.
  • Glide
    • 이미지를 빠르고 효율적으로 표시해 주는 것을 도와줍니다.
  • DotsIndicator
    • 뷰페이저 인디케이터를 쉽게 관리하도록 지원합니다.
  • CardView
    • 그림자, 테두리 변형 등 간편하게 스타일을 일관되게 유지하는 데 도움을 주는 라이브러리입니다.
  • ShimmerEffect
    • 비동기 처리 중 사용 시 애니메이션을 적용한 로딩 표시를 지원하여 UI 퍼포먼스를 올려줍니다.
  • Junit4
    • 단위 테스트를 위한 테스트 Framework 입니다.
  • kotlinx-coroutines-test
    • runTest와 같은 코루틴을 효율적으로 테스트하기 위한 유틸리티를 제공합니다.
  • Turbine
    • flow 테스트를 더 쉽게 할 수 있도록 도와줍니다.
  • Turbine
    • flow 테스트를 더 쉽게 할 수 있도록 도와줍니다.
  • Mockk
    • 테스트 타겟 이외의 객체를 모의 객체로 생성하고 동작을 지정하여 테스트 코드를 읽기 쉽고 유지 관리할 수 있게 도와줍니다.

아키텍처

  • MVVM
    • 아키텍처 패턴 중 하나로, 데이터를 처리할 모델(Model), 사용자에게 보여지는 UI인 뷰(View), 뷰에 바인딩 되어 모델과 뷰 사이를 이어주는 뷰 모델(View Model)로 분리합니다.
  • Clean Architecture
    • 관심사를 계층 구조로 분리하자는 목표를 가지며 이를 통해 프로젝트 규모가 커짐에 따라 유지보수성과 확장성을 높입니다.
  • Multi-Module
    • 각 모듈을 독립적으로 관리하고 명시적인 모듈 종속성 선언 없이는 참조할 수 없도록 강력하게 접근성을 제한할 수 있습니다.
  • SAA (Single Activity Architecture)
    • 하나 혹은 적은 개수의 Activity만을 사용하고 나머지 화면은 Fragment로 구성한 구조로, 주로 JetPack Navigation과 함께 사용합니다.
  • Repository Pattern
    • DataSource를 캡슐화 시켜 Data의 출처와 관계 없이 동일한 인터페이스로 데이터에 접근할 수 있도록 도메인과 데이터 레이어들 사이를 중재 해주는 디자인 패턴입니다.
  • Dependency Injection
    • 의존성 주입은 확장 및 테스트 가능한 Android 앱을 만드는 데 유용한 기법이며, 이 프로젝트에서는 Hilt를 통해 이러한 의존 주입 프로세스를 자동화합니다.

Multi-Module

  • buildsrc
    • 멀티 모듈 특성상 나뉘어 있는 라이브러리 의존성을 한 곳에서 관리함으로써 통일성을 보장합니다.
  • presentation
    • Data, Domain 모듈에 의존성을 가지고, 화면 처리와 관련된 일련의 작업을 담당하며 View, ViewModel이 이에 속합니다.
  • domain
    • 어떠한 모듈에도 의존성을 가지지 않고, 비즈니스 로직을 관리하며 UseCase, Repository(인터페이스)가 이에 속합니다.
  • data
    • Domain 계층에 의존성을 가지고, 네트워크나 로컬 DB의 데이터 접근을 담당하며 Repository(구현클래스), DataSource, DTO가 이에 속합니다.

Marvel Comics API

해당 프로젝트는 Marvel Comics API 연동을 통해 데이터를 표시하며, 이 앱에서 사용되는 콘텐츠들의 저작권은 Marvel에 있습니다.


앱 빌드 시 필요한 필수 설정 항목

앱 빌드를 위해선 Marvel의 개발자 포털에서 API Key를 발급받아 아래와 같은 설정이 필요합니다. 프로젝트 루트 디렉터리에 위치한 local.properties 파일에 아래와 같이 동일한 필드명에 API Key 정보를 입력해야 하며 프로젝트 빌드 시 Data 모듈에 생성되는 BuildConfig의 필드를 통해 앱에서 사용됩니다.

image