MediaBox는 콘텐츠(이미지, 동영상)를 검색하고 북마크할 수 있는 앱입니다. 원하는 콘텐츠를 빠르게 찾고 저장할 수 있도록 제공하며, 모듈화된 클린 아키텍처를 적용하여 코드의 유지보수성과 확장성을 높였습니다.
- Kotlin
- MVI, Clean Architecture
- Jetpack Compose
- Coroutine & Flow
- Hilt
- Retrofit, OkHttp
- DataStore
- Paging 3
이 프로젝트는 클린 아키텍처에 따라 다음과 같은 모듈로 구성되어 있습니다:
- app: 애플리케이션의 진입점, Hilt를 사용한 DI 설정, 기본 애플리케이션 설정
- core-ui: 재사용 가능한 UI 컴포넌트, 테마, 색상
- feature: 기능별로 분리된 모듈로, 각 기능에 필요한 화면, ViewModel 및 관련 로직 포함
- main: 앱의 메인 화면 구현, 내비게이션 처리
- search: 검색 기능 구현, 검색 결과 표시
- bookmark: 북마크 기능 구현, 저장된 콘텐츠 관리
- domain: UseCase, 도메인 모델, Repository 인터페이스
- data: Repository 구현체, 데이터 소스, 페이징
- data-local: 로컬 데이터 관리, DataStore를 통한 영속성
- data-remote: 원격 API 통신, 네트워크 처리
- 검색 기능: API를 통한 데이터 검색 및 결과 표시, 동일한 검색어 입력 시 5분간 결과 캐싱으로 빠른 응답 제공, 사진과 동영상을 내림차순으로 정렬하여 최신 콘텐츠 우선 표시
- 북마크 기능: 관심 항목 저장 및 관리
아래 화살표는 의존성 방향을 나타냅니다 (A → B는 "A가 B에 의존한다"는 의미).
┌─────────────────────────────┐ ┌─────────────────────────────┐
│ Feature │ │ Core-UI │
│ │ │ │
│ ┌─────────────────┐ │ │ ┌─────────────────┐ │
│ │ Views │ │ │ │ UI Components │ │
│ │ (Compose) │ │ │ │ (Compose) │ │
│ └────────┬────────┘ │──────►│ └─────────────────┘ │
│ │ │ │ │
│ │ │ │ │
│ ▼ │ │ ┌─────────────────┐ │
│ ┌─────────────────┐ │ │ │ theme │ │
│ │ ViewModel │ │ │ └─────────────────┘ │
│ └────────┬────────┘ │ │ │
└─────────────┼───────────────┘ └─────────────────────────────┘
│
▼
┌─────────────────────────────┐
│ Domain │
│ │
│ ┌─────────────────┐ │
│ │ Use Cases │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Repositories │ │
│ │ (Interface) │ │
│ └─────────────────┘ │
└─────────────┬───────────────┘
▲
│
┌─────────────┼───────────────┐
│ Data │
│ │
│ ┌─────────────────┐ │
│ │ Repositories │ │
│ │ (Implementation)│ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Data Sources │ │
│ └─────────────────┘ │
└─────────────┬───────────────┘
▲
┌────┴────┐
│ │
┌────────┴───┐ ┌───┴────────┐
│ Local │ │ Remote │
│ Data │ │ Data │
└────────────┘ └────────────┘

