22
33## 📱 프로젝트 개요
44
5- ** RunCombi** 는 반려동물과 함께하는 운동을 기록하고 관리하는 Android 애플리케이션입니다. 사용자와 반려동물의 운동 데이터를 실시간으로 추적하고, 건강한 라이프스타일을 지원합니다.
5+ ** RunCombi** 는 반려동물과 함께하는 운동을 기록하고 관리하는 Android 애플리케이션입니다.
66
77### 주요 기능
8- - 🚶♂️ 실시간 운동 추적 (걷기, 뛰기)
98- 🐕 반려동물과 함께하는 운동 기록
10- - 📊 운동 통계 및 칼로리 계산
119- 🗺️ GPS 기반 경로 추적
12- - 🔄 백그라운드 운동 기록 (ForegroundService)
1310- 👥 사용자 프로필 및 반려동물 관리
1411
15- ## 🏗 ️ 프로젝트 아키텍처
12+ ## 🛠 ️ 프로젝트 기술 스택
1613
17- ### Clean Architecture + MVVM 패턴
14+ < div align = " center " >
1815
19- ```
20- ┌─────────────────────────────────────────────────────────────┐
21- │ Presentation Layer │
22- │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
23- │ │ Screens │ │ ViewModels │ │ Composables│ │
24- │ └─────────────┘ └─────────────┘ └─────────────┘ │
25- └─────────────────────────────────────────────────────────────┘
26- │
27- ┌─────────────────────────────────────────────────────────────┐
28- │ Domain Layer │
29- │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
30- │ │ UseCases │ │ Entities │ │ Repositories│ │
31- │ └─────────────┘ └─────────────┘ └─────────────┘ │
32- └─────────────────────────────────────────────────────────────┘
33- │
34- ┌─────────────────────────────────────────────────────────────┐
35- │ Data Layer │
36- │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
37- │ │ Repositories│ │ DataSources │ │ Models │ │
38- │ └─────────────┘ └─────────────┘ └─────────────┘ │
39- └─────────────────────────────────────────────────────────────┘
40- ```
16+ ![ Kotlin] ( https://img.shields.io/badge/Kotlin-100%25-purple?style=for-the-badge&logo=kotlin )
17+ ![ Android] ( https://img.shields.io/badge/Android-API%2026+-green?style=for-the-badge&logo=android )
18+ ![ Jetpack Compose] ( https://img.shields.io/badge/UI-Jetpack%20Compose-blue?style=for-the-badge )
19+ ![ Clean Architecture] ( https://img.shields.io/badge/Architecture-Clean%20Architecture-orange?style=for-the-badge )
20+
21+ </div >
22+
23+ ### 📱 Android & Kotlin
24+
25+ | 항목 | 내용 | 버전 |
26+ | ------| ------| ------|
27+ | ** 언어** | Kotlin | 100% |
28+ | ** 최소 SDK** | Android 8.0 | API 26 |
29+ | ** 타겟 SDK** | Android 15 | API 35 |
30+ | ** UI 프레임워크** | Jetpack Compose | 최신 |
31+
32+ ### 🏗️ 아키텍처 & 패턴
33+
34+ | 패턴 | 설명 | 적용 범위 |
35+ | ------| ------| -----------|
36+ | ** Clean Architecture** | 계층별 관심사 분리 | 전체 프로젝트 |
37+ | ** MVVM** | Model-View-ViewModel 패턴 | UI 계층 |
38+ | ** Repository Pattern** | 데이터 접근 추상화 | 데이터 계층 |
39+ | ** UseCase Pattern** | 비즈니스 로직 캡슐화 | 도메인 계층 |
4140
42- ### 아키텍처 특징
43- - ** Clean Architecture** : 관심사 분리와 의존성 역전 원칙 적용
44- - ** MVVM** : ViewModel과 StateFlow를 통한 반응형 UI
45- - ** Repository Pattern** : 데이터 접근 추상화
46- - ** UseCase Pattern** : 비즈니스 로직 캡슐화
47- - ** Dependency Injection** : Hilt를 통한 의존성 관리
41+ ### 🔧 주요 라이브러리
42+
43+ <div align =" center " >
44+
45+ ![ Hilt] ( https://img.shields.io/badge/DI-Hilt-red?style=flat-square&logo=android )
46+ ![ Coroutines] ( https://img.shields.io/badge/Async-Coroutines%20%2B%20Flow-green?style=flat-square&logo=kotlin )
47+ ![ Navigation] ( https://img.shields.io/badge/Navigation-Jetpack%20Navigation-blue?style=flat-square&logo=android )
48+ ![ StateFlow] ( https://img.shields.io/badge/State-StateFlow-orange?style=flat-square&logo=kotlin )
49+ ![ DataStore] ( https://img.shields.io/badge/Storage-DataStore%20%2B%20Room-purple?style=flat-square&logo=android )
50+ ![ Retrofit] ( https://img.shields.io/badge/Network-Retrofit%20%2B%20OkHttp-blue?style=flat-square&logo=square )
51+ ![ Coil] ( https://img.shields.io/badge/Image-Coil-green?style=flat-square&logo=android )
52+
53+ </div >
54+
55+ | 카테고리 | 라이브러리 | 용도 |
56+ | ----------| ------------| ------|
57+ | ** 의존성 주입** | Hilt | DI 컨테이너 |
58+ | ** 비동기 처리** | Kotlin Coroutines + Flow | 비동기 작업 |
59+ | ** 네비게이션** | Jetpack Navigation Compose | 화면 전환 |
60+ | ** 상태 관리** | StateFlow, MutableStateFlow | UI 상태 |
61+ | ** 데이터 저장** | Proto DataStore, Room | 로컬 데이터 |
62+ | ** 네트워크** | Retrofit, OkHttp | API 통신 |
63+ | ** 이미지 처리** | Coil | 이미지 로딩 |
64+ | ** 권한 관리** | Accompanist Permissions | 권한 처리 |
65+
66+ ### 📊 외부 서비스
67+
68+ <div align =" center " >
69+
70+ ![ Firebase] ( https://img.shields.io/badge/Analytics-Firebase%20Analytics-orange?style=flat-square&logo=firebase )
71+ ![ Crashlytics] ( https://img.shields.io/badge/Crash%20Reporting-Firebase%20Crashlytics-red?style=flat-square&logo=firebase )
72+ ![ Google Maps] ( https://img.shields.io/badge/Maps-Google%20Maps%20API-blue?style=flat-square&logo=google-maps )
73+ ![ Kakao] ( https://img.shields.io/badge/Login-Kakao%20SDK-yellow?style=flat-square&logo=kakao )
74+
75+ </div >
76+
77+ | 서비스 | 용도 | 통합 방식 |
78+ | --------| ------| -----------|
79+ | ** Firebase Analytics** | 사용자 행동 분석 | SDK 통합 |
80+ | ** Firebase Crashlytics** | 크래시 리포팅 | SDK 통합 |
81+ | ** Google Maps API** | 지도 및 위치 서비스 | API 키 |
82+ | ** Kakao SDK** | 소셜 로그인 | SDK 통합 |
4883
4984## 📁 프로젝트 모듈 트리
5085
@@ -82,115 +117,6 @@ RunCombi_Android/
82117 └── walk/ # 운동 추적
83118```
84119
85- ## 🔧 프로젝트 모듈별 설명
86-
87- ### 📱 App Module
88- - ** 역할** : 메인 애플리케이션 진입점
89- - ** 주요 구성** : Application 클래스, AndroidManifest
90- - ** 특징** : 모든 모듈을 통합하고 의존성 주입 설정
91-
92- ### 🏗️ Build-Logic Module
93- - ** 역할** : 커스텀 Gradle 플러그인 및 빌드 로직
94- - ** 주요 구성** :
95- - ` runcombi.android.application.gradle.kts `
96- - ` runcombi.android.compose.gradle.kts `
97- - ` runcombi.android.feature.gradle.kts `
98- - ` runcombi.android.library.gradle.kts `
99-
100- ### 🎯 Core Module
101- #### Analytics
102- - ** 역할** : 사용자 행동 분석 및 이벤트 추적
103- - ** 기술** : Firebase Analytics, 커스텀 이벤트 로깅
104-
105- #### Data Layer
106- - ** 역할** : 데이터 접근 및 관리
107- - ** 구성** :
108- - ** Auth** : 사용자 인증 및 권한 관리
109- - ** Common** : 공통 데이터 모델 및 유틸리티
110- - ** History** : 운동 기록 데이터 관리
111- - ** Setting** : 사용자 설정 데이터
112- - ** User** : 사용자 프로필 및 정보
113- - ** Walk** : 운동 추적 데이터
114- - ** Datastore** : 로컬 데이터 저장 (Proto DataStore)
115- - ** Network** : API 통신 및 네트워크 처리
116-
117- #### Domain Layer
118- - ** 역할** : 비즈니스 로직 및 엔티티 정의
119- - ** 구성** : 각 데이터 모듈에 대응하는 도메인 모듈
120- - ** 특징** : UseCase 패턴으로 비즈니스 로직 캡슐화
121-
122- #### Design System
123- - ** 역할** : 일관된 UI/UX 컴포넌트 제공
124- - ** 구성** : 테마, 색상, 타이포그래피, 공통 컴포넌트
125-
126- #### Navigation
127- - ** 역할** : 화면 간 네비게이션 관리
128- - ** 기술** : Jetpack Navigation Compose
129-
130- #### UI
131- - ** 역할** : 공통 UI 컴포넌트 및 유틸리티
132- - ** 구성** : 재사용 가능한 Compose 컴포넌트
133-
134- ### ⚡ Feature Modules
135- #### History
136- - ** 역할** : 운동 기록 조회 및 통계
137- - ** 기능** : 운동 히스토리, 통계 차트, 필터링
138-
139- #### Login
140- - ** 역할** : 사용자 인증 및 로그인
141- - ** 기능** : 카카오 로그인, 자동 로그인
142-
143- #### Main
144- - ** 역할** : 메인 화면 및 네비게이션
145- - ** 기능** : 하단 네비게이션, 홈 화면
146-
147- #### Setting
148- - ** 역할** : 사용자 설정 및 프로필 관리
149- - ** 기능** : 개인정보 수정, 알림 설정
150-
151- #### Signup
152- - ** 역할** : 회원가입 및 초기 설정
153- - ** 기능** : 사용자 정보 입력, 반려동물 등록
154-
155- #### Walk
156- - ** 역할** : 운동 추적 및 기록
157- - ** 기능** : GPS 추적, 실시간 기록, ForegroundService 연동
158-
159- ## 🛠️ 프로젝트 기술 스택
160-
161- ### 📱 Android & Kotlin
162- - ** 언어** : Kotlin 100%
163- - ** 최소 SDK** : API 26 (Android 8.0)
164- - ** 타겟 SDK** : API 35 (Android 15)
165- - ** Jetpack Compose** : UI 프레임워크
166-
167- ### 🏗️ 아키텍처 & 패턴
168- - ** Clean Architecture** : 계층별 관심사 분리
169- - ** MVVM** : Model-View-ViewModel 패턴
170- - ** Repository Pattern** : 데이터 접근 추상화
171- - ** UseCase Pattern** : 비즈니스 로직 캡슐화
172-
173- ### 🔧 주요 라이브러리
174- - ** 의존성 주입** : Hilt
175- - ** 비동기 처리** : Kotlin Coroutines + Flow
176- - ** 네비게이션** : Jetpack Navigation Compose
177- - ** 상태 관리** : StateFlow, MutableStateFlow
178- - ** 데이터 저장** : Proto DataStore, Room
179- - ** 네트워크** : Retrofit, OkHttp
180- - ** 이미지 처리** : Coil
181- - ** 권한 관리** : Accompanist Permissions
182-
183- ### 📊 외부 서비스
184- - ** 분석** : Firebase Analytics
185- - ** 크래시 리포팅** : Firebase Crashlytics
186- - ** 지도** : Google Maps API
187- - ** 소셜 로그인** : Kakao SDK
188-
189- ### 🚀 빌드 도구
190- - ** 빌드 시스템** : Gradle (Kotlin DSL)
191- - ** 모듈화** : Feature-based 모듈 구조
192- - ** 커스텀 플러그인** : 자체 Gradle 플러그인
193-
194120## 🏭 Flavor 시스템
195121
196122### Product Flavors
250176### 📱 Slack 빌드 알림 예시
251177![ RunCombi Android 빌드 성공 알림] ( ./docs/images/slack_notification.png )
252178
253- ### 🔄 QA 중심 CI/CD 파이프라인 흐름
254179
255180```
2561811. 개발자 코드 Push/PR 생성
@@ -268,13 +193,7 @@ app/
268193 ├── Firebase 콘솔에서 APK 다운로드
269194 ├── 테스트 환경에서 기능 검증
270195 └── 피드백 수집 및 이슈 등록
271- ↓
272- 6. QA 피드백 반영 및 재배포
273- ├── 이슈 수정 및 코드 개선
274- ├── 재빌드 및 재배포
275- └── 최종 QA 승인
276- ↓
277- 7. 스토어 배포 준비 완료
196+
278197```
279198
280199## 🎨 뷰모델 및 UI 로직 패턴
286205@HiltViewModel
287206class ExampleViewModel @Inject constructor(
288207 private val useCase : ExampleUseCase ,
289- private val repository : ExampleRepository
290208) : ViewModel() {
291209
292210 private val _uiState = MutableStateFlow (ExampleUiState ())
@@ -375,30 +293,3 @@ fun ExampleScreen(
375293}
376294```
377295
378- #### 컴포넌트 구조
379- ``` kotlin
380- @Composable
381- fun ExampleContent (
382- uiState : ExampleUiState ,
383- onAction : (ExampleAction ) -> Unit
384- ) {
385- Column (
386- modifier = Modifier .fillMaxSize(),
387- horizontalAlignment = Alignment .CenterHorizontally
388- ) {
389- when {
390- uiState.isLoading -> LoadingIndicator ()
391- uiState.error != null -> ErrorContent (
392- error = uiState.error!! ,
393- onRetry = { onAction(ExampleAction .Load ) }
394- )
395- else -> DataContent (
396- data = uiState.data,
397- onItemClick = { item ->
398- onAction(ExampleAction .SelectItem (item))
399- }
400- )
401- }
402- }
403- }
404- ```
0 commit comments