Skip to content

모듈 구성

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.applicationApplicationConventionPluginAndroid Application 모듈 기본 설정 (compileSdk, minSdk, targetSdk, 버전 관리)
truloop.application.composeApplicationComposeConventionPluginApplication + Compose 빌드 설정
truloop.android.libraryAndroidLibraryConventionPluginAndroid Library 모듈 기본 설정
truloop.android.library.composeAndroidLibraryComposeConventionPluginLibrary + Compose 빌드 설정
truloop.featureFeatureConventionPluginFeature 모듈 표준 설정 (Library + Compose + Hilt + 공통 의존성)
truloop.hiltHiltConventionPluginHilt DI 설정 (KSP + dagger.hilt.android.plugin)
truloop.roomRoomConventionPluginRoom DB 설정
truloop.flavorsFlavorsConventionPluginBuild Flavor 설정 (dev, prod)
truloop.jvm.libraryJvmLibraryConventionPluginJVM 전용 라이브러리 설정

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:dataRepository 구현, DataSource, API 인터페이스, DTO
core:networkOkHttp/Retrofit 설정, Interceptor, Authenticator, 에러 처리
core:databaseRoom 데이터베이스, Entity, DAO
core:datastoreDataStore (Preferences, Proto) 기반 로컬 저장소
core:preferencesSharedPreferences 래퍼 (토큰, 설정값)
core:designsystem공통 디자인 컴포넌트, 테마, 컬러, 타이포그래피
core:ui공통 UI 컴포넌트 (Dialog, BottomSheet, 등)
core:composeCompose 유틸리티, 확장 함수
core:navigationNavKey 정의, Navigation 유틸리티
core:ktxKotlin 확장 함수, 유틸리티 (에러 처리, Serialization 등)
core:coroutineCoroutine Dispatcher, Scope 유틸리티
core:resources공유 리소스 (문자열, 이미지, BuildConfig)
core:locale다국어 처리
core:analyticsSegment/Firebase Analytics 추상화
core:fcmFirebase Cloud Messaging 처리
core:deeplink딥링크 파싱 및 라우팅
core:media미디어 처리 (이미지/비디오)
core:media-picker미디어 선택 UI
core:uploader파일 업로드 매니저
core:purchasesRevenueCat 인앱 결제 추상화
core:chats:dataSendbird 채팅 데이터 레이어
core:chats:ui채팅 UI 컴포넌트
core:places:dataGoogle Places 데이터 레이어
core:places:components장소 검색 UI 컴포넌트
core:phone-number전화번호 유효성 검증 (libphonenumber)
core:kakaoKakao 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-messagesDM (채팅 목록)
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:secretaryAI 비서
feature:language언어 설정
feature:purchases인앱 결제
feature:mission미션
feature:notification알림
feature:friend-add친구 추가
feature:friend-block차단 관리
feature:group-member-selection그룹 멤버 선택

Domain 모듈 (7개)

모듈플러그인역할
domain:loopandroid.library + hilt룹 관련 UseCase (fun interface), Model, API 인터페이스 (Queries/Commands)
domain:loop-mediaandroid.library + hilt룹 미디어 관련 UseCase 및 도메인 로직
domain:recapandroid.library + hilt리캡 관련 UseCase 및 API (core/detail/comments/reaction)
domain:calendarandroid.library캘린더 이벤트 관련 UseCase
domain:placejvm.library장소 관련 도메인 로직 (순수 JVM 모듈)
domain:chatandroid.library + hilt채팅 관련 API 인터페이스
domain:userandroid.library + hilt사용자 관련 UseCase, Model, API (auth/token/profile/block)

정보

Domain 모듈은 fun interface UseCase 패턴과 @Qualifier 기반 DI를 통해 비즈니스 로직을 캡슐화합니다. 대부분 truloop.android.library 플러그인을 사용하는 Android Library 모듈이며, domain:placetruloop.jvm.library 기반의 순수 JVM 모듈입니다.

App 모듈

최상위 Application 모듈로, 모든 Feature와 Core 모듈을 조합합니다.

적용 플러그인:

  • truloop.application
  • truloop.application.compose
  • truloop.flavors
  • truloop.hilt
  • com.google.gms.google-services
  • com.google.android.gms.oss-licenses-plugin
  • firebase.crashlytics
  • google.mapsplatform

주요 구성요소:

파일역할
TruloopApplication.ktApplication 클래스, @HiltAndroidApp, 초기화 로직
MainActivity.kt단일 Activity, Compose Host
MainViewModel.kt앱 레벨 상태 관리 (로그인 상태, 딥링크)
MainEnv.kt앱 레벨 Env (UseCase 의존성 캡슐화)
MainUiState.kt / MainUiEvent.kt / MainSideEffect.kt앱 레벨 MVI 패턴
TruloopFirebaseMessagingService.ktFCM 메시지 수신 서비스
navigation/AppNavGraph.kt전체 네비게이션 그래프 구성
di/InitializerModule.kt초기화 모듈 DI 등록
initializer/*.ktSDK 초기화 (Debugger, DeepLink, SendBird, Purchase, FCM, Analytics, Kakao, ImageLoader)

변경 이력

날짜내용
2026-03-10Core 모듈 수 26 → 28로 교정. Domain 모듈 테이블에 플러그인 유형 컬럼 추가 및 순수 Kotlin 설명 수정. App 모듈에 MainEnv.kt, TruloopFirebaseMessagingService.kt 추가, oss-licenses-plugin 누락 보완. initializer 목록 실제 코드 기준으로 수정. FeatureConventionPlugin 예제에 serialization/testOptions 코드 반영