Skip to content

[Feature/#1] 프로젝트 멀티모듈 환경 구축#2

Merged
wjdrjs00 merged 15 commits intodevelopfrom
feature/#1-multi-module-setup
Jun 14, 2025
Merged

[Feature/#1] 프로젝트 멀티모듈 환경 구축#2
wjdrjs00 merged 15 commits intodevelopfrom
feature/#1-multi-module-setup

Conversation

@wjdrjs00
Copy link
Copy Markdown
Member

@wjdrjs00 wjdrjs00 commented Jun 13, 2025

[ PR Content ]

Related issue

Screenshot 📸

-N/A

Work Description

  • 프로젝트 멀티모듈 구축
  • 빌드 로직 구현

To Reviewers 📢

  • 저희 얘기했던 내용 기반으로 멀티모듈 환경 구축했슴다~!!
  • 추후 기능이 픽스 되면 확장해서 구현해보고자 우선 대략적으로만 모듈과 빌드로직을 구현했는데, 혹시라도 빠진 부분이나 지금 구축해두면 좋을거 같은 부분이 있다면 말씀해주시면 바로 출동하겠습니다! 🫡

Summary by CodeRabbit

  • 새로운 기능

    • Jetpack Compose 기반의 로그인 및 홈 화면이 추가되었습니다.
    • 메인 내비게이션 및 화면 전환 기능이 도입되었습니다.
    • 앱 이름이 "Bitnagil"에서 "빛나길"로 변경되었습니다.
    • 앱에 인터넷 권한이 추가되었습니다.
    • Hilt를 활용한 의존성 주입이 적용된 커스텀 Application 클래스가 도입되었습니다.
  • 개선 및 변경

    • 앱 구조가 다중 모듈 방식으로 개편되어 데이터, 도메인, 네트워크, 디자인 시스템, 프레젠테이션 등 핵심 모듈이 분리되었습니다.
    • 디자인 시스템 관련 코드가 별도 모듈로 이동되었습니다.
    • 메인 액티비티 UI가 간소화되고 Hilt와 Compose 테마 연동이 개선되었습니다.
  • 버그 수정

    • 불필요한 예제 단위 및 기기 테스트 코드가 제거되었습니다.
  • 빌드/설정

    • 프로젝트 전반에 걸쳐 Gradle 설정 및 플러그인 구성이 표준화되고 최적화되었습니다.
    • 커스텀 Gradle 플러그인 및 버전 카탈로그가 도입되어 빌드 관리가 통합되었습니다.
    • 각 모듈별 빌드 스크립트와 ProGuard 설정 파일이 추가되었습니다.
    • 빌드 로직 최적화를 위한 병렬 실행, 캐싱, 필요시 구성 활성화 설정이 적용되었습니다.

wjdrjs00 added 12 commits June 12, 2025 00:37
- datastore 모듈 생성
- designsystem 모듈 생성
- network 모듈 생성
- Android Application, Library, Compose, Hilt, Kotlin JVM Convention 플러그인 추가
- 각 플러그인에 대한 기본 설정 및 의존성 추가
- build-logic 모듈에 Convention 플러그인 등록
- 버전 카탈로그에 Convention 플러그인 등록
- 기존 빌드 스크립트 파일에서 중복된 설정 conventions 플러그인으로 분리
- 각 모듈에 필요한 의존성 정의 및 불필요한 의존성 제거
- 테스트 관련 기본 파일 삭제
- 기본 화면(로그인, 홈) 추가
- 임시 네비게이션 로직 구현
- 앱이름 빛나길로 변경
- 인터넷 권한 추가
- domain 모듈 model 패키지 임시 파일 추가
@wjdrjs00 wjdrjs00 requested a review from l5x5l June 13, 2025 03:15
@wjdrjs00 wjdrjs00 self-assigned this Jun 13, 2025
@wjdrjs00 wjdrjs00 added ✨ Feature 새로운 기능 구현 ⚙ Init 개발 환경 세팅 🧤 대현 labels Jun 13, 2025
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Jun 13, 2025

"""

Walkthrough

프로젝트가 멀티모듈 구조로 대대적으로 리팩토링되었습니다. app, core, domain, presentation 등 여러 모듈이 생성되었으며, 각 모듈별 Gradle 설정과 디렉터리, 예제 코드, 기본 리소스, ProGuard 설정 등이 추가되었습니다. build-logic 디렉터리에는 커스텀 Gradle 플러그인과 공통 빌드 설정이 구현되었습니다.

Changes

파일/경로 그룹 변경 요약
app/build.gradle.kts, app/src/main/AndroidManifest.xml, app/src/main/java/com/threegap/bitnagil/, app/src/androidTest/, app/src/test/*, app/src/main/res/values/strings.xml app 모듈의 Gradle 설정 및 매니페스트, Hilt 적용, Compose 및 네비게이션 기반 구조로 리팩토링, 테스트 코드 삭제, string 리소스 한글화
build-logic/convention/*, build-logic/settings.gradle.kts, gradle.properties 커스텀 Gradle 플러그인 및 공통 빌드 설정 구현, 플러그인 등록, Java/Kotlin/Compose/Hilt 등 통합 관리
core/datastore/, core/designsystem/, core/network/* core 하위 모듈별 기본 Gradle, .gitignore, ProGuard, AndroidManifest, designsystem: Theme/Color/Type 패키지명 변경
data/, domain/, presentation/* 각 모듈별 Gradle, .gitignore, ProGuard, AndroidManifest, presentation: 예제 HomeScreen, LoginScreen Compose UI 추가
gradle/libs.versions.toml 버전 카탈로그 대폭 확장: SDK, Compose, Kotlin, Hilt, 네트워크, 테스트, 번들 및 플러그인 정의
build.gradle.kts, settings.gradle.kts 루트 Gradle 및 settings: 멀티모듈, 플러그인 관리, typesafe accessor, build-logic 추가

Sequence Diagram(s)

sequenceDiagram
    participant App as MainActivity
    participant DI as Hilt
    participant UI as MainScreen
    participant Nav as MainNavHost
    participant Login as LoginScreen
    participant Home as HomeScreen

    App->>DI: @AndroidEntryPoint로 Hilt DI 적용
    App->>UI: setContent { MainScreen() }
    UI->>Nav: MainNavHost(navigator)
    Nav->>Login: Route.Login 진입 시 LoginScreen(onLoginClick)
    Login->>Nav: onLoginClick() 호출 시 Route.Home로 이동
    Nav->>Home: Route.Home 진입 시 HomeScreen()
Loading

Assessment against linked issues

Objective (이슈 번호) Addressed Explanation
app, core, domain, presentation 모듈로 분리 (#1)
build-logic 구현 (#1)

Assessment against linked issues: Out-of-scope changes

해당 변경사항에서 이슈 요구사항과 무관한 변경은 발견되지 않았습니다.

Poem

( ( (
( -.-) 🐇
O_(")(")

모듈이 나뉘고 구조가 탄탄,
빌드 로직도 똑똑하게 단단!
디자인, 데이터, 도메인, 프레젠테이션,
빛나길 프로젝트, 토끼도 감탄!
이제부터 개발, 한결 더 산뜻해! 🚀
"""


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7606ff4 and 424ce9a.

📒 Files selected for processing (1)
  • app/src/main/java/com/threegap/bitnagil/Route.kt (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • app/src/main/java/com/threegap/bitnagil/Route.kt
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build
✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

♻️ Duplicate comments (2)
core/network/.gitignore (1)

1-1: 중복: .gitignore 디렉터리 패턴 개선 제안

domain 모듈과 동일하게 /build 대신 /build/로 디렉터리 무시를 명시하는 것이 좋습니다.
(위 domain/.gitignore에서 제안한 내용과 동일합니다.)

core/datastore/src/main/AndroidManifest.xml (1)

1-4: 중복: AndroidManifest namespace 설정 검증

data 모듈과 동일하게, 빌드 스크립트에서 해당 라이브러리 모듈의 namespace가 제대로 선언되었는지 확인해야 합니다.
[data/src/main/AndroidManifest.xml에서 제안된 내용과 동일합니다.]

🧹 Nitpick comments (26)
domain/.gitignore (1)

1-1: .gitignore 디렉터리 패턴 명시성 강화 제안

현재 /build로 디렉터리를 무시하고 있는데, /build/처럼 뒤에 슬래시를 추가해 디렉터리만 명시적으로 무시하도록 하면 가독성이 높아집니다.

data/src/main/AndroidManifest.xml (1)

1-4: AndroidManifest 최소 구조 확인 및 namespace 설정 검증 제안

<manifest>만 정의된 최소 구조는 적절하지만, 빌드 스크립트(build.gradle.kts)에서 해당 모듈의 namespace(또는 package)가 올바르게 설정되었는지 확인하세요.

build-logic/settings.gradle.kts (2)

1-12: 버전 카탈로그 파일 경로가 하드코딩돼 있어 재배포·별도 저장소 사용 시 깨질 위험이 있습니다
from(files("../gradle/libs.versions.toml")) 같은 상대 경로는 루트 위치가 바뀌면 곧바로 실패합니다.
rootDir.resolve("gradle/libs.versions.toml") 형태로 명시적 절대 경로를 사용하거나, settings.gradle.kts(루트)의 카탈로그를 그대로 재사용하는 방식(Composite build 의존)으로 변경하면 안정성이 올라갑니다.


14-15: 프로젝트 이름 중복 가능성 검토
루트 빌드와 동일한 네이밍(build-logic)이 겹치면 IDE 표시나 Gradle task path가 헷갈릴 수 있습니다. 내부 전용 서브-빌드라면 bitnagil-build-logic 등으로 구분해 두는 편이 추후 유지보수 시 편리합니다.

gradle/libs.versions.toml (1)

168-185: 커스텀 플러그인 버전을 unspecified로 두면 의존성 캐시가 매번 초기화됩니다
version = "unspecified" 는 Gradle가 캐싱을 건너뛰도록 만듭니다.
version = "${project.version}" 혹은 convention 모듈의 version을 1.0.0-SNAPSHOT 형태로 정의해서 캐싱 이점을 누리세요.

build-logic/convention/build.gradle.kts (1)

23-50: 플러그인 marker-artifact 퍼블리싱 설정 누락
gradlePlugin { plugins { … } } 선언만으로는 플러그인 id -> impl 클래스 매핑 JAR(marker)가 로컬 maven repo에 퍼블리시되지 않습니다.
다중 모듈이 독립적으로 플러그인을 적용할 때 pluginBundle { … } 혹은 publishing {} 블록으로 marker artifact를 배포하도록 설정해야 CI 캐시가 깨지지 않습니다.

build-logic/convention/.gitignore (1)

1-1: 빌드 아티팩트 무시 목록 확장 제안
현재 /build 디렉토리만 무시되고 있습니다. Gradle 플러그인 프로젝트에서는 .gradle/, *.iml, .idea/ 등 추가 빌드/IDE 아티팩트를 함께 무시하는 것이 좋습니다.

+ .gradle/
+ *.iml
+ .idea/
domain/build.gradle.kts (1)

5-7: 테스트 의존성 추가 고려
현재 domain 모듈에 단위 테스트 설정이 없습니다. 필요 시 testImplementation(kotlin("test")) 또는 JUnit 의존성을 추가해 보세요.

presentation/src/main/AndroidManifest.xml (1)

1-4: 빈 매니페스트 파일 유지 필요성 검토
Android 라이브러리 모듈에서는 build.gradle.ktsnamespace 설정만으로 네임스페이스가 정의됩니다. 해당 빈 매니페스트가 불필요하다면 파일 제거를 고려하세요.

core/network/src/main/AndroidManifest.xml (1)

1-4: 빈 매니페스트 파일 정리 제안
라이브러리 모듈의 경우 build.gradle.kts에서 namespace를 정의하면 별도 package 속성이 없어도 동작합니다. 내용이 없다면 매니페스트 파일을 제거해도 무방합니다.

core/network/build.gradle.kts (1)

11-13: 의존성 블록 문서화 제안
현재 빈 dependencies {} 블록인데, 네트워크 모듈에는 Retrofit, Ktor 등 HTTP 클라이언트 라이브러리 의존성이 필요할 것입니다. TODO나 주석으로 향후 추가 계획을 남겨두세요.

core/datastore/build.gradle.kts (1)

11-13: 테스트 의존성 추가 제안
androidx.datastore 외에도 DataStore 로직 검증을 위한 kotlinx-coroutines-testjunit 테스트 의존성을 추가하면 유닛 테스트 작성이 수월해집니다.

core/designsystem/build.gradle.kts (1)

10-11: 디펜던시 블록 문서화 제안
현재 빈 dependencies 블록이지만, 디자인 시스템 모듈에는 Compose Material, Foundation 등의 API 의존성이 필요합니다. TODO 주석이나 실제 의존성 추가 일정을 남겨두세요.

app/src/main/java/com/threegap/bitnagil/BitnagilApplication.kt (1)

1-11: Hilt 애플리케이션 클래스 설정 적절
@HiltAndroidApp을 통한 Hilt 초기화가 올바르게 적용되었습니다. 추가 초기화 로직(예: 로깅, Crashlytics 등)이 필요하다면 onCreate에 구현해주세요.

core/network/proguard-rules.pro (1)

1-21: ProGuard 규칙 템플릿 확인
현재 모든 규칙이 주석 처리되어 있어 실제로 적용되는 룰이 없습니다. 모듈의 build.gradle.ktsconsumerProguardFiles("proguard-rules.pro")를 추가하고, 필요한 -keep 룰을 활성화해 최적화 및 난독화를 설정하세요.

data/proguard-rules.pro (1)

1-21: ProGuard 규칙 템플릿 확인
템플릿으로 추가된 ProGuard 파일이지만, 모든 규칙이 주석 처리되어 있어 적용되지 않습니다. build.gradle.ktsconsumerProguardFiles("proguard-rules.pro") 설정을 확인하고, 필요한 룰을 주석 해제해 주세요.

core/designsystem/proguard-rules.pro (1)

1-21: ProGuard 규칙 템플릿 확인
현재 모든 규칙이 주석 처리되어 실제로 적용되지 않습니다. 모듈 빌드 스크립트에 consumerProguardFiles("proguard-rules.pro")를 추가하고, 디자인 시스템에 필요한 -keep 규칙을 활성화해주세요.

build-logic/convention/src/main/java/com/threegap/bitnagil/convention/AndroidComposePlugin.kt (1)

10-17: Android Library 플러그인 의존성 명시가 필요할 수 있습니다

본 플러그인은 com.android.library 를 적용하지 않고 LibraryExtension 을 바로 구성합니다.
모듈 쪽에서 bitnagil.android.librarybitnagil.android.compose.library 둘 다를 적용한다면 문제없지만, 실수로 compose 플러그인만 적용했을 때 NPE 가 발생합니다.

안전 장치를 위해 다음과 같이 라이브러리 플러그인 적용을 보장하는 코드 추가를 고려해 주세요:

pluginManager.withPlugin("com.android.library") {
    extensions.configure<LibraryExtension> {
        configureComposeAndroid(this)
    }
}
build.gradle.kts (1)

14-18: ktlint 플러그인 root 프로젝트 적용은 과도할 수 있습니다

allprojects { … } 블록으로 인해 루트(=aggregate) 프로젝트에도 ktlint 플러그인이 적용됩니다. 루트에서 소스가 없으면 불필요한 task 생성만 늘어나고 CI 시간이 증가할 수 있습니다. 기존처럼 subprojects 로 제한하거나 rootProject.name == "Bitnagil" 등의 가드 조건을 추가하는 편이 권장됩니다.

build-logic/convention/src/main/java/com/threegap/bitnagil/convention/KotlinJvmPlugin.kt (1)

10-27: 중첩 with(target) 블록은 불필요 – 간결화 가능

apply() 내부에서 두 번의 with(target)을 사용하고 있어 가독성이 떨어집니다. 아래처럼 한 번으로 줄이면 동일한 효과를 얻습니다.

-    override fun apply(target: Project): Unit = with(target) {
-        with(target) {
-            pluginManager.apply {
-                apply("java-library")
-                apply("org.jetbrains.kotlin.jvm")
-            }
-        }
+    override fun apply(target: Project): Unit = with(target) {
+        pluginManager.apply {
+            apply("java-library")
+            apply("org.jetbrains.kotlin.jvm")
+        }
 ...
 }
app/src/main/java/com/threegap/bitnagil/MainNavHost.kt (1)

20-28: 로그인 화면 뒤로가기 스택 정리 필요

navController.navigate(Route.Home) 만 호출하면 LoginHome 이동 후 백 버튼 누를 때 다시 Login 으로 돌아갑니다. 로그인 성공 시 스택을 비워야 한다면 popUpTo 옵션을 추가하세요.

navigator.navController.navigate(Route.Home) {
    popUpTo(navigator.startDestination) { inclusive = true }
}
build-logic/convention/src/main/java/com/threegap/bitnagil/convention/HiltPlugin.kt (1)

11-20: 버전 카탈로그에 정의된 플러그인-ID 사용 고려

pluginManager.apply { … } 에서 문자열 리터럴 대신 libs.findPlugin("hilt.android").get().get().pluginId 형태로 버전 카탈로그의 플러그인-ID를 사용하면 의존성 관리 일관성이 높아집니다. 동일하게 라이브러리·KSP 의존성 선언도 add("implementation", …) 형태로 통일하면 가독성이 조금 더 좋아집니다.

build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/KotlinCoroutine.kt (1)

12-15: Coroutine 테스트 의존성도 함께 추가 검토

프로덕션 코드용 implementation 번들만 추가되어 있습니다. 모듈 전반에서 코루틴 테스트 유틸(kotlinx-coroutines-test) 사용 가능성을 고려해 아래 항목도 포함하면 실용적입니다.

 dependencies {
     "implementation"(libs.findBundle("coroutine").get())
+    "testImplementation"(libs.findLibrary("kotlinx.coroutines.test").get())
 }
app/src/main/java/com/threegap/bitnagil/MainNavigator.kt (1)

8-18: MainNavigator 객체에 안정성 어노테이션 추가 제안

Compose Recomposition 시 객체 안정성을 명시하기 위해 @Stable(또는 @Immutable)을 클래스 위에 선언하면 성능 이점이 있습니다.

-class MainNavigator(
+@Stable
+class MainNavigator(
     val navController: NavHostController,
 ) {
build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/KotlinAndroid.kt (2)

9-9: 사용되지 않는 import 제거 권장
org.gradle.kotlin.dsl.provideDelegate는 본 파일에서 사용되지 않습니다. 정리하여 가독성을 높여 주세요.


50-62: warningsAsErrors 처리 로직 재검토 필요
val warningsAsErrors: String? by project가 null 일 경우 toBoolean()false를 반환합니다.
프로퍼티가 정의되지 않았을 때 기본값을 명시적으로 처리하거나, 타입 안정성을 위해 getOrElse("false").toBoolean()과 같이 설정값을 캐싱하는 방법을 고려해 주세요.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a4a4566 and 6ede6a5.

📒 Files selected for processing (53)
  • app/build.gradle.kts (1 hunks)
  • app/src/androidTest/java/com/threegap/bitnagil/ExampleInstrumentedTest.kt (0 hunks)
  • app/src/main/AndroidManifest.xml (1 hunks)
  • app/src/main/java/com/threegap/bitnagil/BitnagilApplication.kt (1 hunks)
  • app/src/main/java/com/threegap/bitnagil/MainActivity.kt (1 hunks)
  • app/src/main/java/com/threegap/bitnagil/MainNavHost.kt (1 hunks)
  • app/src/main/java/com/threegap/bitnagil/MainNavigator.kt (1 hunks)
  • app/src/main/java/com/threegap/bitnagil/MainScreen.kt (1 hunks)
  • app/src/main/java/com/threegap/bitnagil/Route.kt (1 hunks)
  • app/src/main/res/values/strings.xml (1 hunks)
  • app/src/test/java/com/threegap/bitnagil/ExampleUnitTest.kt (0 hunks)
  • build-logic/convention/.gitignore (1 hunks)
  • build-logic/convention/build.gradle.kts (1 hunks)
  • build-logic/convention/src/main/java/com/threegap/bitnagil/convention/AndroidApplicationPlugin.kt (1 hunks)
  • build-logic/convention/src/main/java/com/threegap/bitnagil/convention/AndroidComposePlugin.kt (1 hunks)
  • build-logic/convention/src/main/java/com/threegap/bitnagil/convention/AndroidLibraryPlugin.kt (1 hunks)
  • build-logic/convention/src/main/java/com/threegap/bitnagil/convention/HiltPlugin.kt (1 hunks)
  • build-logic/convention/src/main/java/com/threegap/bitnagil/convention/KotlinJvmPlugin.kt (1 hunks)
  • build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/ComposeAndroid.kt (1 hunks)
  • build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/KotlinAndroid.kt (1 hunks)
  • build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/KotlinCoroutine.kt (1 hunks)
  • build-logic/gradle.properties (1 hunks)
  • build-logic/settings.gradle.kts (1 hunks)
  • build.gradle.kts (1 hunks)
  • core/datastore/.gitignore (1 hunks)
  • core/datastore/build.gradle.kts (1 hunks)
  • core/datastore/proguard-rules.pro (1 hunks)
  • core/datastore/src/main/AndroidManifest.xml (1 hunks)
  • core/designsystem/.gitignore (1 hunks)
  • core/designsystem/build.gradle.kts (1 hunks)
  • core/designsystem/proguard-rules.pro (1 hunks)
  • core/designsystem/src/main/AndroidManifest.xml (1 hunks)
  • core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/Color.kt (1 hunks)
  • core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/Theme.kt (1 hunks)
  • core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/Type.kt (1 hunks)
  • core/network/.gitignore (1 hunks)
  • core/network/build.gradle.kts (1 hunks)
  • core/network/proguard-rules.pro (1 hunks)
  • core/network/src/main/AndroidManifest.xml (1 hunks)
  • data/.gitignore (1 hunks)
  • data/build.gradle.kts (1 hunks)
  • data/proguard-rules.pro (1 hunks)
  • data/src/main/AndroidManifest.xml (1 hunks)
  • domain/.gitignore (1 hunks)
  • domain/build.gradle.kts (1 hunks)
  • gradle/libs.versions.toml (1 hunks)
  • presentation/.gitignore (1 hunks)
  • presentation/build.gradle.kts (1 hunks)
  • presentation/proguard-rules.pro (1 hunks)
  • presentation/src/main/AndroidManifest.xml (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeScreen.kt (1 hunks)
  • presentation/src/main/java/com/threegap/bitnagil/presentation/login/LoginScreen.kt (1 hunks)
  • settings.gradle.kts (3 hunks)
💤 Files with no reviewable changes (2)
  • app/src/test/java/com/threegap/bitnagil/ExampleUnitTest.kt
  • app/src/androidTest/java/com/threegap/bitnagil/ExampleInstrumentedTest.kt
🧰 Additional context used
🧬 Code Graph Analysis (8)
build-logic/convention/src/main/java/com/threegap/bitnagil/convention/AndroidApplicationPlugin.kt (3)
build-logic/convention/src/main/java/com/threegap/bitnagil/convention/AndroidLibraryPlugin.kt (2)
  • apply (10-22)
  • apply (11-21)
build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/KotlinAndroid.kt (1)
  • configureKotlinAndroid (13-64)
build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/ComposeAndroid.kt (1)
  • configureComposeAndroid (10-29)
build-logic/convention/src/main/java/com/threegap/bitnagil/convention/AndroidLibraryPlugin.kt (2)
build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/KotlinAndroid.kt (1)
  • configureKotlinAndroid (13-64)
build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/KotlinCoroutine.kt (1)
  • configureKotlinCoroutine (9-17)
presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeScreen.kt (1)
core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/Theme.kt (1)
  • BitnagilTheme (27-50)
app/src/main/java/com/threegap/bitnagil/MainScreen.kt (2)
app/src/main/java/com/threegap/bitnagil/MainNavigator.kt (1)
  • rememberMainNavigator (14-18)
app/src/main/java/com/threegap/bitnagil/MainNavHost.kt (1)
  • MainNavHost (10-30)
build-logic/convention/src/main/java/com/threegap/bitnagil/convention/AndroidComposePlugin.kt (3)
build-logic/convention/src/main/java/com/threegap/bitnagil/convention/AndroidLibraryPlugin.kt (2)
  • apply (10-22)
  • apply (11-21)
build-logic/convention/src/main/java/com/threegap/bitnagil/convention/AndroidApplicationPlugin.kt (2)
  • apply (12-31)
  • apply (13-30)
build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/ComposeAndroid.kt (1)
  • configureComposeAndroid (10-29)
app/src/main/java/com/threegap/bitnagil/MainActivity.kt (2)
core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/Theme.kt (1)
  • BitnagilTheme (27-50)
app/src/main/java/com/threegap/bitnagil/MainScreen.kt (1)
  • MainScreen (9-22)
app/src/main/java/com/threegap/bitnagil/MainNavHost.kt (2)
presentation/src/main/java/com/threegap/bitnagil/presentation/login/LoginScreen.kt (1)
  • LoginScreen (19-42)
presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeScreen.kt (1)
  • HomeScreen (15-27)
presentation/src/main/java/com/threegap/bitnagil/presentation/login/LoginScreen.kt (1)
core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/Theme.kt (1)
  • BitnagilTheme (27-50)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build
🔇 Additional comments (32)
core/datastore/.gitignore (1)

1-1: .gitignore/build 디렉터리 무시 설정이 추가되었습니다.

모듈 빌드 산출물을 제외하기 위한 올바른 설정이며, 다른 모듈과 일관성이 유지됩니다.

build-logic/gradle.properties (1)

1-3: Gradle 설정 호환성 검증 요청

org.gradle.configureondemand=true 설정은 Gradle 버전 7.x 이상에서 deprecated 되었거나 제거될 수 있습니다. 현재 프로젝트의 Gradle 버전에서 이 옵션이 유효한지 확인해 주세요.

build-logic/convention/src/main/java/com/threegap/bitnagil/convention/extension/ComposeAndroid.kt (1)

18-20: 컴파일러 플러그인 옵션의 Gradle 버전 호환성 확인 필요
includeSourceInformation 옵션은 Kotlin 2.x + Compose Compiler 1.5 이상에서만 동작합니다. 팀원 IDE 또는 CI가 구버전을 사용하면 빌드 실패할 수 있으니 최소 버전을 명시·검증해 주세요.

gradle/libs.versions.toml (1)

3-6: compileSdk / targetSdk 35는 정식 릴리스 전 버전일 가능성이 높습니다
AGP 8.1x 라인에서는 Android 35 Preview SDK를 공식 지원하지 않습니다. CI 이미지나 팀원 로컬에서 빌드가 깨질 수 있으니, 안정 버전(34)로 고정하거나 Canary AGP로 올릴지 결정이 필요합니다.

core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/Type.kt (1)

1-1: 패키지 변경 👍
모듈 분리에 맞춰 designsystem 패키지로 이동된 점 확인했습니다. 다른 소스에서의 import 수정도 함께 이루어졌는지 점검만 해 주세요.

core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/Theme.kt (1)

1-1: 패키지 선언이 모듈 구조와 일치하는지 확인
기존 ui.theme에서 designsystem으로 변경된 패키지가 새로운 모듈 설정과 완전히 일치하는지, 해당 파일을 참조하는 모든 import 구문이 올바르게 갱신되었는지 점검이 필요합니다.

core/designsystem/.gitignore (1)

1-1: Git ignore에 build 디렉터리 제외 추가
/build 디렉터리를 버전 관리에서 제외하도록 설정하여 다른 모듈과 일관성을 유지하고 있습니다.

core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/Color.kt (1)

1-1: 컬러 리소스 패키지 변경 확인
com.threegap.bitnagil.designsystem으로 업데이트된 패키지가 core/designsystem 모듈 정의와 일치하는지, 참조 코드의 import 구문이 모두 갱신되었는지 확인해주세요.

data/.gitignore (1)

1-1: data 모듈 Git ignore 설정
/build 디렉터리를 제외하도록 구성하여 버전 관리 대상에서 빌드 산출물이 배제됩니다. 프로젝트 전반과 일관됩니다.

presentation/.gitignore (1)

1-1: presentation 모듈 Git ignore 설정
/build 디렉터리를 버전 관리에서 제외하여 모듈 간 ignore 규칙을 일관되게 적용했습니다.

app/src/main/res/values/strings.xml (1)

2-2: 다국어 로케일 대응 확인 필요
앱 이름을 한국어 빛나길로 변경하셨습니다. 기본 리소스 외에 영어(values-en) 등 다른 로케일을 지원해야 하는지 검토해보세요.

domain/build.gradle.kts (1)

1-3: Kotlin 플러그인 alias 검증 요청
alias(libs.plugins.bitnagil.kotlin)이 version catalog 및 custom convention에 정의된 올바른 Kotlin JVM 플러그인인지 확인해주세요.

core/designsystem/src/main/AndroidManifest.xml (1)

1-4: 라이브러리 모듈 매니페스트 구조 확인
<manifest>만으로 라이브러리 모듈의 기본 구성이 충족됩니다. 추가 권한 선언이나 명시적 package 속성이 필요한지 컨벤션 플러그인 정의에서 확인해주세요.

core/network/build.gradle.kts (1)

1-5: 플러그인 적용 및 컨벤션 검토
bitnagil.android.library, bitnagil.android.hilt, kotlin.serialization 플러그인 적용 순서가 적절합니다. 이 컨벤션 플러그인들이 compileSdk, minSdk, targetSdk 및 Hilt/KSP 설정을 모두 포함하는지 빌드-로직에서 확인해주세요.

core/datastore/build.gradle.kts (1)

1-5: DataStore 플러그인 구성 검토
android.library, android.hilt, kotlin.serialization 플러그인 적용이 보입니다. Preferences DataStore 사용 시에는 kotlin.serialization이 필요 없을 수 있으니 컨벤션 플러그인 정의를 통해 실제 사용 시 타입(Preferences vs. Proto)에 맞춰 설정되는지 확인하세요.

core/designsystem/build.gradle.kts (1)

1-4: Compose 라이브러리 컨벤션 검토
bitnagil.android.librarybitnagil.android.compose.library 플러그인 적용이 적절합니다. 컨벤션 플러그인에 Compose UI, Material, Foundation 등의 기본 의존성이 포함되는지 빌드-로직에서 확인해주세요.

app/src/main/AndroidManifest.xml (2)

5-5: INTERNET 권한 추가
네트워크 호출을 위해 android.permission.INTERNET 권한이 올바르게 추가되었습니다.


8-8: 커스텀 Application 클래스 등록
BitnagilApplication<application> 태그에 등록되어 Hilt 초기화가 가능해졌습니다.

presentation/build.gradle.kts (3)

1-4: 컨벤션 플러그인 적용
bitnagil.android.librarybitnagil.android.compose.library 플러그인을 일관되게 적용한 점이 좋습니다.


6-8: Android 네임스페이스 설정 확인
namespace = "com.threegap.bitnagil.presentation"이 올바르게 설정되어 컴파일 구성과 일치합니다.


10-15: Presentation 모듈 의존성 검토
UI 계층에서 도메인(projects.domain)이나 데이터(projects.data) 모듈을 참조한다면, 해당 의존성을 추가해야 합니다. 사용 여부를 확인하고 필요한 경우 implementation(projects.domain) 등을 선언해주세요.

data/build.gradle.kts (1)

14-18: 의존성 BOM 정합성 확인 필요

okhttp.bomretrofit.bom 을 동시에 사용하면 내부적으로 okhttp 버전이 두 번 정의됩니다(한 번은 OkHttp BOM, 한 번은 Retrofit BOM 내부). 버전 충돌은 없겠지만 Gradle 경고가 발생할 수 있으니 retrofit2:retrofit-bom 만 사용하거나 enforcedPlatform 으로 명시적으로 조정할지 검토하세요.

core/datastore/proguard-rules.pro (1)

1-21: 템플릿 파일 추가 확인

프로가드 규칙이 모두 주석 처리된 템플릿이므로 빌드에 영향은 없습니다. 추후 실제 난독화 규칙이 필요할 때 이 파일을 업데이트하면 됩니다.

presentation/proguard-rules.pro (1)

1-21: 템플릿 파일 추가 확인

presentation 모듈도 동일한 프로가드 템플릿이 추가되었습니다. 현재 상태로는 문제 없습니다.

build.gradle.kts (1)

4-11: 플러그인 alias 선언 누락 여부 확인 필요

libs.versions.toml 에 새로 추가된 android.library, compose.compiler, kotlin.jvm, kotlin.serialization, ksp, hilt 엔트리가 실제로 존재하는지 확인해 주세요. 누락되면 Gradle 동기화 단계에서 즉시 실패합니다.

settings.gradle.kts (1)

1-4: enableFeaturePreview 향후 제거 고려

Gradle 8.7부터 TYPESAFE_PROJECT_ACCESSORS는 기본 활성화 예정으로 알려져 있습니다. 추후 버전 업 시 불필요한 프리뷰 호출이 경고로 바뀔 수 있으니 체크해 두세요.

app/src/main/java/com/threegap/bitnagil/MainActivity.kt (1)

7-18: @AndroidEntryPoint 적용 및 테마/네비게이션 연결 확인 완료

Hilt 의존성 주입과 디자인 시스템 모듈 연동이 올바르게 적용되었습니다. MainScreen() 호출만으로 UI 루트를 위임한 점도 깔끔합니다. 별다른 문제 없어 보입니다.

build-logic/convention/src/main/java/com/threegap/bitnagil/convention/AndroidLibraryPlugin.kt (1)

17-20: Android 라이브러리 플러그인 구성 확인 완료

공통 Kotlin/Coroutine 설정을 한 곳에서 호출해 재사용성을 높였습니다. 별다른 문제 없이 동작할 것으로 보입니다.

build-logic/convention/src/main/java/com/threegap/bitnagil/convention/AndroidApplicationPlugin.kt (2)

14-18: Compose 플러그인 ID 확인 필요
org.jetbrains.kotlin.plugin.compose는 Kotlin 1.9+에서 제공되는 멀티플랫폼 Compose 플러그인입니다.
순수 Android Jetpack Compose만 사용한다면 불필요할 수 있으므로 실제 사용 의도를 다시 한 번 검증해 주세요.


24-28: 버전 정보 타입 불일치 가능성 점검
libs.findVersion("versionCode")·versionNameversion catalogversion 타입으로 읽고 있습니다.
versionCode처럼 정수 값을 version catalog의 version으로 관리하면 "1" → Int 파싱이 필요합니다. toml에서 intnumber로 정의되었는지 확인해 주세요.

app/build.gradle.kts (2)

1-5: Hilt 사용 시 kapt 플러그인 포함 여부 확인
bitnagil.android.hilt 플러그인이 kapt 적용까지 대행한다면 문제없지만, 그렇지 않다면 별도로 kapt 플러그인을 추가해야 컴파일 에러를 방지할 수 있습니다.


15-22: 앱 모듈에서 UI 의존성 누락 여부 확인
현재 의존성이 내부 모듈로만 구성돼 있습니다. 만약 앱 모듈에서 직접 Jetpack Compose UI, Hilt, Accompanist 등을 사용한다면 BOM 및 라이브러리 의존성 추가가 필요합니다.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
app/src/main/java/com/threegap/bitnagil/MainScreen.kt (1)

10-13: 기존 컴파일 오류가 해결된 점 확인되었습니다

navigator 기본값에서 rememberMainNavigator()를 제거하여 @composable 컨텍스트 밖 호출 문제를 잘 해결하셨습니다.

🧹 Nitpick comments (1)
app/src/main/java/com/threegap/bitnagil/MainScreen.kt (1)

17-20: NavHost Modifier에 외부 Modifier를 함께 전달하는 것이 더 안전합니다

현재 MainNavHostModifier.padding(innerPadding)만 전달되면서, 호출측에서 MainScreen에 부여한 modifier(예: testTag, semantics 등)가 NavHost까지 전파되지 않습니다. 필요 시 다음과 같이 체이닝하여 외부 Modifier를 보존할 수 있습니다.

-            modifier = Modifier.padding(innerPadding),
+            modifier = modifier.padding(innerPadding),

필요하다면 고려해 주세요.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6c84744 and 7606ff4.

📒 Files selected for processing (2)
  • app/src/main/java/com/threegap/bitnagil/MainActivity.kt (1 hunks)
  • app/src/main/java/com/threegap/bitnagil/MainScreen.kt (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • app/src/main/java/com/threegap/bitnagil/MainActivity.kt
🧰 Additional context used
🧬 Code Graph Analysis (1)
app/src/main/java/com/threegap/bitnagil/MainScreen.kt (1)
app/src/main/java/com/threegap/bitnagil/MainNavHost.kt (1)
  • MainNavHost (10-30)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build

@YAPP-Github YAPP-Github deleted a comment from coderabbitai bot Jun 14, 2025
@YAPP-Github YAPP-Github deleted a comment from coderabbitai bot Jun 14, 2025
@YAPP-Github YAPP-Github deleted a comment from coderabbitai bot Jun 14, 2025
@YAPP-Github YAPP-Github deleted a comment from coderabbitai bot Jun 14, 2025
@wjdrjs00 wjdrjs00 merged commit 564017c into develop Jun 14, 2025
2 checks passed
coderabbitai bot added a commit that referenced this pull request Jun 22, 2025
Docstrings generation was requested by @l5x5l.

* #6 (comment)

The following files were modified:

* `presentation/src/main/java/com/threegap/bitnagil/presentation/common/mviviewmodel/MviViewModel.kt`
l5x5l added a commit that referenced this pull request Jun 22, 2025
@wjdrjs00 wjdrjs00 deleted the feature/#1-multi-module-setup branch July 6, 2025 10:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 새로운 기능 구현 ⚙ Init 개발 환경 세팅 🧤 대현

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] 프로젝트 멀티모듈 환경 구축

2 participants