Skip to content

Conversation

@chanho0908
Copy link
Member

@chanho0908 chanho0908 commented Dec 22, 2025

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 로그인 기능이 추가되었습니다.
  • 개선 사항

    • 앱의 모듈화 아키텍처를 재구성하여 코드 조직을 개선했습니다.
    • 디자인 시스템, 네비게이션, UI 및 네트워크 기능을 별도의 모듈로 분리했습니다.

✏️ Tip: You can customize this high-level summary in your review settings.

chanho0908 and others added 8 commits December 18, 2025 15:59
- Convention Plugin 기반 빌드 로직 구성 (build-logic)
- Feature 레이어: login 모듈
- Domain 레이어: 비즈니스 로직 모듈
- Data 레이어: 데이터 소스 모듈
- Core 레이어: 공통 모듈
  - ui: State/SideEffect 기반 UI 구조
  - util: 유틸리티
  - navigation: 네비게이션
  - design-system: 디자인 시스템
  - network: 네트워크
- TYPESAFE_PROJECT_ACCESSORS 활성화
- Ktlint 14.0.1 전역 적용

🤖 Generated with [Firebender](https://firebender.com)

Co-Authored-By: Firebender <help@firebender.com>
Data 모듈의 의존성을 DataConventionPlugin으로 이동하고, FeatureConventionPlugin의 플러그인 적용 방식을 개선하여 빌드 로직을 더욱 체계적으로 관리
멀티모듈 아키텍처 구조 설정
@chanho0908 chanho0908 merged commit af636f9 into main Dec 22, 2025
1 check was pending
@coderabbitai
Copy link

coderabbitai bot commented Dec 22, 2025

Caution

Review failed

The pull request is closed.

Note

.coderabbit.yml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key(s) in object: 'work_guidelines', 'reviewer_principles'
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • 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

Walkthrough

이 PR은 Gradle 빌드 로직의 대규모 리팩토링으로, 산발적인 설정을 재사용 가능한 Convention Plugins으로 통합합니다. build-logic/convention 모듈에서 7개의 표준화된 플러그인을 정의하여 Android 앱, 라이브러리, Compose, Koin, JVM, 데이터, 기능 모듈 구성을 일관되게 관리합니다. 동시에 프로젝트 구조를 core(designSystem, navigation, network, ui, util), data, domain, feature(login)의 계층화된 모듈로 개편하고, 새로운 UI 기반 클래스(State, SideEffect, StateHolder, SideEffectHolder)를 추가합니다.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45-60 minutes

세심한 검토가 필요한 영역:

  • build-logic/convention 모듈의 플러그인 체인 구조: FeatureConventionPlugin이 다른 플러그인들을 조합하는 방식과 의존성 순서가 예상대로 작동하는지 확인 필요 (예: apply<AndroidLibraryConventionPlugin>() 다음에 apply<AndroidComposeConventionPlugin>())
  • buildLogicConventionPlugin.kt의 확장 메커니즘: Project.() -> Unit 람다 블록의 실행 컨텍스트가 모든 플러그인에서 일관되게 작동하는지 검증
  • extension 함수들의 버전 카탈로그 접근: ProjectExtension.ktlibs 프로퍼티와 VersionCatalogExtension.kt의 예외 처리 로직이 런타임 에러를 적절히 처리하는지 확인
  • app/build.gradle.kts의 의존성 마이그레이션: 이전 AndroidX 라이브러리 참조가 모두 모듈 프로젝트 참조로 정확히 치환되었는지, 호출 사이트에서 누락된 부분이 없는지 검증
  • UI 기본 클래스들의 코루틴 안정성: SideEffectHolder의 Channel과 StateHolder의 MutableStateFlow가 스코프 취소 시 예외 처리가 잘 되어있는지

코칭 피드백 🎓

잘하신 부분입니다! 👏

여러 gradle 설정을 convention plugin으로 추상화한 접근은 DRY 원칙을 잘 따르고 있습니다. 특히:

  1. 모듈화의 철학을 담았습니다: build-logic이 별도의 모듈화된 영역으로 분리되어 있어, 빌드 설정의 재사용성이 극대화되었네요.
  2. 계층화된 구조: core(기초), data/domain(비즈니스), feature(기능) 분리가 명확하고, SOLID 원칙의 Single Responsibility를 잘 반영했습니다.
  3. State/SideEffect 인터페이스: MVI/MVVM 패턴을 염두에 둔 확장 가능한 설계입니다.

개선을 제안드립니다 💡

  1. Extension 함수들에 문서화를 추가하세요: 예를 들어 DependencyHandlerScopeExtension.kt의 각 함수들이 implementation(project(...)) 구문을 어떻게 간소화하는지 KDoc 주석을 통해 설명하면, 팀원들의 이해도가 높아집니다.

    /**
     * 프로젝트 의존성을 implementation 설정으로 추가합니다.
     * `@param` project 의존할 프로젝트
     */
    fun DependencyHandlerScope.implementation(project: Project) = ...
  2. VersionCatalogExtension의 예외 메시지를 더 친절하게: NoSuchElementException 발생 시 "lib:koin-bom이 gradle/libs.versions.toml에 정의되어 있는지 확인하세요" 같은 수정 가이드를 포함하면, 향후 문제 해결 시간을 크게 단축할 수 있습니다.

  3. Convention 플러그인들의 적용 순서를 명시하세요: FeatureConventionPluginAndroidLibraryConventionPluginKoinConventionPluginAndroidComposeConventionPlugin 순서로 적용되는 이유가 있다면, 주석으로 남겨두면 유지보수성이 올라갑니다.

  4. StateHolder와 SideEffectHolder의 스코프 관리: 두 클래스가 장시간 유지되는 객체라면, Job 취소 시 리소스 정리 가이드를 추가해보세요. 예를 들어:

    /**
     * 상태 홀더를 생성합니다. ViewModel 스코프 내에서 관리되어야 합니다.
     */
    class StateHolder<S : State>(initialState: S) { ... }
  5. 모듈 간 의존성 다이어그램: 특히 core/network → data → domain 체인에서 순환 의존성이 없음을 확인하는 문서가 있으면 좋습니다.

참고할 만한 자료:

이 정도면 차근차근 확인하면서 리뷰할 수 있는 좋은 기반이 되실 겁니다! 🚀

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch develop

📜 Recent review details

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0b6daf4 and 23562b4.

📒 Files selected for processing (40)
  • .editorconfig
  • app/build.gradle.kts
  • build-logic/convention/build.gradle.kts
  • build-logic/convention/src/main/kotlin/com/twix/convention/AndroidApplicationConventionPlugin.kt
  • build-logic/convention/src/main/kotlin/com/twix/convention/AndroidComposeConventionPlugin.kt
  • build-logic/convention/src/main/kotlin/com/twix/convention/AndroidLibraryConventionPlugin.kt
  • build-logic/convention/src/main/kotlin/com/twix/convention/BuildLogicConventionPlugin.kt
  • build-logic/convention/src/main/kotlin/com/twix/convention/DataConventionPlugin.kt
  • build-logic/convention/src/main/kotlin/com/twix/convention/FeatureConventionPlugin.kt
  • build-logic/convention/src/main/kotlin/com/twix/convention/JvmLibraryConventionPlugin.kt
  • build-logic/convention/src/main/kotlin/com/twix/convention/KoinConventionPlugin.kt
  • build-logic/convention/src/main/kotlin/com/twix/convention/extension/Android.kt
  • build-logic/convention/src/main/kotlin/com/twix/convention/extension/Compose.kt
  • build-logic/convention/src/main/kotlin/com/twix/convention/extension/DependencyHandlerScopeExtension.kt
  • build-logic/convention/src/main/kotlin/com/twix/convention/extension/ProjectExtension.kt
  • build-logic/convention/src/main/kotlin/com/twix/convention/extension/VersionCatalogExtension.kt
  • build-logic/settings.gradle.kts
  • core/design-system/build.gradle.kts
  • core/design-system/src/main/java/com/twix/designsystem/.gitkeep
  • core/navigation/build.gradle.kts
  • core/navigation/src/main/java/com/twix/navigation/.gitkeep
  • core/network/build.gradle.kts
  • core/network/src/main/java/com/twix/network/.gitkeep
  • core/ui/build.gradle.kts
  • core/ui/src/main/java/com/twix/ui/base/SideEffect.kt
  • core/ui/src/main/java/com/twix/ui/base/SideEffectHolder.kt
  • core/ui/src/main/java/com/twix/ui/base/State.kt
  • core/ui/src/main/java/com/twix/ui/base/StateHolder.kt
  • core/util/build.gradle.kts
  • core/util/src/main/java/com/twix/util/.gitkeep
  • data/build.gradle.kts
  • data/src/main/java/com/twix/data/.gitkeep
  • domain/build.gradle.kts
  • domain/src/main/java/com/twix/domain/.gitkeep
  • feature/login/build.gradle.kts
  • feature/login/src/androidTest/java/com/twix/login/.gitkeep
  • feature/login/src/main/AndroidManifest.xml
  • feature/login/src/main/java/com/twix/login/LoginActivity.kt
  • feature/login/src/test/java/com/twix/login/.gitkeep
  • settings.gradle.kts

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

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants