diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index b86273d..301f583 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,6 +1,10 @@
-
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 7b3006b..08286de 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -4,6 +4,18 @@
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 74dd639..7146cb1 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/README.md b/README.md
index da94f0e..60baabc 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,84 @@
+1월 둘째주
+
+01/07
+- [ ] 15시 - XML selector 배우기
+- [ ] 기획 정리 및 PPT로 변환
+- [ ] 안드로이드 3강까지 듣고 정리하기
+- [ ] 알고리즘 공부
+- [ ] JAVA -> 객체지향 공부
+- [ ] 복싱
+- [ ] 블로그 작성 후, 파일정리(작업물들)
+
+
+01/09
+- [ ] IOS ch 1
+- [ ] 창업동아리 공지 보고 어케할지 생각하기.
+- [ ] 일자리 플러스 센터 정보 얻어가기
+- [ ] 1~3월까지 캡스톤 팀원 일정들 체크
+
+
+
+5049*
+
+할수있는거 할수없는거 명확하게
+
+
+금,토
+
+
+
+Recycle view , item이 필요하다
+Item XML - > adapter 연결
+
+1. 데이터랑 item 1ㄷ1 연결
+2. List 랑 기능이랑 연결 -> 어댑터
+
+
+# API 연결 예제 코드
+
+1. Recycler View
+
+UMC init 설정
+
+
+
+시험 11시
+
+공학관 411호
+
+다익스트라, 플로이드 신장트리 이후
+
+
+
+https://apis.data.go.kr/
+B551011/PhotoGalleryService1/galleryList1?numOfRows=10&pageNo=1&MobileOS=AND&MobileApp=app&arrange=A&_type=_json&serviceKey=KVLNantZhhbecolXsyBcwYgdnmPDo0poEXjIFRJLMG4adbgyavxDN9aKnwgKfeRsvG46veAKSktHS1e8mI%2FyKQ%3D%3D
+
+
+https://apis.data.go.kr/
+galleryList1?pageNo=10&numOfRows=1&MobileOS=AND&MobileApp=app&arrange=A&_type=_json&serviceKey=KVLNantZhhbecolXsyBcwYgdnmPDo0poEXjIFRJLMG4adbgyavxDN9aKnwgKfeRsvG46veAKSktHS1e8mI%2FyKQ%3D%3D}
+
+하루 일정 트래킹 앱
+코틀린 멀티플랫폼(and ios)
+좀 더 나은 기능들 간펀 추적및 커스텀
+
+배포 및 출시 목표
+디자인 - figma
+서버 - firebase(or Ktor)
+프론트 - 코틀린 멀티플랫폼(and ios)
+(compose)
+
## Barrion
## 목차
- - [개요](#개요)
- - [내용](#내용)
- - [화면](#화면)
- - [개발 환경](#개발환경)
- - [인프라 구조](#인프라구조)
- - [기술 스택](#기술스택)
+- [개요](#개요)
+- [내용](#내용)
+- [화면](#화면)
+- [개발 환경](#개발환경)
+- [인프라 구조](#인프라구조)
+- [기술 스택](#기술스택)
## 개요
- 프로젝트 이름: 배리어프리 스마트 키오스크 솔루션: 베리온(Barion)
@@ -20,26 +89,65 @@
## 개발 환경
-
+
## 인프라 구조
-
+
## 화면
-
+
## 기술스택
-### **🤖** 안드로이드
-| **Category** | **TechStack** |
-| --- | --- |
-| Network | Retrofit, OkHttp, Gson |
-| Service | Service |
-| Asynchronous | Coroutines |
-| Jetpack | DataBinding, Navigation |
-| Image | Glide |
+# 기술 스택 (Tech Stack)
+
+본 자영업자 키오스크 관리 애플리케이션은 다음과 같은 최신 기술 스택을 활용하여 개발되었습니다.
+
+## 아키텍처 & 디자인 패턴
+
+| 기술 | 설명 |
+|------|------|
+| **Clean Architecture** | 비즈니스 로직과 UI를 명확히 분리하여 코드의 유지보수성과 테스트 용이성을 높입니다. 데이터, 도메인, 프레젠테이션 계층으로 구분하여 각 계층의 책임을 명확히 합니다. |
+| **MVI with Orbit** | Model-View-Intent 패턴을 Orbit 라이브러리로 구현하여 단방향 데이터 흐름을 통해 UI 상태를 예측 가능하게 관리합니다. 복잡한 상태 변화를 효율적으로 처리하고 디버깅을 용이하게 합니다. |
+| **멀티모듈 구조** | 앱을 기능별 모듈로 분리하여 개발 효율성과 빌드 속도를 향상시킵니다. 각 모듈은 독립적으로 개발 및 테스트가 가능하며, 코드 재사용성과 유지보수성이 향상됩니다. |
+
+## UI/UX
+
+| 기술 | 설명 |
+|------|------|
+| **Jetpack Compose** | 선언적 UI 툴킷을 사용하여 간결하고 직관적인 UI 개발이 가능합니다. 컴포넌트 기반 접근 방식으로 UI 요소 재사용성이 높아집니다. |
+| **Glassmorphism 디자인** | 투명도와 흐림 효과를 활용한 현대적인 디자인 스타일을 적용하여 직관적이고 시각적으로 매력적인 사용자 경험을 제공합니다. |
+
+## 핵심 기술
+
+| 카테고리 | 기술 | 설명 |
+|---------|------|------|
+| **언어** | Kotlin | 간결한 문법과 널 안전성, 확장 함수 등 현대적 기능을 제공하는 안드로이드 공식 언어입니다. |
+| **의존성 주입** | Hilt | Dagger 기반의 의존성 주입 라이브러리로, 컴포넌트 간 결합도를 낮추고 테스트 용이성을 높입니다. |
+| **네트워크** | Retrofit, OkHttp | REST API 통신을 위한 타입 안전한 HTTP 클라이언트를 제공하며, 인터셉터와 로깅 기능으로 네트워크 요청 관리를 용이하게 합니다. |
+| **비동기 처리** | Coroutines, Flow | 비동기 작업을 직관적으로 처리하고, 반응형 데이터 스트림을 통해 실시간 데이터 변화를 효율적으로 UI에 반영합니다. |
+| **이미지 처리** | Coil | Kotlin Coroutines 기반 이미지 로딩 라이브러리로, 메모리 효율성과 빠른 이미지 로딩을 제공합니다. |
+
+## 개발 프로세스 & 인프라
+
+| 카테고리 | 기술 | 설명 |
+|---------|------|------|
+| **개발 전략** | Git Flow | 체계적인 브랜치 관리 전략을 통해 안정적인 릴리스 관리와 효율적인 팀 협업을 가능하게 합니다. |
+| **CI/CD** | GitHub Actions | 자동화된 빌드, 테스트, 배포 파이프라인을 구축하여 코드 품질을 지속적으로 관리하고 개발 효율성을 높입니다. |
+
+## 데이터 관리
+
+| 기술 | 설명 |
+|------|------|
+| **Room Database** | 로컬 데이터 저장을 위한 SQLite 추상화 라이브러리로, 오프라인 모드에서도 안정적인 데이터 접근을 제공합니다. |
+| **DataStore** | 키-값 쌍 및 타입 안전한 데이터 저장을 위한 현대적인 솔루션으로, 사용자 환경설정 저장에 활용됩니다. |
+
+이러한 기술 스택의 조합을 통해 확장 가능하고, 유지보수가 용이하며, 사용자 경험이 뛰어난 자영업자 키오스크 관리 애플리케이션을 구현했습니다.
+
+
+
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index e7d98e7..7cc318e 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -1,15 +1,13 @@
import java.util.Properties
plugins {
- alias(libs.plugins.android.application)
- alias(libs.plugins.kotlin.android)
- alias(libs.plugins.kotlin.compose)
- alias(libs.plugins.kotlin.serialization)
- alias(libs.plugins.hilt.android)
- alias(libs.plugins.ksp)
- // ktlint 플러그인 제거
- alias(libs.plugins.navigation.safeargs.kotlin)
- id("org.jetbrains.kotlin.kapt")
+ // 커스텀 플러그인 적용
+ id("barrion.android.application")
+ id("barrion.android.application.compose") // 새로운 Compose 플러그인 사용
+ id("org.jetbrains.kotlin.plugin.compose") // Compose 컴파일러 플러그인 추가
+ id("barrion.hilt") // 의존성 주입
+ id("barrion.network") // 네트워킹
+ id("barrion.imageloading") // 이미지 로딩
}
val properties =
@@ -19,7 +17,6 @@ val properties =
android {
namespace = "com.example.barrion"
- compileSdk = 35
defaultConfig {
applicationId = "com.example.barrion"
@@ -27,8 +24,13 @@ android {
targetSdk = 34
versionCode = 1
versionName = "1.0"
+ }
+ buildFeatures {
+ compose = true
+ }
- testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ composeOptions {
+ kotlinCompilerExtensionVersion = "1.5.10" // libs.versions.toml에 정의된 값 또는 직접 명시
}
buildTypes {
@@ -40,6 +42,8 @@ android {
)
}
}
+
+ // Java 버전 오버라이드 (플러그인에서 17 사용, 앱에서 11로 변경)
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
@@ -47,82 +51,275 @@ android {
kotlinOptions {
jvmTarget = "11"
}
+
+ // 빌드 기능 설정 (필요한 경우)
buildFeatures {
viewBinding = true
dataBinding = true
buildConfig = true
}
- buildFeatures {
- compose = true
- }
}
dependencies {
-
- implementation(libs.androidx.core.ktx)
- implementation(libs.androidx.lifecycle.runtime.ktx)
- implementation(libs.androidx.activity.compose)
- implementation(platform(libs.androidx.compose.bom))
- implementation(libs.androidx.ui)
- implementation(libs.androidx.ui.graphics)
- implementation(libs.androidx.ui.tooling.preview)
- implementation(libs.androidx.material3)
- testImplementation(libs.junit)
- androidTestImplementation(libs.androidx.junit)
- androidTestImplementation(libs.androidx.espresso.core)
- androidTestImplementation(platform(libs.androidx.compose.bom))
- androidTestImplementation(libs.androidx.ui.test.junit4)
- debugImplementation(libs.androidx.ui.tooling)
- debugImplementation(libs.androidx.ui.test.manifest)
-
+ // 앱 특화 의존성만 추가 (플러그인에서 처리하지 않는 의존성)
implementation(libs.balloon)
+ implementation(libs.core.splashscreen)
- implementation(libs.androidx.core.ktx)
- implementation(libs.androidx.appcompat)
- implementation(libs.material)
- implementation(libs.androidx.activity)
- implementation(libs.androidx.constraintlayout)
+ // 테스트 의존성 (테스트 플러그인이 없는 경우)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
+}
- implementation(libs.balloon)
-
- // DataStore
- implementation(libs.androidx.datastore.preferences)
- implementation(libs.androidx.datastore.preferences.core)
-
- // Hilt
- implementation(libs.hilt.android)
- ksp(libs.hilt.compiler)
- ksp(libs.hilt.android.compiler)
-
- // Timber
- implementation(libs.timber)
-
- // Glide
- implementation(libs.glide)
- ksp(libs.glide.compiler) // annotationProcessor에서 kapt로 변경
-
- // coil
- implementation(libs.coil)
-
- // ViewPager2
- implementation(libs.androidx.viewpager2)
-
- // navigation
- implementation(libs.bundles.navigation)
-
- // Kotlin Serialization
- implementation(libs.kotlinx.serialization.json)
- // Coroutines
- implementation(libs.kotlinx.coroutines)
+//import java.util.Properties
+//
+//plugins {
+// // 기존 플러그인 유지
+// alias(libs.plugins.android.application)
+// alias(libs.plugins.kotlin.android)
+// alias(libs.plugins.kotlin.compose)
+// alias(libs.plugins.kotlin.serialization)
+// alias(libs.plugins.hilt.android)
+// alias(libs.plugins.ksp)
+// alias(libs.plugins.navigation.safeargs.kotlin)
+// id("org.jetbrains.kotlin.kapt")
+//
+// // 커스텀 플러그인 적용
+// id("barrion.android.application")
+//}
+//
+//val properties =
+// Properties().apply {
+// load(project.rootProject.file("local.properties").inputStream())
+// }
+//
+//android {
+// namespace = "com.example.barrion"
+// compileSdk = 35
+//
+// defaultConfig {
+// applicationId = "com.example.barrion"
+// minSdk = 21
+// targetSdk = 34
+// versionCode = 1
+// versionName = "1.0"
+//
+// testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+// }
+//
+// buildTypes {
+// release {
+// isMinifyEnabled = false
+// proguardFiles(
+// getDefaultProguardFile("proguard-android-optimize.txt"),
+// "proguard-rules.pro"
+// )
+// }
+// }
+// compileOptions {
+// sourceCompatibility = JavaVersion.VERSION_11
+// targetCompatibility = JavaVersion.VERSION_11
+// }
+// kotlinOptions {
+// jvmTarget = "11"
+// }
+// buildFeatures {
+// viewBinding = true
+// dataBinding = true
+// buildConfig = true
+// }
+// buildFeatures {
+// compose = true
+// }
+//}
+//
+//dependencies {
+// // Compose 의존성
+// implementation(libs.androidx.activity.compose)
+// implementation(platform(libs.androidx.compose.bom))
+// implementation(libs.androidx.ui)
+// implementation(libs.androidx.ui.graphics)
+// implementation(libs.androidx.ui.tooling.preview)
+// implementation(libs.androidx.material3)
+// debugImplementation(libs.androidx.ui.tooling)
+// debugImplementation(libs.androidx.ui.test.manifest)
+// androidTestImplementation(platform(libs.androidx.compose.bom))
+// androidTestImplementation(libs.androidx.ui.test.junit4)
+//
+// // 기본 안드로이드 및 UI 의존성
+// implementation(libs.androidx.core.ktx)
+// implementation(libs.androidx.lifecycle.runtime.ktx)
+// implementation(libs.androidx.appcompat)
+// implementation(libs.material)
+// implementation(libs.androidx.activity)
+// implementation(libs.androidx.constraintlayout)
+//
+// // 앱 특화 UI 의존성
+// implementation(libs.balloon)
+// implementation(libs.core.splashscreen)
+//
+// // 데이터 스토리지
+// implementation(libs.androidx.datastore.preferences)
+// implementation(libs.androidx.datastore.preferences.core)
+//
+// // Hilt
+// implementation(libs.hilt.android)
+// ksp(libs.hilt.compiler)
+// ksp(libs.hilt.android.compiler)
+//
+// // 이미지 로딩 (Glide와 Coil)
+// implementation(libs.glide)
+// ksp(libs.glide.compiler)
+// implementation(libs.coil) // 필요하지 않다면 제거 가능
+//
+// // 유틸리티
+// implementation(libs.timber)
+// implementation(libs.androidx.viewpager2)
+//
+// // 네비게이션
+// implementation(libs.bundles.navigation)
+//
+// // 비동기 및 직렬화
+// implementation(libs.kotlinx.serialization.json)
+// implementation(libs.kotlinx.coroutines)
+//
+// // 네트워킹
+// implementation(platform(libs.okhttp.bom))
+// implementation(libs.bundles.retrofit)
+//
+// // 테스트 의존성
+// testImplementation(libs.junit)
+// androidTestImplementation(libs.androidx.junit)
+// androidTestImplementation(libs.androidx.espresso.core)
+//}
- // Network
- implementation(platform(libs.okhttp.bom))
- implementation(libs.bundles.retrofit)
+/* 플러그인 적용 전, 단일모듈 빌드 설정 */
- // splashscreen
- implementation(libs.core.splashscreen)
-}
\ No newline at end of file
+//import java.util.Properties
+//
+//plugins {
+// alias(libs.plugins.android.application)
+// alias(libs.plugins.kotlin.android)
+// alias(libs.plugins.kotlin.compose)
+// alias(libs.plugins.kotlin.serialization)
+// alias(libs.plugins.hilt.android)
+// alias(libs.plugins.ksp)
+// alias(libs.plugins.navigation.safeargs.kotlin)
+// id("org.jetbrains.kotlin.kapt")
+//}
+//
+//val properties =
+// Properties().apply {
+// load(project.rootProject.file("local.properties").inputStream())
+// }
+//
+//android {
+// namespace = "com.example.barrion"
+// compileSdk = 35
+//
+// defaultConfig {
+// applicationId = "com.example.barrion"
+// minSdk = 21
+// targetSdk = 34
+// versionCode = 1
+// versionName = "1.0"
+//
+// testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+// }
+//
+// buildTypes {
+// release {
+// isMinifyEnabled = false
+// proguardFiles(
+// getDefaultProguardFile("proguard-android-optimize.txt"),
+// "proguard-rules.pro"
+// )
+// }
+// }
+// compileOptions {
+// sourceCompatibility = JavaVersion.VERSION_11
+// targetCompatibility = JavaVersion.VERSION_11
+// }
+// kotlinOptions {
+// jvmTarget = "11"
+// }
+// buildFeatures {
+// viewBinding = true
+// dataBinding = true
+// buildConfig = true
+// }
+// buildFeatures {
+// compose = true
+// }
+//}
+//
+//dependencies {
+//
+// implementation(libs.androidx.core.ktx)
+// implementation(libs.androidx.lifecycle.runtime.ktx)
+// implementation(libs.androidx.activity.compose)
+// implementation(platform(libs.androidx.compose.bom))
+// implementation(libs.androidx.ui)
+// implementation(libs.androidx.ui.graphics)
+// implementation(libs.androidx.ui.tooling.preview)
+// implementation(libs.androidx.material3)
+// testImplementation(libs.junit)
+// androidTestImplementation(libs.androidx.junit)
+// androidTestImplementation(libs.androidx.espresso.core)
+// androidTestImplementation(platform(libs.androidx.compose.bom))
+// androidTestImplementation(libs.androidx.ui.test.junit4)
+// debugImplementation(libs.androidx.ui.tooling)
+// debugImplementation(libs.androidx.ui.test.manifest)
+//
+// implementation(libs.balloon)
+//
+// implementation(libs.androidx.core.ktx)
+// implementation(libs.androidx.appcompat)
+// implementation(libs.material)
+// implementation(libs.androidx.activity)
+// implementation(libs.androidx.constraintlayout)
+// testImplementation(libs.junit)
+// androidTestImplementation(libs.androidx.junit)
+// androidTestImplementation(libs.androidx.espresso.core)
+//
+// implementation(libs.balloon)
+//
+// // DataStore
+// implementation(libs.androidx.datastore.preferences)
+// implementation(libs.androidx.datastore.preferences.core)
+//
+// // Hilt
+// implementation(libs.hilt.android)
+// ksp(libs.hilt.compiler)
+// ksp(libs.hilt.android.compiler)
+//
+// // Timber
+// implementation(libs.timber)
+//
+// // Glide
+// implementation(libs.glide)
+// ksp(libs.glide.compiler) // annotationProcessor에서 kapt로 변경
+//
+// // coil
+// implementation(libs.coil)
+//
+// // ViewPager2
+// implementation(libs.androidx.viewpager2)
+//
+// // navigation
+// implementation(libs.bundles.navigation)
+//
+// // Kotlin Serialization
+// implementation(libs.kotlinx.serialization.json)
+//
+// // Coroutines
+// implementation(libs.kotlinx.coroutines)
+//
+// // Network
+// implementation(platform(libs.okhttp.bom))
+// implementation(libs.bundles.retrofit)
+//
+// // splashscreen
+// implementation(libs.core.splashscreen)
+//}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/barrion/MainActivity.kt b/app/src/main/java/com/example/barrion/MainActivity.kt
index b7ab155..fe0aff2 100644
--- a/app/src/main/java/com/example/barrion/MainActivity.kt
+++ b/app/src/main/java/com/example/barrion/MainActivity.kt
@@ -13,8 +13,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.example.barrion.ui.theme.BarrionTheme
-// test plz
-
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
diff --git a/build-logic/convention/.gitignore b/build-logic/convention/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/build-logic/convention/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts
new file mode 100644
index 0000000..38920e9
--- /dev/null
+++ b/build-logic/convention/build.gradle.kts
@@ -0,0 +1,76 @@
+@Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed
+plugins {
+ `kotlin-dsl`
+}
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+}
+
+dependencies {
+ // 버전 카탈로그를 사용한 의존성 추가
+ compileOnly(libs.android.gradlePlugin)
+ compileOnly(libs.kotlin.gradlePlugin)
+ compileOnly(libs.ksp.gradlePlugin)
+
+ // 만약 위 방법이 작동하지 않는다면, 하드코딩된 의존성 사용:
+ // compileOnly("com.android.tools.build:gradle:8.7.3")
+ // compileOnly("org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.0")
+ // compileOnly("com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:2.0.0-1.0.21")
+}
+
+gradlePlugin {
+ plugins {
+ // 기존 플러그인
+ register("androidApplication") {
+ id = "barrion.android.application"
+ implementationClass = "com.example.convention.AndroidApplicationConventionPlugin"
+ }
+
+ // 안드로이드 라이브러리 컨벤션 플러그인 추가
+ register("androidLibrary") {
+ id = "barrion.android.library"
+ implementationClass = "com.example.convention.AndroidLibraryConventionPlugin"
+ }
+
+ // JVM 라이브러리 컨벤션 플러그인 추가 (선택 사항)
+ register("jvmLibrary") {
+ id = "barrion.jvm.library"
+ implementationClass = "com.example.convention.JvmLibraryConventionPlugin"
+ }
+
+ // 피처 모듈 컨벤션 플러그인 추가 (선택 사항)
+ register("androidFeature") {
+ id = "barrion.android.feature"
+ implementationClass = "com.example.convention.FeatureConventionPlugin"
+ }
+
+ // 새로 추가된 플러그인들
+ // 새로운 Compose 플러그인 등록
+ register("androidApplicationCompose") {
+ id = "barrion.android.application.compose"
+ implementationClass = "com.example.convention.AndroidApplicationComposeConventionPlugin"
+ }
+
+ register("androidLibraryCompose") {
+ id = "barrion.android.library.compose"
+ implementationClass = "com.example.convention.AndroidLibraryComposeConventionPlugin"
+ }
+
+ register("hilt") {
+ id = "barrion.hilt"
+ implementationClass = "com.example.convention.HiltConventionPlugin"
+ }
+
+ register("network") {
+ id = "barrion.network"
+ implementationClass = "com.example.convention.NetworkConventionPlugin"
+ }
+
+ register("imageLoading") {
+ id = "barrion.imageloading"
+ implementationClass = "com.example.convention.ImageLoadingConventionPlugin"
+ }
+ }
+}
\ No newline at end of file
diff --git a/build-logic/convention/src/main/java/AndroidApplicationComposeConventionPlugin.kt b/build-logic/convention/src/main/java/AndroidApplicationComposeConventionPlugin.kt
new file mode 100644
index 0000000..2bdd838
--- /dev/null
+++ b/build-logic/convention/src/main/java/AndroidApplicationComposeConventionPlugin.kt
@@ -0,0 +1,33 @@
+package com.example.convention
+
+import com.android.build.api.dsl.ApplicationExtension
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.kotlin.dsl.getByType
+
+/**
+ * 안드로이드 애플리케이션 모듈에 Compose 설정을 적용하는 컨벤션 플러그인
+ * 이 플러그인은 이미 com.android.application 플러그인이 적용된 프로젝트에만 사용해야 함
+ */
+class AndroidApplicationComposeConventionPlugin : Plugin {
+ override fun apply(target: Project) {
+ // 플러그인 적용 시작 로그
+ target.logger.lifecycle("🎨 AndroidApplicationComposeConventionPlugin applied to: ${target.name}")
+ target.logger.lifecycle("ℹ️ Configuring Compose for Android Application module: ${target.name}")
+
+ with(target) {
+ try {
+ // 직접 com.android.application 플러그인 적용 안 함
+ // 대신 이미 적용된 ApplicationExtension을 가져와서 사용
+ val extension = extensions.getByType()
+ configureAndroidCompose(extension)
+ logger.lifecycle("✅ Successfully configured Compose for application module: ${target.name}")
+ } catch (e: Exception) {
+ // 오류 발생 시 로그 출력
+ logger.error("❌ Failed to configure Compose for application module: ${target.name}")
+ logger.error("❌ Error: ${e.message}")
+ throw e
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/build-logic/convention/src/main/java/AndroidBaseConventionPlugin.kt b/build-logic/convention/src/main/java/AndroidBaseConventionPlugin.kt
new file mode 100644
index 0000000..29bfcb9
--- /dev/null
+++ b/build-logic/convention/src/main/java/AndroidBaseConventionPlugin.kt
@@ -0,0 +1,217 @@
+package com.example.convention
+
+import com.android.build.api.dsl.ApplicationExtension
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
+import org.gradle.kotlin.dsl.configure
+import org.gradle.kotlin.dsl.dependencies
+import org.gradle.kotlin.dsl.getByType
+
+/**
+ * 앱 모듈용 기본 컨벤션 플러그인
+ * 다른 특화 플러그인으로 분리된 기능을 제외하고 기본 앱 설정만 담당
+ */
+class AndroidApplicationConventionPlugin : Plugin {
+ override fun apply(target: Project) {
+ // 플러그인이 적용될 때 눈에 띄는 로그 출력
+ target.logger.lifecycle("🟢 ===============================================")
+ target.logger.lifecycle("🟢 AndroidApplicationConventionPlugin applied to: ${target.name}")
+ target.logger.lifecycle("🟢 ===============================================")
+
+ with(target) {
+ with(pluginManager) {
+ apply("com.android.application")
+ apply("org.jetbrains.kotlin.android")
+ apply("androidx.navigation.safeargs.kotlin")
+
+ // 각 플러그인이 적용되었는지 로그로 확인
+ logger.lifecycle("✅ Applied: com.android.application")
+ logger.lifecycle("✅ Applied: org.jetbrains.kotlin.android")
+ logger.lifecycle("✅ Applied: androidx.navigation.safeargs.kotlin")
+ }
+
+ // 버전 카탈로그에 접근
+ val libs = extensions.getByType().named("libs")
+ logger.lifecycle("📚 Accessed version catalog: libs")
+
+ extensions.configure {
+ configureKotlinAndroid(this)
+ logger.lifecycle("⚙️ Configured Kotlin Android settings")
+
+ defaultConfig {
+ applicationId = "com.example.barrion"
+ targetSdk = Const.TARGET_SDK
+ versionCode = 1
+ versionName = "1.0"
+ }
+ logger.lifecycle("📱 Set application default config")
+
+ buildFeatures {
+ viewBinding = true
+ dataBinding = true
+ buildConfig = true
+ }
+ logger.lifecycle("🛠️ Configured build features")
+ }
+
+ // 의존성 추가 시 확인 로그
+ logger.lifecycle("📦 Adding core dependencies...")
+
+ // 앱 모듈 핵심 의존성 추가 (다른 플러그인으로 이동된 의존성 제외)
+ dependencies {
+ // 기본 안드로이드 의존성만 유지
+ add("implementation", libs.findLibrary("androidx-core-ktx").get())
+ add("implementation", libs.findLibrary("androidx-appcompat").get())
+ add("implementation", libs.findLibrary("material").get())
+ add("implementation", libs.findLibrary("androidx-activity").get())
+ add("implementation", libs.findLibrary("androidx-constraintlayout").get())
+ add("implementation", libs.findLibrary("androidx-lifecycle-runtime-ktx").get())
+ add("implementation", libs.findLibrary("timber").get())
+ add("implementation", libs.findLibrary("androidx-viewpager2").get())
+
+ // DataStore 관련 (나중에 별도 플러그인으로 분리 가능)
+ add("implementation", libs.findLibrary("androidx-datastore-preferences").get())
+ add("implementation", libs.findLibrary("androidx-datastore-preferences-core").get())
+ }
+
+ // 플러그인 적용 완료 메시지
+ logger.lifecycle("✅ ===============================================")
+ logger.lifecycle("✅ AndroidBaseConvention successfully applied")
+ logger.lifecycle("✅ ===============================================")
+
+ // 확인용 태스크 추가 (선택 사항)
+ tasks.register("verifyApplicationPlugin") {
+ doLast {
+ logger.lifecycle("🔍 Verifying AndroidApplicationConventionPlugin...")
+ logger.lifecycle("✅ AndroidApplicationConventionPlugin is correctly applied to: ${project.name}")
+ }
+ }
+ }
+ }
+}
+
+
+
+
+//package com.example.convention
+//
+//import com.android.build.api.dsl.ApplicationExtension
+//import org.gradle.api.Plugin
+//import org.gradle.api.Project
+//import org.gradle.api.artifacts.VersionCatalogsExtension
+//import org.gradle.kotlin.dsl.configure
+//import org.gradle.kotlin.dsl.dependencies
+//import org.gradle.kotlin.dsl.getByType
+//
+///**
+// * 앱 모듈용 컨벤션 플러그인
+// */
+//class AndroidApplicationConventionPlugin : Plugin {
+// override fun apply(target: Project) {
+// // 플러그인이 적용될 때 눈에 띄는 로그 출력
+// target.logger.lifecycle("🟢 ===============================================")
+// target.logger.lifecycle("🟢 AndroidApplicationConventionPlugin applied to: ${target.name}")
+// target.logger.lifecycle("🟢 ===============================================")
+//
+// with(target) {
+// with(pluginManager) {
+// apply("com.android.application")
+// apply("org.jetbrains.kotlin.android")
+// apply("org.jetbrains.kotlin.kapt")
+// apply("androidx.navigation.safeargs.kotlin")
+//
+// // 각 플러그인이 적용되었는지 로그로 확인
+// logger.lifecycle("✅ Applied: com.android.application")
+// logger.lifecycle("✅ Applied: org.jetbrains.kotlin.android")
+// logger.lifecycle("✅ Applied: org.jetbrains.kotlin.kapt")
+// logger.lifecycle("✅ Applied: androidx.navigation.safeargs.kotlin")
+// }
+//
+// // 버전 카탈로그에 접근
+// val libs = extensions.getByType().named("libs")
+// logger.lifecycle("📚 Accessed version catalog: libs")
+//
+// extensions.configure {
+// configureKotlinAndroid(this)
+// logger.lifecycle("⚙️ Configured Kotlin Android settings")
+//
+// defaultConfig {
+// applicationId = "com.example.barrion"
+// targetSdk = Const.TARGET_SDK
+// versionCode = 1
+// versionName = "1.0"
+// }
+// logger.lifecycle("📱 Set application default config")
+//
+// buildFeatures {
+// viewBinding = true
+// dataBinding = true
+// buildConfig = true
+// }
+// logger.lifecycle("🛠️ Configured build features")
+// }
+//
+// // 의존성 추가 시 확인 로그
+// logger.lifecycle("📦 Adding dependencies...")
+//
+// // 앱 모듈 공통 의존성 추가
+// dependencies {
+// // 기본 의존성
+// add("implementation", libs.findLibrary("androidx-core-ktx").get())
+// add("implementation", libs.findLibrary("androidx-appcompat").get())
+// add("implementation", libs.findLibrary("material").get())
+// add("implementation", libs.findLibrary("androidx-activity").get())
+// add("implementation", libs.findLibrary("androidx-constraintlayout").get())
+// add("implementation", libs.findLibrary("androidx-datastore-preferences").get())
+// add("implementation", libs.findLibrary("androidx-datastore-preferences-core").get())
+// add("implementation", libs.findLibrary("timber").get())
+// add("implementation", libs.findLibrary("androidx-viewpager2").get())
+// add("implementation", libs.findLibrary("kotlinx-serialization-json").get())
+// add("implementation", libs.findLibrary("kotlinx-coroutines").get())
+//
+// // 네비게이션 번들 사용
+// add("implementation", platform(libs.findLibrary("okhttp-bom").get()))
+//
+// // 번들 접근 방식 수정
+// val navigation = libs.findBundle("navigation")
+// if (navigation.isPresent) {
+// add("implementation", navigation.get())
+// logger.lifecycle("🧩 Added navigation bundle")
+// } else {
+// // 번들이 없을 경우 개별 의존성 추가
+// add("implementation", libs.findLibrary("androidx-navigation-fragment-ktx").get())
+// add("implementation", libs.findLibrary("androidx-navigation-ui-ktx").get())
+// logger.lifecycle("🧩 Added individual navigation dependencies")
+// }
+//
+// // 레트로핏 번들
+// val retrofit = libs.findBundle("retrofit")
+// if (retrofit.isPresent) {
+// add("implementation", retrofit.get())
+// logger.lifecycle("🧩 Added retrofit bundle")
+// } else {
+// // 번들이 없을 경우 개별 의존성 추가
+// add("implementation", libs.findLibrary("retrofit-core").get())
+// add("implementation", libs.findLibrary("retrofit-converter-kotlinx").get())
+// add("implementation", libs.findLibrary("okhttp").get())
+// add("implementation", libs.findLibrary("okhttp-logging").get())
+// logger.lifecycle("🧩 Added individual retrofit dependencies")
+// }
+// }
+//
+// // 플러그인 적용 완료 메시지
+// logger.lifecycle("✅ ===============================================")
+// logger.lifecycle("✅ AndroidApplicationConventionPlugin successfully applied")
+// logger.lifecycle("✅ ===============================================")
+//
+// // 확인용 태스크 추가 (선택 사항)
+// tasks.register("verifyApplicationPlugin") {
+// doLast {
+// logger.lifecycle("🔍 Verifying AndroidApplicationConventionPlugin...")
+// logger.lifecycle("✅ AndroidApplicationConventionPlugin is correctly applied to: ${project.name}")
+// }
+// }
+// }
+// }
+//}
\ No newline at end of file
diff --git a/build-logic/convention/src/main/java/AndroidLibraryComposeConventionPlugin.kt b/build-logic/convention/src/main/java/AndroidLibraryComposeConventionPlugin.kt
new file mode 100644
index 0000000..ae67f36
--- /dev/null
+++ b/build-logic/convention/src/main/java/AndroidLibraryComposeConventionPlugin.kt
@@ -0,0 +1,37 @@
+package com.example.convention
+
+import com.android.build.api.dsl.LibraryExtension
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.kotlin.dsl.getByType
+
+/**
+ * 안드로이드 라이브러리 모듈에 Compose 설정을 적용하는 컨벤션 플러그인
+ * 이 플러그인은 이미 com.android.library 플러그인이 적용된 프로젝트에만 사용해야 함
+ */
+class AndroidLibraryComposeConventionPlugin : Plugin {
+ override fun apply(target: Project) {
+ // 플러그인 적용 시작 로그
+ target.logger.lifecycle("🎨 AndroidLibraryComposeConventionPlugin applied to: ${target.name}")
+ target.logger.lifecycle("ℹ️ Configuring Compose for Android Library module: ${target.name}")
+
+ with(target) {
+ // Kotlin 2.0부터 필요한 Compose 컴파일러 플러그인 추가
+ pluginManager.apply("org.jetbrains.kotlin.plugin.compose")
+ logger.lifecycle("✅ Applied: org.jetbrains.kotlin.plugin.compose")
+
+ try {
+ // 직접 com.android.library 플러그인 적용 안 함
+ // 대신 이미 적용된 LibraryExtension을 가져와서 사용
+ val extension = extensions.getByType()
+ configureAndroidCompose(extension)
+ logger.lifecycle("✅ Successfully configured Compose for library module: ${target.name}")
+ } catch (e: Exception) {
+ // 오류 발생 시 로그 출력
+ logger.error("❌ Failed to configure Compose for library module: ${target.name}")
+ logger.error("❌ Error: ${e.message}")
+ throw e
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/build-logic/convention/src/main/java/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/java/AndroidLibraryConventionPlugin.kt
new file mode 100644
index 0000000..8c70e7a
--- /dev/null
+++ b/build-logic/convention/src/main/java/AndroidLibraryConventionPlugin.kt
@@ -0,0 +1,75 @@
+package com.example.convention
+
+import com.android.build.api.dsl.LibraryExtension
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
+import org.gradle.kotlin.dsl.configure
+import org.gradle.kotlin.dsl.dependencies
+import org.gradle.kotlin.dsl.getByType
+
+/**
+ * 안드로이드 라이브러리 모듈을 위한 컨벤션 플러그인
+ */
+class AndroidLibraryConventionPlugin : Plugin {
+ override fun apply(target: Project) {
+ target.logger.lifecycle("📚 ===============================================")
+ target.logger.lifecycle("📚 AndroidLibraryConventionPlugin applied to: ${target.name}")
+ target.logger.lifecycle("📚 ===============================================")
+
+ with(target) {
+ with(pluginManager) {
+ apply("com.android.library")
+ apply("org.jetbrains.kotlin.android")
+
+ // 각 플러그인이 적용되었는지 로그로 확인
+ logger.lifecycle("✅ Applied: com.android.library")
+ logger.lifecycle("✅ Applied: org.jetbrains.kotlin.android")
+ }
+
+ // 버전 카탈로그에 접근
+ val libs = extensions.getByType().named("libs")
+ logger.lifecycle("📚 Accessed version catalog: libs")
+
+ extensions.configure {
+ configureKotlinAndroid(this)
+ logger.lifecycle("⚙️ Configured Kotlin Android settings")
+
+ defaultConfig {
+ minSdk = Const.MIN_SDK
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles("consumer-rules.pro")
+ }
+ logger.lifecycle("📱 Set library default config")
+
+ buildFeatures {
+ viewBinding = true
+ dataBinding = true
+ buildConfig = true
+ }
+ logger.lifecycle("🛠️ Configured build features")
+ }
+
+ // 의존성 추가 시 확인 로그
+ logger.lifecycle("📦 Adding core dependencies...")
+
+ // 라이브러리 모듈 핵심 의존성 추가
+ dependencies {
+ // 기본 안드로이드 의존성만 유지
+ add("implementation", libs.findLibrary("androidx-core-ktx").get())
+ add("implementation", libs.findLibrary("androidx-appcompat").get())
+ add("implementation", libs.findLibrary("material").get())
+
+ // 테스트 의존성
+ add("testImplementation", libs.findLibrary("junit").get())
+ add("androidTestImplementation", libs.findLibrary("androidx-junit").get())
+ add("androidTestImplementation", libs.findLibrary("androidx-espresso-core").get())
+ }
+
+ // 플러그인 적용 완료 메시지
+ logger.lifecycle("✅ ===============================================")
+ logger.lifecycle("✅ AndroidLibraryConvention successfully applied")
+ logger.lifecycle("✅ ===============================================")
+ }
+ }
+}
\ No newline at end of file
diff --git a/build-logic/convention/src/main/java/FeatureConventionPlugin.kt b/build-logic/convention/src/main/java/FeatureConventionPlugin.kt
new file mode 100644
index 0000000..dede119
--- /dev/null
+++ b/build-logic/convention/src/main/java/FeatureConventionPlugin.kt
@@ -0,0 +1,49 @@
+package com.example.convention
+
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
+import org.gradle.kotlin.dsl.dependencies
+import org.gradle.kotlin.dsl.getByType
+
+/**
+ * 기능(Feature) 모듈을 위한 컨벤션 플러그인
+ */
+class FeatureConventionPlugin : Plugin {
+ override fun apply(target: Project) {
+ target.logger.lifecycle("🧩 FeatureConventionPlugin applied to: ${target.name}")
+
+ with(target) {
+ // 기본 안드로이드 라이브러리 플러그인 적용
+ pluginManager.apply("barrion.android.library")
+
+ // Compose가 필요한 경우 주석 해제
+ // pluginManager.apply("barrion.android.library.compose")
+
+ // 필요한 추가 플러그인 적용 (예: Navigation SafeArgs)
+ pluginManager.apply("androidx.navigation.safeargs.kotlin")
+
+ // 버전 카탈로그 접근
+ val libs = extensions.getByType().named("libs")
+
+ // Feature 모듈 공통 의존성 추가
+ dependencies {
+ // 네비게이션 의존성
+ add("implementation", libs.findLibrary("androidx-navigation-fragment-ktx").get())
+ add("implementation", libs.findLibrary("androidx-navigation-ui-ktx").get())
+
+ // 공통 프로젝트 의존성 추가
+ // 프로젝트 구조에 맞게 수정 필요
+ add("implementation", project(":core:common"))
+ add("implementation", project(":core:ui"))
+
+ // 도메인 및 데이터 레이어 의존성 (필요한 경우)
+ // 프로젝트 구조에 맞게 수정 필요
+ // add("implementation", project(":domain"))
+ // add("implementation", project(":data"))
+ }
+
+ logger.lifecycle("✅ FeatureConventionPlugin successfully applied")
+ }
+ }
+}
\ No newline at end of file
diff --git a/build-logic/convention/src/main/java/HiltConventionPlugin.kt b/build-logic/convention/src/main/java/HiltConventionPlugin.kt
new file mode 100644
index 0000000..74fa56f
--- /dev/null
+++ b/build-logic/convention/src/main/java/HiltConventionPlugin.kt
@@ -0,0 +1,56 @@
+package com.example.convention
+
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
+import org.gradle.kotlin.dsl.dependencies
+import org.gradle.kotlin.dsl.getByType
+
+/**
+ * Hilt 의존성 주입을 위한 컨벤션 플러그인
+ */
+class HiltConventionPlugin : Plugin {
+ override fun apply(target: Project) {
+ // 로그 출력
+ target.logger.lifecycle("💉 ===============================================")
+ target.logger.lifecycle("💉 HiltConventionPlugin applied to: ${target.name}")
+ target.logger.lifecycle("💉 ===============================================")
+
+ with(target) {
+ // 플러그인 적용
+ with(pluginManager) {
+ // 먼저 KSP 플러그인 적용 (중요: ksp 설정을 사용하기 전에 플러그인 먼저 적용)
+ apply("com.google.devtools.ksp")
+ apply("com.google.dagger.hilt.android")
+ apply("org.jetbrains.kotlin.kapt")
+
+ logger.lifecycle("✅ Applied: com.google.devtools.ksp")
+ logger.lifecycle("✅ Applied: com.google.dagger.hilt.android")
+ logger.lifecycle("✅ Applied: org.jetbrains.kotlin.kapt")
+ }
+
+ // 버전 카탈로그 접근
+ val libs = extensions.getByType().named("libs")
+
+ // Hilt 의존성 추가
+ logger.lifecycle("📦 Adding Hilt dependencies...")
+
+ dependencies {
+ add("implementation", libs.findLibrary("hilt-android").get())
+
+ // Hilt에는 kapt와 ksp 둘 다 사용 가능, 둘 중 하나만 선택하는 것이 좋음
+ // 여기서는 ksp를 우선 사용하고, 문제 시 kapt로 전환
+ add("ksp", libs.findLibrary("hilt-compiler").get())
+ add("ksp", libs.findLibrary("hilt-android-compiler").get())
+
+ // kapt는 주석 처리 (필요시 활성화)
+ // add("kapt", libs.findLibrary("hilt-compiler").get())
+ // add("kapt", libs.findLibrary("hilt-android-compiler").get())
+ }
+
+ logger.lifecycle("✅ ===============================================")
+ logger.lifecycle("✅ HiltConventionPlugin successfully applied")
+ logger.lifecycle("✅ ===============================================")
+ }
+ }
+}
\ No newline at end of file
diff --git a/build-logic/convention/src/main/java/ImageLoadingConventionPlugin.kt b/build-logic/convention/src/main/java/ImageLoadingConventionPlugin.kt
new file mode 100644
index 0000000..487d3ef
--- /dev/null
+++ b/build-logic/convention/src/main/java/ImageLoadingConventionPlugin.kt
@@ -0,0 +1,40 @@
+package com.example.convention
+
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
+import org.gradle.kotlin.dsl.dependencies
+import org.gradle.kotlin.dsl.getByType
+
+/**
+ * 이미지 로딩 라이브러리를 위한 컨벤션 플러그인
+ */
+class ImageLoadingConventionPlugin : Plugin {
+ override fun apply(target: Project) {
+ // 로그 출력
+ target.logger.lifecycle("🖼️ ===============================================")
+ target.logger.lifecycle("🖼️ ImageLoadingConventionPlugin applied to: ${target.name}")
+ target.logger.lifecycle("🖼️ ===============================================")
+
+ with(target) {
+ // 버전 카탈로그 접근
+ val libs = extensions.getByType().named("libs")
+
+ // 이미지 로딩 의존성 추가
+ logger.lifecycle("📦 Adding Image Loading dependencies...")
+
+ dependencies {
+ // Glide
+ add("implementation", libs.findLibrary("glide").get())
+ add("ksp", libs.findLibrary("glide-compiler").get())
+
+ // Coil (선택적)
+ add("implementation", libs.findLibrary("coil").get())
+ }
+
+ logger.lifecycle("✅ ===============================================")
+ logger.lifecycle("✅ ImageLoadingConventionPlugin successfully applied")
+ logger.lifecycle("✅ ===============================================")
+ }
+ }
+}
\ No newline at end of file
diff --git a/build-logic/convention/src/main/java/JvmLibraryConventionPlugin.kt b/build-logic/convention/src/main/java/JvmLibraryConventionPlugin.kt
new file mode 100644
index 0000000..1a06031
--- /dev/null
+++ b/build-logic/convention/src/main/java/JvmLibraryConventionPlugin.kt
@@ -0,0 +1,43 @@
+package com.example.convention
+
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.JavaVersion
+import org.gradle.api.plugins.JavaPluginExtension
+import org.gradle.kotlin.dsl.configure
+
+/**
+ * JVM 라이브러리 모듈을 위한 컨벤션 플러그인
+ */
+class JvmLibraryConventionPlugin : Plugin {
+ override fun apply(target: Project) {
+ target.logger.lifecycle("📚 JvmLibraryConventionPlugin applied to: ${target.name}")
+
+ with(target) {
+ // 플러그인 적용
+ pluginManager.apply("java-library")
+ pluginManager.apply("org.jetbrains.kotlin.jvm")
+
+ // Java 버전 설정
+ extensions.configure {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+
+ // Kotlin 설정
+ val kotlinExtension = extensions.findByName("kotlin")
+ if (kotlinExtension != null) {
+ // Kotlin DSL을 사용한 설정
+ project.afterEvaluate {
+ project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java).configureEach {
+ kotlinOptions {
+ jvmTarget = "11"
+ }
+ }
+ }
+ }
+
+ logger.lifecycle("✅ JvmLibraryConventionPlugin successfully applied")
+ }
+ }
+}
\ No newline at end of file
diff --git a/build-logic/convention/src/main/java/NetworkConventionPlugin.kt b/build-logic/convention/src/main/java/NetworkConventionPlugin.kt
new file mode 100644
index 0000000..045e3eb
--- /dev/null
+++ b/build-logic/convention/src/main/java/NetworkConventionPlugin.kt
@@ -0,0 +1,57 @@
+package com.example.convention
+
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
+import org.gradle.kotlin.dsl.dependencies
+import org.gradle.kotlin.dsl.getByType
+
+/**
+ * 네트워크 통신을 위한 컨벤션 플러그인
+ */
+class NetworkConventionPlugin : Plugin {
+ override fun apply(target: Project) {
+ // 로그 출력
+ target.logger.lifecycle("🌐 ===============================================")
+ target.logger.lifecycle("🌐 NetworkConventionPlugin applied to: ${target.name}")
+ target.logger.lifecycle("🌐 ===============================================")
+
+ with(target) {
+ // 플러그인 적용
+ pluginManager.apply("org.jetbrains.kotlin.plugin.serialization")
+ logger.lifecycle("✅ Applied: org.jetbrains.kotlin.plugin.serialization")
+
+ // 버전 카탈로그 접근
+ val libs = extensions.getByType().named("libs")
+
+ // 네트워크 의존성 추가
+ logger.lifecycle("📦 Adding Network dependencies...")
+
+ dependencies {
+ add("implementation", platform(libs.findLibrary("okhttp-bom").get()))
+
+ // 레트로핏 번들
+ val retrofit = libs.findBundle("retrofit")
+ if (retrofit.isPresent) {
+ add("implementation", retrofit.get())
+ logger.lifecycle("🧩 Added retrofit bundle")
+ } else {
+ // 번들이 없을 경우 개별 의존성 추가
+ add("implementation", libs.findLibrary("retrofit-core").get())
+ add("implementation", libs.findLibrary("retrofit-converter-kotlinx").get())
+ add("implementation", libs.findLibrary("okhttp").get())
+ add("implementation", libs.findLibrary("okhttp-logging").get())
+ logger.lifecycle("🧩 Added individual retrofit dependencies")
+ }
+
+ // 직렬화 및 비동기 처리
+ add("implementation", libs.findLibrary("kotlinx-serialization-json").get())
+ add("implementation", libs.findLibrary("kotlinx-coroutines").get())
+ }
+
+ logger.lifecycle("✅ ===============================================")
+ logger.lifecycle("✅ NetworkConventionPlugin successfully applied")
+ logger.lifecycle("✅ ===============================================")
+ }
+ }
+}
\ No newline at end of file
diff --git a/build-logic/convention/src/main/java/com/example/convention/AndroidCompose.kt b/build-logic/convention/src/main/java/com/example/convention/AndroidCompose.kt
new file mode 100644
index 0000000..9bfaf08
--- /dev/null
+++ b/build-logic/convention/src/main/java/com/example/convention/AndroidCompose.kt
@@ -0,0 +1,40 @@
+package com.example.convention
+
+import com.android.build.api.dsl.CommonExtension
+import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
+import org.gradle.kotlin.dsl.dependencies
+import org.gradle.kotlin.dsl.getByType
+
+/**
+ * Compose 설정을 구성하는 유틸리티 함수
+ */
+internal fun Project.configureAndroidCompose(
+ commonExtension: CommonExtension<*, *, *, *, *, *>
+) {
+ val libs = extensions.getByType().named("libs")
+
+ commonExtension.apply {
+ buildFeatures {
+ compose = true
+ }
+
+ composeOptions {
+ kotlinCompilerExtensionVersion = libs.findVersion("compose-compiler").get().requiredVersion
+ }
+ }
+
+ dependencies {
+ val bom = libs.findLibrary("androidx-compose-bom").get()
+ add("implementation", platform(bom))
+ add("implementation", libs.findLibrary("androidx-ui").get())
+ add("implementation", libs.findLibrary("androidx-ui-graphics").get())
+ add("implementation", libs.findLibrary("androidx-ui-tooling-preview").get())
+ add("implementation", libs.findLibrary("androidx-material3").get())
+ add("implementation", libs.findLibrary("androidx-activity-compose").get())
+ add("debugImplementation", libs.findLibrary("androidx-ui-tooling").get())
+ add("debugImplementation", libs.findLibrary("androidx-ui-test-manifest").get())
+ add("androidTestImplementation", platform(bom))
+ add("androidTestImplementation", libs.findLibrary("androidx-ui-test-junit4").get())
+ }
+}
\ No newline at end of file
diff --git a/build-logic/convention/src/main/java/com/example/convention/Const.kt b/build-logic/convention/src/main/java/com/example/convention/Const.kt
new file mode 100644
index 0000000..74ccbee
--- /dev/null
+++ b/build-logic/convention/src/main/java/com/example/convention/Const.kt
@@ -0,0 +1,16 @@
+package com.example.convention
+
+import org.gradle.api.JavaVersion
+
+/**
+ * 프로젝트 전반에서 사용할 공통 상수를 정의하는 객체
+ * 컴파일 SDK, 최소 SDK, 타겟 SDK 및 Java 버전과 같은 설정을 중앙에서 관리
+ */
+
+object Const {
+ const val COMPILE_SDK = 35 // 컴파일 SDK 버전
+ const val MIN_SDK = 21 // 최소 지원 SDK 버전
+ const val TARGET_SDK = 35 // 타겟 SDK 버전
+ val JAVA_VERSION = JavaVersion.VERSION_17 // 사용할 Java 버전
+ const val NAMESPACE_PREFIX = "com.example.barrion" // 패키지명 프리픽스
+}
\ No newline at end of file
diff --git a/build-logic/convention/src/main/java/com/example/convention/KotlinAndroid.kt b/build-logic/convention/src/main/java/com/example/convention/KotlinAndroid.kt
new file mode 100644
index 0000000..5d6aa5c
--- /dev/null
+++ b/build-logic/convention/src/main/java/com/example/convention/KotlinAndroid.kt
@@ -0,0 +1,83 @@
+package com.example.convention
+
+import com.android.build.api.dsl.CommonExtension
+import org.gradle.api.JavaVersion
+import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
+import org.gradle.api.plugins.ExtensionAware
+import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions
+
+/**
+ * 안드로이드 프로젝트의 Kotlin 관련 설정을 구성하는 확장 함수
+ * 애플리케이션 및 라이브러리 모듈에서 재사용 가능
+ * @param commonExtension 안드로이드 빌드 설정을 포함하는 확장 객체
+ */
+internal fun Project.configureKotlinAndroid(
+ commonExtension: CommonExtension<*, *, *, *, *, *>,
+) {
+ // 올바른 방식으로 VersionCatalogsExtension을 가져옴
+ val libs = extensions.getByType(VersionCatalogsExtension::class.java).named("libs")
+
+ commonExtension.apply {
+ // 컴파일 SDK 버전 설정
+ compileSdk = Const.COMPILE_SDK
+
+ defaultConfig {
+ // 최소 SDK 버전 설정
+ minSdk = Const.MIN_SDK
+ // 테스트 인스트루먼테이션 러너 설정
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ // 벡터 드로어블 지원 라이브러리 사용 설정
+ vectorDrawables {
+ useSupportLibrary = true
+ }
+ }
+
+ // 빌드 타입 설정 (release 빌드에 대한 설정)
+ buildTypes {
+ getByName("release") {
+ // 코드 난독화 비활성화 (필요에 따라 활성화할 수 있음)
+ isMinifyEnabled = false
+ // ProGuard 규칙 파일 설정
+ proguardFiles(
+ getDefaultProguardFile("proguard-android-optimize.txt"),
+ "proguard-rules.pro"
+ )
+ }
+ }
+
+ // Java 컴파일 옵션 설정
+ compileOptions {
+ // 소스 및 타겟 호환성을 Java 17로 설정
+ sourceCompatibility = Const.JAVA_VERSION
+ targetCompatibility = Const.JAVA_VERSION
+ }
+
+ // Kotlin 컴파일 옵션 설정 (아래에서 정의된 확장 함수 사용)
+ kotlinOptions {
+ // JVM 타겟을 Java 17로 설정
+ jvmTarget = Const.JAVA_VERSION.toString()
+ }
+
+ // 패키징 옵션 설정
+ packaging {
+ resources {
+ // META-INF의 특정 파일들을 패키징에서 제외
+ // 일반적으로 여러 라이브러리에서 중복되는 라이센스 파일 등을 제외하기 위함
+ excludes += "/META-INF/{AL2.0,LGPL2.1}"
+ }
+ }
+ }
+}
+
+/**
+ * CommonExtension에 대한 확장 함수로, kotlinOptions 설정에 접근할 수 있게 함
+ * CommonExtension은 직접적으로 kotlinOptions를 제공하지 않기 때문에 필요
+ * @param block KotlinJvmOptions를 구성하는 람다 함수
+ */
+internal fun CommonExtension<*, *, *, *, *, *>.kotlinOptions(
+ block: KotlinJvmOptions.() -> Unit
+) {
+ // ExtensionAware 인터페이스를 통해 'kotlinOptions' 확장에 접근하고 구성
+ (this as ExtensionAware).extensions.configure("kotlinOptions", block)
+}
\ No newline at end of file
diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts
new file mode 100644
index 0000000..4b5cb0a
--- /dev/null
+++ b/build-logic/settings.gradle.kts
@@ -0,0 +1,15 @@
+//settings.gradle.kts
+dependencyResolutionManagement {
+ repositories {
+ google()
+ mavenCentral()
+ }
+ versionCatalogs {
+ create("libs") {
+ from(files("../gradle/libs.versions.toml"))
+ }
+ }
+}
+
+rootProject.name = "build-logic"
+include(":convention")
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
index dc780de..cf79183 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -12,5 +12,8 @@ plugins {
alias(libs.plugins.ksp) apply false
alias(libs.plugins.hilt.android) apply false
alias(libs.plugins.navigation.safeargs.kotlin) apply false
+ alias(libs.plugins.jetbrains.kotlin.jvm) apply false
+ alias(libs.plugins.android.library) apply false
+ alias(libs.plugins.kotlin.compose) apply false
// ktlint 플러그인 제거
}
\ No newline at end of file
diff --git a/core/common/.gitignore b/core/common/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/core/common/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts
new file mode 100644
index 0000000..914971f
--- /dev/null
+++ b/core/common/build.gradle.kts
@@ -0,0 +1,7 @@
+plugins {
+ id("barrion.jvm.library")
+}
+
+dependencies {
+ // 모듈 특화 의존성만 추가
+}
\ No newline at end of file
diff --git a/core/common/src/main/java/com/example/common/MyClass.kt b/core/common/src/main/java/com/example/common/MyClass.kt
new file mode 100644
index 0000000..f4eec00
--- /dev/null
+++ b/core/common/src/main/java/com/example/common/MyClass.kt
@@ -0,0 +1,4 @@
+package com.example.common
+
+class MyClass {
+}
\ No newline at end of file
diff --git a/core/ui/.gitignore b/core/ui/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/core/ui/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts
new file mode 100644
index 0000000..3c53d28
--- /dev/null
+++ b/core/ui/build.gradle.kts
@@ -0,0 +1,12 @@
+plugins {
+ id("barrion.android.library")
+ id("barrion.android.library.compose")
+}
+
+android {
+ namespace = "com.example.ui"
+}
+
+dependencies {
+ implementation(project(":core:common"))
+}
\ No newline at end of file
diff --git a/core/ui/consumer-rules.pro b/core/ui/consumer-rules.pro
new file mode 100644
index 0000000..e69de29
diff --git a/core/ui/proguard-rules.pro b/core/ui/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/core/ui/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/core/ui/src/androidTest/java/com/example/ui/ExampleInstrumentedTest.kt b/core/ui/src/androidTest/java/com/example/ui/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..a219abd
--- /dev/null
+++ b/core/ui/src/androidTest/java/com/example/ui/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.example.ui
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.example.ui.test", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/core/ui/src/main/AndroidManifest.xml b/core/ui/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..a5918e6
--- /dev/null
+++ b/core/ui/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/core/ui/src/test/java/com/example/ui/ExampleUnitTest.kt b/core/ui/src/test/java/com/example/ui/ExampleUnitTest.kt
new file mode 100644
index 0000000..0040a3e
--- /dev/null
+++ b/core/ui/src/test/java/com/example/ui/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.example.ui
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/data/.gitignore b/data/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/data/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/data/build.gradle.kts b/data/build.gradle.kts
new file mode 100644
index 0000000..a201e79
--- /dev/null
+++ b/data/build.gradle.kts
@@ -0,0 +1,26 @@
+plugins {
+ id("barrion.android.library")
+ id("barrion.network") // 네트워크 통신 관련
+ id("barrion.hilt") // 의존성 주입 필요한 경우
+}
+
+android {
+ namespace = "com.example.data"
+}
+
+dependencies {
+ // 도메인 모듈 의존성
+ implementation(project(":domain"))
+
+ // SharedPreferences는 Android 기본 라이브러리에 포함되어 있으므로
+ // 따로 의존성을 추가할 필요가 없습니다.
+ // androidx.core:core-ktx는 AndroidLibraryConventionPlugin에서 이미 추가됨
+
+ // 그러나 SharedPreferences를 더 편리하게 사용하기 위한 래퍼 라이브러리를 추가할 수 있습니다.
+ // 예시: PreferenceKTX (옵션)
+ implementation("androidx.preference:preference-ktx:1.2.1")
+
+ // 또는 대안으로 DataStore를 고려할 수도 있습니다.
+ // implementation(libs.androidx.datastore.preferences)
+ // implementation(libs.androidx.datastore.preferences.core)
+}
\ No newline at end of file
diff --git a/data/consumer-rules.pro b/data/consumer-rules.pro
new file mode 100644
index 0000000..e69de29
diff --git a/data/proguard-rules.pro b/data/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/data/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/data/src/androidTest/java/com/example/data/ExampleInstrumentedTest.kt b/data/src/androidTest/java/com/example/data/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..1ea0a20
--- /dev/null
+++ b/data/src/androidTest/java/com/example/data/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.example.data
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.example.data.test", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/data/src/main/AndroidManifest.xml b/data/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..a5918e6
--- /dev/null
+++ b/data/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/data/src/test/java/com/example/data/ExampleUnitTest.kt b/data/src/test/java/com/example/data/ExampleUnitTest.kt
new file mode 100644
index 0000000..8943744
--- /dev/null
+++ b/data/src/test/java/com/example/data/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.example.data
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/domain/.gitignore b/domain/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/domain/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts
new file mode 100644
index 0000000..914971f
--- /dev/null
+++ b/domain/build.gradle.kts
@@ -0,0 +1,7 @@
+plugins {
+ id("barrion.jvm.library")
+}
+
+dependencies {
+ // 모듈 특화 의존성만 추가
+}
\ No newline at end of file
diff --git a/domain/src/main/java/com/example/domain/MyClass.kt b/domain/src/main/java/com/example/domain/MyClass.kt
new file mode 100644
index 0000000..446d8b1
--- /dev/null
+++ b/domain/src/main/java/com/example/domain/MyClass.kt
@@ -0,0 +1,4 @@
+package com.example.domain
+
+class MyClass {
+}
\ No newline at end of file
diff --git a/feature/auth/.gitignore b/feature/auth/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/feature/auth/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/feature/auth/build.gradle.kts b/feature/auth/build.gradle.kts
new file mode 100644
index 0000000..8c5d6fe
--- /dev/null
+++ b/feature/auth/build.gradle.kts
@@ -0,0 +1,14 @@
+plugins {
+ id("barrion.android.feature")
+ // 필요에 따라 추가 플러그인 적용
+ id("barrion.hilt")
+ id("barrion.imageloading")
+}
+
+android {
+ namespace = "com.example.feature.auth" // 각 모듈에 맞는 네임스페이스 사용
+}
+
+dependencies {
+ // 모듈 특화 의존성만 추가
+}
\ No newline at end of file
diff --git a/feature/auth/consumer-rules.pro b/feature/auth/consumer-rules.pro
new file mode 100644
index 0000000..e69de29
diff --git a/feature/auth/proguard-rules.pro b/feature/auth/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/feature/auth/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/feature/auth/src/androidTest/java/com/example/auth/ExampleInstrumentedTest.kt b/feature/auth/src/androidTest/java/com/example/auth/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..734aa6d
--- /dev/null
+++ b/feature/auth/src/androidTest/java/com/example/auth/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.example.auth
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.example.auth.test", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/feature/auth/src/main/AndroidManifest.xml b/feature/auth/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..a5918e6
--- /dev/null
+++ b/feature/auth/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/feature/auth/src/test/java/com/example/auth/ExampleUnitTest.kt b/feature/auth/src/test/java/com/example/auth/ExampleUnitTest.kt
new file mode 100644
index 0000000..1456931
--- /dev/null
+++ b/feature/auth/src/test/java/com/example/auth/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.example.auth
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/feature/menu/.gitignore b/feature/menu/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/feature/menu/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/feature/menu/build.gradle.kts b/feature/menu/build.gradle.kts
new file mode 100644
index 0000000..8c5d6fe
--- /dev/null
+++ b/feature/menu/build.gradle.kts
@@ -0,0 +1,14 @@
+plugins {
+ id("barrion.android.feature")
+ // 필요에 따라 추가 플러그인 적용
+ id("barrion.hilt")
+ id("barrion.imageloading")
+}
+
+android {
+ namespace = "com.example.feature.auth" // 각 모듈에 맞는 네임스페이스 사용
+}
+
+dependencies {
+ // 모듈 특화 의존성만 추가
+}
\ No newline at end of file
diff --git a/feature/menu/consumer-rules.pro b/feature/menu/consumer-rules.pro
new file mode 100644
index 0000000..e69de29
diff --git a/feature/menu/proguard-rules.pro b/feature/menu/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/feature/menu/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/feature/menu/src/androidTest/java/com/example/menu/ExampleInstrumentedTest.kt b/feature/menu/src/androidTest/java/com/example/menu/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..43a259e
--- /dev/null
+++ b/feature/menu/src/androidTest/java/com/example/menu/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.example.menu
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.example.menu.test", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/feature/menu/src/main/AndroidManifest.xml b/feature/menu/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..a5918e6
--- /dev/null
+++ b/feature/menu/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/feature/menu/src/test/java/com/example/menu/ExampleUnitTest.kt b/feature/menu/src/test/java/com/example/menu/ExampleUnitTest.kt
new file mode 100644
index 0000000..5e30b24
--- /dev/null
+++ b/feature/menu/src/test/java/com/example/menu/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.example.menu
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/feature/onboarding/.gitignore b/feature/onboarding/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/feature/onboarding/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/feature/onboarding/build.gradle.kts b/feature/onboarding/build.gradle.kts
new file mode 100644
index 0000000..f17605f
--- /dev/null
+++ b/feature/onboarding/build.gradle.kts
@@ -0,0 +1,14 @@
+plugins {
+ id("barrion.android.feature")
+ // 필요에 따라 추가 플러그인 적용
+ id("barrion.hilt")
+ id("barrion.imageloading")
+}
+
+android {
+ namespace = "com.example.feature.auth" // 각 모듈에 맞는 네임스페이스 사용
+}
+
+dependencies {
+ // 모듈 특화 의존성만 추가
+}
\ No newline at end of file
diff --git a/feature/onboarding/consumer-rules.pro b/feature/onboarding/consumer-rules.pro
new file mode 100644
index 0000000..e69de29
diff --git a/feature/onboarding/proguard-rules.pro b/feature/onboarding/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/feature/onboarding/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/feature/onboarding/src/androidTest/java/com/example/onboarding/ExampleInstrumentedTest.kt b/feature/onboarding/src/androidTest/java/com/example/onboarding/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..e11e74d
--- /dev/null
+++ b/feature/onboarding/src/androidTest/java/com/example/onboarding/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.example.onboarding
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.example.onboarding.test", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/feature/onboarding/src/main/AndroidManifest.xml b/feature/onboarding/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..a5918e6
--- /dev/null
+++ b/feature/onboarding/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/feature/onboarding/src/test/java/com/example/onboarding/ExampleUnitTest.kt b/feature/onboarding/src/test/java/com/example/onboarding/ExampleUnitTest.kt
new file mode 100644
index 0000000..a17795c
--- /dev/null
+++ b/feature/onboarding/src/test/java/com/example/onboarding/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.example.onboarding
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/feature/order/.gitignore b/feature/order/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/feature/order/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/feature/order/build.gradle.kts b/feature/order/build.gradle.kts
new file mode 100644
index 0000000..f17605f
--- /dev/null
+++ b/feature/order/build.gradle.kts
@@ -0,0 +1,14 @@
+plugins {
+ id("barrion.android.feature")
+ // 필요에 따라 추가 플러그인 적용
+ id("barrion.hilt")
+ id("barrion.imageloading")
+}
+
+android {
+ namespace = "com.example.feature.auth" // 각 모듈에 맞는 네임스페이스 사용
+}
+
+dependencies {
+ // 모듈 특화 의존성만 추가
+}
\ No newline at end of file
diff --git a/feature/order/consumer-rules.pro b/feature/order/consumer-rules.pro
new file mode 100644
index 0000000..e69de29
diff --git a/feature/order/proguard-rules.pro b/feature/order/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/feature/order/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/feature/order/src/androidTest/java/com/example/order/ExampleInstrumentedTest.kt b/feature/order/src/androidTest/java/com/example/order/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..a190aaf
--- /dev/null
+++ b/feature/order/src/androidTest/java/com/example/order/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.example.order
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.example.order.test", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/feature/order/src/main/AndroidManifest.xml b/feature/order/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..a5918e6
--- /dev/null
+++ b/feature/order/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/feature/order/src/test/java/com/example/order/ExampleUnitTest.kt b/feature/order/src/test/java/com/example/order/ExampleUnitTest.kt
new file mode 100644
index 0000000..5afe00c
--- /dev/null
+++ b/feature/order/src/test/java/com/example/order/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.example.order
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/feature/sales/.gitignore b/feature/sales/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/feature/sales/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/feature/sales/build.gradle.kts b/feature/sales/build.gradle.kts
new file mode 100644
index 0000000..f17605f
--- /dev/null
+++ b/feature/sales/build.gradle.kts
@@ -0,0 +1,14 @@
+plugins {
+ id("barrion.android.feature")
+ // 필요에 따라 추가 플러그인 적용
+ id("barrion.hilt")
+ id("barrion.imageloading")
+}
+
+android {
+ namespace = "com.example.feature.auth" // 각 모듈에 맞는 네임스페이스 사용
+}
+
+dependencies {
+ // 모듈 특화 의존성만 추가
+}
\ No newline at end of file
diff --git a/feature/sales/consumer-rules.pro b/feature/sales/consumer-rules.pro
new file mode 100644
index 0000000..e69de29
diff --git a/feature/sales/proguard-rules.pro b/feature/sales/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/feature/sales/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/feature/sales/src/androidTest/java/com/example/sales/ExampleInstrumentedTest.kt b/feature/sales/src/androidTest/java/com/example/sales/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..eee2a77
--- /dev/null
+++ b/feature/sales/src/androidTest/java/com/example/sales/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.example.sales
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.example.sales.test", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/feature/sales/src/main/AndroidManifest.xml b/feature/sales/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..a5918e6
--- /dev/null
+++ b/feature/sales/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/feature/sales/src/test/java/com/example/sales/ExampleUnitTest.kt b/feature/sales/src/test/java/com/example/sales/ExampleUnitTest.kt
new file mode 100644
index 0000000..765b7ea
--- /dev/null
+++ b/feature/sales/src/test/java/com/example/sales/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.example.sales
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/feature/staff/.gitignore b/feature/staff/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/feature/staff/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/feature/staff/build.gradle.kts b/feature/staff/build.gradle.kts
new file mode 100644
index 0000000..f17605f
--- /dev/null
+++ b/feature/staff/build.gradle.kts
@@ -0,0 +1,14 @@
+plugins {
+ id("barrion.android.feature")
+ // 필요에 따라 추가 플러그인 적용
+ id("barrion.hilt")
+ id("barrion.imageloading")
+}
+
+android {
+ namespace = "com.example.feature.auth" // 각 모듈에 맞는 네임스페이스 사용
+}
+
+dependencies {
+ // 모듈 특화 의존성만 추가
+}
\ No newline at end of file
diff --git a/feature/staff/consumer-rules.pro b/feature/staff/consumer-rules.pro
new file mode 100644
index 0000000..e69de29
diff --git a/feature/staff/proguard-rules.pro b/feature/staff/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/feature/staff/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/feature/staff/src/androidTest/java/com/example/staff/ExampleInstrumentedTest.kt b/feature/staff/src/androidTest/java/com/example/staff/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..1e8d991
--- /dev/null
+++ b/feature/staff/src/androidTest/java/com/example/staff/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.example.staff
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.example.staff.test", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/feature/staff/src/main/AndroidManifest.xml b/feature/staff/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..a5918e6
--- /dev/null
+++ b/feature/staff/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/feature/staff/src/test/java/com/example/staff/ExampleUnitTest.kt b/feature/staff/src/test/java/com/example/staff/ExampleUnitTest.kt
new file mode 100644
index 0000000..99dd2fc
--- /dev/null
+++ b/feature/staff/src/test/java/com/example/staff/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.example.staff
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index e095787..c2b6db6 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,22 +1,22 @@
[versions]
agp = "8.7.3"
kotlin = "2.0.0"
-coreKtx = "1.15.0"
+coreKtx = "1.16.0"
junit = "4.13.2"
junitVersion = "1.2.1"
espressoCore = "3.6.1"
-lifecycleRuntimeKtx = "2.8.7"
+lifecycleRuntimeKtx = "2.9.0"
activityCompose = "1.10.1"
-composeBom = "2025.02.00"
+composeBom = "2025.05.00"
hilt = "2.55"
ksp = "2.0.0-1.0.21"
-navigation = "2.8.8"
+navigation = "2.9.0"
appcompat = "1.7.0"
material = "1.12.0"
activity = "1.10.1"
constraintlayout = "2.2.1"
balloon = "1.6.12"
-datastore = "1.1.3"
+datastore = "1.1.6"
timber = "5.0.1"
glide = "4.16.0"
coil = "2.7.0"
@@ -28,6 +28,8 @@ okhttp = "4.12.0"
splashscreen = "1.0.1"
moshi = "1.15.1"
converter-moshi = "2.10.0"
+jetbrainsKotlinJvm = "2.0.0"
+compose-compiler = "1.5.10"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
@@ -76,6 +78,12 @@ core-splashscreen = { group = "androidx.core", name = "core-splashscreen", versi
androidx-navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigation" }
androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigation" }
+# gradle-plugins
+android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "agp" }
+kotlin-gradlePlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" }
+ksp-gradlePlugin = { group = "com.google.devtools.ksp", name = "com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" }
+
+
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
@@ -83,9 +91,22 @@ kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "ko
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
+
# ktlint 플러그인 제거
navigation-safeargs-kotlin = { id = "androidx.navigation.safeargs.kotlin", version.ref = "navigation" }
+jetbrains-kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "jetbrainsKotlinJvm" }
+android-library = { id = "com.android.library", version.ref = "agp" }
+
+# 커스텀 Convention 플러그인
+barrion-android-application = { id = "barrion.android.application", version = "unspecified" }
+barrion-android-library = { id = "barrion.android.library", version = "unspecified" }
+barrion-android-compose = { id = "barrion.android.compose", version = "unspecified" }
+barrion-hilt = { id = "barrion.hilt", version = "unspecified" }
+barrion-network = { id = "barrion.network", version = "unspecified" }
+barrion-feature = { id = "barrion.feature", version = "unspecified" }
[bundles]
navigation = ["androidx-navigation-fragment-ktx", "androidx-navigation-ui-ktx"]
-retrofit = ["retrofit-core", "retrofit-converter-kotlinx", "okhttp", "okhttp-logging", "moshi", "moshi-kotlin", "retrofit-converter-moshi"]
\ No newline at end of file
+retrofit = ["retrofit-core", "retrofit-converter-kotlinx", "okhttp", "okhttp-logging", "moshi", "moshi-kotlin", "retrofit-converter-moshi"]
+
+gradle-plugins = ["android-gradlePlugin", "kotlin-gradlePlugin", "ksp-gradlePlugin"]
\ No newline at end of file
diff --git a/presentation/.gitignore b/presentation/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/presentation/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/presentation/build.gradle.kts b/presentation/build.gradle.kts
new file mode 100644
index 0000000..0734033
--- /dev/null
+++ b/presentation/build.gradle.kts
@@ -0,0 +1,43 @@
+ plugins {
+ alias(libs.plugins.android.library)
+ alias(libs.plugins.kotlin.android)
+ }
+
+ android {
+ namespace = "com.example.presentation"
+ compileSdk = 34
+
+ defaultConfig {
+ minSdk = 24
+
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles("consumer-rules.pro")
+ }
+
+ buildTypes {
+ release {
+ isMinifyEnabled = false
+ proguardFiles(
+ getDefaultProguardFile("proguard-android-optimize.txt"),
+ "proguard-rules.pro"
+ )
+ }
+ }
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+ kotlinOptions {
+ jvmTarget = "11"
+ }
+ }
+
+ dependencies {
+
+ implementation(libs.androidx.core.ktx)
+ implementation(libs.androidx.appcompat)
+ implementation(libs.material)
+ testImplementation(libs.junit)
+ androidTestImplementation(libs.androidx.junit)
+ androidTestImplementation(libs.androidx.espresso.core)
+ }
\ No newline at end of file
diff --git a/presentation/consumer-rules.pro b/presentation/consumer-rules.pro
new file mode 100644
index 0000000..e69de29
diff --git a/presentation/proguard-rules.pro b/presentation/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/presentation/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/presentation/src/androidTest/java/com/example/presentation/ExampleInstrumentedTest.kt b/presentation/src/androidTest/java/com/example/presentation/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..dfa60bd
--- /dev/null
+++ b/presentation/src/androidTest/java/com/example/presentation/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.example.presentation
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.example.presentation.test", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/presentation/src/main/AndroidManifest.xml b/presentation/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..a5918e6
--- /dev/null
+++ b/presentation/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/presentation/src/test/java/com/example/presentation/ExampleUnitTest.kt b/presentation/src/test/java/com/example/presentation/ExampleUnitTest.kt
new file mode 100644
index 0000000..8ed8b27
--- /dev/null
+++ b/presentation/src/test/java/com/example/presentation/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.example.presentation
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 002d0ab..c05c864 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -1,23 +1,56 @@
+// Gradle 플러그인 관리 설정 (빌드 초기 단계에서 처리됨)
pluginManagement {
+ // build-logic 디렉토리를 복합 빌드로 포함
+ // 이를 통해 build-logic에서 정의한 Convention 플러그인을 프로젝트에서 사용 가능
+ includeBuild("build-logic")
+
+ // 플러그인을 찾을 저장소 설정
repositories {
+ // Google 저장소 - 특정 그룹만 포함하도록 제한
google {
content {
- includeGroupByRegex("com\\.android.*")
- includeGroupByRegex("com\\.google.*")
- includeGroupByRegex("androidx.*")
+ includeGroupByRegex("com\\.android.*") // Android 플러그인
+ includeGroupByRegex("com\\.google.*") // Google 플러그인
+ includeGroupByRegex("androidx.*") // AndroidX 플러그인
}
}
- mavenCentral()
- gradlePluginPortal()
+ mavenCentral() // Maven Central 저장소
+ gradlePluginPortal() // Gradle 플러그인 포털
}
}
+
+// 의존성 해결 방법 관리 설정
dependencyResolutionManagement {
+ // 프로젝트별 저장소 설정을 금지하고 이 설정만 사용하도록 강제
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+
+ // 의존성을 찾을 저장소 설정
repositories {
- google()
- mavenCentral()
+ google() // Android/Google 라이브러리용
+ mavenCentral() // 대부분의 오픈소스 라이브러리용
}
}
+// 루트 프로젝트 이름 설정
rootProject.name = "Barrion"
-include(":app")
+
+// 프로젝트에 포함할 모듈 정의
+include(":app") // 앱 모듈 (애플리케이션 진입점)
+include(":domain") // 도메인 모듈 (비즈니스 로직, 엔티티)
+include(":data") // 데이터 모듈 (저장소, API 통신)
+include(":presentation") // 프레젠테이션 모듈 (UI 공통 로직)
+
+// 코어 모듈 (여러 모듈에서 공유되는 기능)
+include(":core:ui") // UI 공통 요소 (컴포넌트, 테마)
+include(":core:common") // 공통 유틸리티, 확장 함수 등
+
+// 기능별 모듈
+include(":feature:auth") // 인증 기능
+include(":feature:onboarding") // 온보딩 기능
+include(":feature:sales") // 매출 관리 기능
+include(":feature:menu") // 메뉴 관리 기능
+include(":feature:order") // 주문 관리 기능
+include(":feature:staff") // 직원 관리 기능
+
+// build-logic:convention은 복합 빌드로 포함되었으므로 include에서 제외
+//include(":build-logic:convention")
\ No newline at end of file