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
기반 화면 이동 처리를 도와줍니다.
- Android 스튜디오의 Navigation Editor를 사용하여 앱의 탐색 그래프를 지원하며,
- 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
로 구성한 구조로, 주로 JetPackNavigation
과 함께 사용합니다.
- 하나 혹은 적은 개수의
- Repository Pattern
DataSource
를 캡슐화 시켜Data
의 출처와 관계 없이 동일한 인터페이스로 데이터에 접근할 수 있도록 도메인과 데이터 레이어들 사이를 중재 해주는 디자인 패턴입니다.
- Dependency Injection
- 의존성 주입은 확장 및 테스트 가능한 Android 앱을 만드는 데 유용한 기법이며, 이 프로젝트에서는
Hilt
를 통해 이러한 의존 주입 프로세스를 자동화합니다.
- 의존성 주입은 확장 및 테스트 가능한 Android 앱을 만드는 데 유용한 기법이며, 이 프로젝트에서는
buildsrc
- 멀티 모듈 특성상 나뉘어 있는 라이브러리 의존성을 한 곳에서 관리함으로써 통일성을 보장합니다.
presentation
Data
,Domain
모듈에 의존성을 가지고, 화면 처리와 관련된 일련의 작업을 담당하며View
,ViewModel
이 이에 속합니다.
domain
- 어떠한 모듈에도 의존성을 가지지 않고, 비즈니스 로직을 관리하며
UseCase
,Repository
(인터페이스)가 이에 속합니다.
- 어떠한 모듈에도 의존성을 가지지 않고, 비즈니스 로직을 관리하며
data
Domain
계층에 의존성을 가지고, 네트워크나 로컬 DB의 데이터 접근을 담당하며Repository
(구현클래스),DataSource
,DTO
가 이에 속합니다.
해당 프로젝트는 Marvel Comics API 연동을 통해 데이터를 표시하며, 이 앱에서 사용되는 콘텐츠들의 저작권은 Marvel에 있습니다.
앱 빌드를 위해선 Marvel의 개발자 포털에서 API Key를 발급받아 아래와 같은 설정이 필요합니다.
프로젝트 루트 디렉터리에 위치한 local.properties
파일에 아래와 같이 동일한 필드명에 API Key 정보를 입력해야 하며
프로젝트 빌드 시 Data 모듈
에 생성되는 BuildConfig
의 필드를 통해 앱에서 사용됩니다.