Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/studiobot.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

148 changes: 102 additions & 46 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,64 +73,120 @@

- IDE : Android Studio Koala
- JDK : Java 18 JDK
- Kotlin Language : 2.0.0
- AGP : 8.2.1
- Kotlin Language : 1.9.22
- AGP : 8.2.2

### Language

- Kotlin

### Architecture

- Multi-Module Architecture
- MVI (Model-View-Intent) Pattern
- Repository Pattern
- Clean Architecture
- Single Activity Architecture

### Libraries

- AndroidX
- Activity & Fragment(Single Activity Architecture)
- Core
- Activity & Jetpack Compose
- Core KTX
- Lifecycle & ViewModel
- Navigation
- Splash
- Material3
- Room
- Navigation Compose (Type-Safe Navigation)
- Splash Screen
- Material3 Compose
- DataStore

- Dependency Injection
- [Hilt](https://dagger.dev/hilt/)

- Network
- [Retrofit](https://square.github.io/retrofit/)
- [OkHttp](https://square.github.io/okhttp/)
- [Kotlin Serialization](https://github.com/Kotlin/kotlinx.serialization)

- Kotlin Libraries
- Coroutines
- Serialization
- Immutable Collections

- Other
- [Kakao Open API](https://developers.kakao.com/docs/latest/ko/android/getting-started)
- [Dotsindicator](https://github.com/tommybuonomo/dotsindicator)
- [Timber](https://github.com/JakeWharton/timber)
- [Firebase](https://github.com/firebase/firebase-android-sdk)
- [Coil](https://coil-kt.github.io/coil/) (Image Loading)

- Kotlin Libraries (Coroutine, Serialization, Immutable Collection)
<br>

- Retrofit, OkHttp
- [Kakao Open API](https://developers.kakao.com/docs/latest/ko/android/getting-started)
- [Dotsindicator](https://github.com/tommybuonomo/dotsindicator)
- [Timber](https://github.com/JakeWharton/timber)
- [Firebase](https://github.com/firebase/firebase-android-sdk)
## ARCHITECTURE

<br>
### Multi-Module Structure

투유는 확장성과 유지보수성을 위해 멀티모듈 아키텍처를 채택했습니다.

#### Module Dependency Graph

![Project Dependency Graph](docs/project-dependency-graph.png)

#### Module Overview

**:app**
- 앱의 진입점 및 전체 네비게이션 관리
- 각 feature 모듈 통합

**:feature modules**
- `:feature:home` - 홈 화면 및 감정우표 선택
- `:feature:create` - 일기카드 생성
- `:feature:social` - 친구 목록 및 질문하기
- `:feature:record` - 일기카드 기록 확인
- `:feature:mypage` - 마이페이지 및 프로필 관리
- `:feature:notice` - 알림 관리
- `:feature:onboarding` - 로그인 및 회원가입

## PACKAGE STRUCTURE
**:core modules**
- `:core:data` - Repository 구현 및 데이터 소스 통합
- `:core:domain` - 비즈니스 로직 및 모델 정의
- `:core:network` - API 서비스 및 네트워크 설정
- `:core:datastore` - 로컬 데이터 저장 (Token, Preferences)
- `:core:designsystem` - 공통 UI 컴포넌트 및 테마
- `:core:common` - 공통 유틸리티

### Layer Architecture

```
┌─────────────────────────────────────┐
│ Presentation Layer │
│ (Jetpack Compose, ViewModel) │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ Domain Layer │
│ (Models, Repository Interface) │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ Data Layer │
│ (Repository Impl, DataSource) │
└─────────────────────────────────────┘
```
🗃️app
┣ 📂data
┃ ┣ 📂create
┃ ┣ 📂emotion
┃ ┣ 📂home
┃ ┣ 📂mypage
┃ ┣ 📂notice
┃ ┣ 📂onboarding
┃ ┣ 📂record
┃ ┗ 📂social
┣ 📂domain
┃ ┣ 📂create
┃ ┣ 📂home
┃ ┣ 📂notice
┃ ┣ 📂record
┃ ┗ 📂social
┣ 📂fcm
┃ ┣ 📂domain
┃ ┣ 📂dto
┃ ┗ 📂service
┣ 📂model
┃ ┣ 📂calendar
┃ ┣ 📂local
┃ ┗ 📂remote
┣ 📂network
┣ 📂presentation
┃ ┣ 📂base
┃ ┣ 📂fragment
┃ ┗ 📂viewmodel
┣ 📂utils

### 의존성 그래프 생성

프로젝트 의존성 그래프를 생성하려면 Graphviz가 필요합니다:

```bash
# Graphviz 설치 (macOS)
brew install graphviz

# 의존성 그래프 생성
./gradlew generateProjectDependencyGraph

# 생성된 파일 위치
# build/reports/project-dependency-graph/project-dependency-graph.png
# build/reports/project-dependency-graph/project-dependency-graph.svg
```

<br>
105 changes: 68 additions & 37 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("kotlin-kapt")
id ("dagger.hilt.android.plugin")
id ("org.jetbrains.kotlin.kapt")
id("dagger.hilt.android.plugin")
id("org.jetbrains.kotlin.kapt")
id("org.jetbrains.kotlin.plugin.serialization")
id("com.google.gms.google-services")
alias(libs.plugins.baselineprofile)
}

val localProperties = Properties()
Expand All @@ -27,12 +29,12 @@ android {
}
}
namespace = "com.toyou.toyouandroid"
compileSdk = 35
compileSdk = libs.versions.compileSdk.get().toInt()

defaultConfig {
applicationId = "com.toyou.toyouandroid"
minSdk = 28
targetSdk = 35
minSdk = libs.versions.minSdk.get().toInt()
targetSdk = libs.versions.targetSdk.get().toInt()
versionCode = 12
versionName = "2.1.0"

Expand Down Expand Up @@ -74,9 +76,11 @@ android {
jvmTarget = "1.8"
}
buildFeatures {
viewBinding = true
dataBinding = true
buildConfig = true
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = libs.versions.composeCompiler.get()
}
}

Expand All @@ -89,54 +93,81 @@ dependencies {
implementation(project(":core:data"))
implementation(project(":core:designsystem"))

// Feature Modules
implementation(project(":feature:home"))
implementation(project(":feature:create"))
implementation(project(":feature:social"))
implementation(project(":feature:record"))
implementation(project(":feature:notice"))
implementation(project(":feature:onboarding"))
implementation(project(":feature:mypage"))

// AndroidX Core
implementation("androidx.core:core-ktx:1.13.1")
implementation("androidx.appcompat:appcompat:1.7.0")
implementation("com.google.android.material:material:1.12.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.recyclerview:recyclerview:1.3.2")
implementation("androidx.core:core-splashscreen:1.0.1")
implementation("androidx.security:security-crypto-ktx:1.1.0-alpha06")
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.recyclerview)
implementation(libs.androidx.splashscreen)
implementation(libs.androidx.security.crypto)

// Lifecycle
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.3")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.3")
implementation(libs.androidx.lifecycle.livedata)
implementation(libs.androidx.lifecycle.viewmodel)

// Navigation
implementation("androidx.navigation:navigation-fragment-ktx:2.7.7")
implementation("androidx.navigation:navigation-ui-ktx:2.7.7")
implementation(libs.androidx.navigation.fragment)
implementation(libs.androidx.navigation.ui)

// Network
implementation("com.google.code.gson:gson:2.10.1")
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("com.squareup.okhttp3:okhttp:4.10.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.10.0")
implementation(libs.bundles.network)

// Hilt
implementation("com.google.dagger:hilt-android:2.50")
kapt("com.google.dagger:hilt-compiler:2.50")
implementation(libs.hilt.android)
kapt(libs.hilt.compiler)

// Room
implementation("androidx.room:room-runtime:2.6.1")
implementation("androidx.room:room-ktx:2.6.1")
kapt("androidx.room:room-compiler:2.6.1")
implementation(libs.bundles.room)
kapt(libs.androidx.room.compiler)

// Firebase
implementation(platform("com.google.firebase:firebase-bom:33.3.0"))
implementation("com.google.firebase:firebase-analytics")
implementation("com.google.firebase:firebase-messaging-ktx")
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.analytics)
implementation(libs.firebase.messaging)

// Kakao
implementation("com.kakao.sdk:v2-all:2.20.3")
implementation(libs.kakao.sdk.all)

// Others
implementation("com.jakewharton.timber:timber:4.7.1")
implementation("com.tbuonomo:dotsindicator:5.0")
implementation(libs.timber)
implementation(libs.dotsIndicator)

// Compose
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.compose.ui.graphics)
implementation(libs.androidx.compose.ui.tooling.preview)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.foundation)
implementation(libs.androidx.compose.material.icons.extended)
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.lifecycle.compose)
implementation(libs.hilt.navigation.compose)
debugImplementation(libs.androidx.compose.ui.tooling)

// Navigation Compose
implementation(libs.androidx.navigation.compose)

// Kotlin Serialization
implementation(libs.kotlinx.serialization.json)

// Test
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso)

// Baseline Profile
implementation(libs.androidx.profileinstaller)
baselineProfile(project(":baselineprofile"))
}
apply(plugin = "com.google.gms.google-services")
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
android:supportsRtl="true"
android:theme="@style/Theme.App.Starting">
<activity
android:name=".presentation.base.MainActivity"
android:name=".ui.base.MainActivity"
android:windowSoftInputMode="adjustNothing"
android:exported="true">
<intent-filter>
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Loading
Loading