다크 모드
모듈 구성
Convention Plugin 기반 멀티 모듈 구조
truloop Android는 build-logic 디렉토리에 정의된 Convention Plugin을 통해 모듈 설정을 표준화합니다. settings.gradle.kts에서 includeBuild("build-logic")으로 포함됩니다.
모듈 의존성 다이어그램
Convention Plugins
build-logic/convention/src/main/kotlin/ 디렉토리에 정의된 플러그인 목록:
| Plugin ID | 클래스 | 역할 |
|---|---|---|
truloop.application | ApplicationConventionPlugin | Android Application 모듈 기본 설정 (compileSdk, minSdk, targetSdk, 버전 관리) |
truloop.application.compose | ApplicationComposeConventionPlugin | Application + Compose 빌드 설정 |
truloop.android.library | AndroidLibraryConventionPlugin | Android Library 모듈 기본 설정 |
truloop.android.library.compose | AndroidLibraryComposeConventionPlugin | Library + Compose 빌드 설정 |
truloop.feature | FeatureConventionPlugin | Feature 모듈 표준 설정 (Library + Compose + Hilt + 공통 의존성) |
truloop.hilt | HiltConventionPlugin | Hilt DI 설정 (KSP + dagger.hilt.android.plugin) |
truloop.room | RoomConventionPlugin | Room DB 설정 |
truloop.flavors | FlavorsConventionPlugin | Build Flavor 설정 (dev, prod) |
truloop.jvm.library | JvmLibraryConventionPlugin | JVM 전용 라이브러리 설정 |
Feature Convention Plugin 상세
truloop.feature 플러그인은 모든 Feature 모듈에 자동으로 다음을 적용합니다:
kotlin
class FeatureConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
pluginManager.apply {
apply("truloop.android.library")
apply("truloop.android.library.compose")
apply("truloop.hilt")
}
// Kotlin Serialization 플러그인 적용 시 자동으로 의존성 추가
pluginManager.withPlugin("org.jetbrains.kotlin.plugin.serialization") {
dependencies {
add("implementation", libs.findLibrary("kotlinx.serialization.json").get())
}
}
extensions.configure<LibraryExtension> {
testOptions.animationsDisabled = true
}
dependencies {
add("implementation", project(":core:ktx"))
add("implementation", project(":core:compose"))
add("implementation", project(":core:designsystem"))
add("implementation", project(":core:ui"))
add("implementation", project(":core:resources"))
add("implementation", project(":core:navigation"))
add("implementation", project(":core:coroutine"))
add("implementation", project(":core:data"))
add("implementation", project(":core:analytics"))
add("implementation", libs.findLibrary("androidx.material.icons.extended").get())
add("implementation", libs.findBundle("coil").get())
add("debugImplementation", libs.findBundle("test").get())
}
}
}
}정보
Feature 모듈은 truloop.feature 플러그인만 적용하면 Compose, Hilt, 공통 core 모듈 의존성이 자동으로 포함됩니다. 추가 의존성만 해당 모듈의 build.gradle.kts에서 선언하면 됩니다.
Core 모듈 (28개)
| 모듈 | 역할 |
|---|---|
| core:data | Repository 구현, DataSource, API 인터페이스, DTO |
| core:network | OkHttp/Retrofit 설정, Interceptor, Authenticator, 에러 처리 |
| core:database | Room 데이터베이스, Entity, DAO |
| core:datastore | DataStore (Preferences, Proto) 기반 로컬 저장소 |
| core:preferences | SharedPreferences 래퍼 (토큰, 설정값) |
| core:designsystem | 공통 디자인 컴포넌트, 테마, 컬러, 타이포그래피 |
| core:ui | 공통 UI 컴포넌트 (Dialog, BottomSheet, 등) |
| core:compose | Compose 유틸리티, 확장 함수 |
| core:navigation | NavKey 정의, Navigation 유틸리티 |
| core:ktx | Kotlin 확장 함수, 유틸리티 (에러 처리, Serialization 등) |
| core:coroutine | Coroutine Dispatcher, Scope 유틸리티 |
| core:resources | 공유 리소스 (문자열, 이미지, BuildConfig) |
| core:locale | 다국어 처리 |
| core:analytics | Segment/Firebase Analytics 추상화 |
| core:fcm | Firebase Cloud Messaging 처리 |
| core:deeplink | 딥링크 파싱 및 라우팅 |
| core:media | 미디어 처리 (이미지/비디오) |
| core:media-picker | 미디어 선택 UI |
| core:uploader | 파일 업로드 매니저 |
| core:purchases | RevenueCat 인앱 결제 추상화 |
| core:chats:data | Sendbird 채팅 데이터 레이어 |
| core:chats:ui | 채팅 UI 컴포넌트 |
| core:places:data | Google Places 데이터 레이어 |
| core:places:components | 장소 검색 UI 컴포넌트 |
| core:phone-number | 전화번호 유효성 검증 (libphonenumber) |
| core:kakao | Kakao SDK 통합 |
| core:user-picker | 사용자 선택 UI 컴포넌트 |
| core:update | 인앱 업데이트 (Play Core) |
Feature 모듈 (29개)
| 모듈 | 역할 |
|---|---|
| feature:onboarding-intro | 온보딩 인트로 화면 |
| feature:onboarding | 온보딩 흐름 (전화번호, 프로필 등) |
| feature:onboarding-contact | 연락처 동기화 온보딩 |
| feature:onboarding-profile-image-upload | 프로필 이미지 업로드 온보딩 |
| feature:home | 메인 홈 (Bottom Navigation) |
| feature:home-feed | 홈 피드 |
| feature:home-shared | 홈 관련 공유 로직 |
| feature:direct-messages | DM (채팅 목록) |
| feature:message-detail | 채팅 상세 |
| feature:my-page | 마이페이지 |
| feature:profile | 프로필 조회 |
| feature:profile-edit | 프로필 편집 |
| feature:account | 계정 설정 |
| feature:loop | 룹 상세 |
| feature:loop-search | 룹 검색/생성 |
| feature:loop-list | 룹 목록 |
| feature:make | 룹 앨범 생성 |
| feature:gallery | 갤러리 뷰어 |
| feature:crop | 이미지 크롭 |
| feature:comment | 댓글 |
| feature:highlight | 하이라이트/릴스 |
| feature:secretary | AI 비서 |
| feature:language | 언어 설정 |
| feature:purchases | 인앱 결제 |
| feature:mission | 미션 |
| feature:notification | 알림 |
| feature:friend-add | 친구 추가 |
| feature:friend-block | 차단 관리 |
| feature:group-member-selection | 그룹 멤버 선택 |
Domain 모듈 (7개)
| 모듈 | 플러그인 | 역할 |
|---|---|---|
| domain:loop | android.library + hilt | 룹 관련 UseCase (fun interface), Model, API 인터페이스 (Queries/Commands) |
| domain:loop-media | android.library + hilt | 룹 미디어 관련 UseCase 및 도메인 로직 |
| domain:recap | android.library + hilt | 리캡 관련 UseCase 및 API (core/detail/comments/reaction) |
| domain:calendar | android.library | 캘린더 이벤트 관련 UseCase |
| domain:place | jvm.library | 장소 관련 도메인 로직 (순수 JVM 모듈) |
| domain:chat | android.library + hilt | 채팅 관련 API 인터페이스 |
| domain:user | android.library + hilt | 사용자 관련 UseCase, Model, API (auth/token/profile/block) |
정보
Domain 모듈은 fun interface UseCase 패턴과 @Qualifier 기반 DI를 통해 비즈니스 로직을 캡슐화합니다. 대부분 truloop.android.library 플러그인을 사용하는 Android Library 모듈이며, domain:place만 truloop.jvm.library 기반의 순수 JVM 모듈입니다.
App 모듈
최상위 Application 모듈로, 모든 Feature와 Core 모듈을 조합합니다.
적용 플러그인:
truloop.applicationtruloop.application.composetruloop.flavorstruloop.hiltcom.google.gms.google-servicescom.google.android.gms.oss-licenses-pluginfirebase.crashlyticsgoogle.mapsplatform
주요 구성요소:
| 파일 | 역할 |
|---|---|
TruloopApplication.kt | Application 클래스, @HiltAndroidApp, 초기화 로직 |
MainActivity.kt | 단일 Activity, Compose Host |
MainViewModel.kt | 앱 레벨 상태 관리 (로그인 상태, 딥링크) |
MainEnv.kt | 앱 레벨 Env (UseCase 의존성 캡슐화) |
MainUiState.kt / MainUiEvent.kt / MainSideEffect.kt | 앱 레벨 MVI 패턴 |
TruloopFirebaseMessagingService.kt | FCM 메시지 수신 서비스 |
navigation/AppNavGraph.kt | 전체 네비게이션 그래프 구성 |
di/InitializerModule.kt | 초기화 모듈 DI 등록 |
initializer/*.kt | SDK 초기화 (Debugger, DeepLink, SendBird, Purchase, FCM, Analytics, Kakao, ImageLoader) |
변경 이력
| 날짜 | 내용 |
|---|---|
| 2026-03-10 | Core 모듈 수 26 → 28로 교정. Domain 모듈 테이블에 플러그인 유형 컬럼 추가 및 순수 Kotlin 설명 수정. App 모듈에 MainEnv.kt, TruloopFirebaseMessagingService.kt 추가, oss-licenses-plugin 누락 보완. initializer 목록 실제 코드 기준으로 수정. FeatureConventionPlugin 예제에 serialization/testOptions 코드 반영 |