Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
abd9a43
[NDGL-12] chore: 중복되는 의존성 제거
mj010504 Jan 15, 2026
a02ddec
[NDGL-12] feature: BaseContract, BaseViewModel 제작
mj010504 Jan 16, 2026
8c28b89
[NDGL-12] chore: BaseViewModel 활용 TravelScreen -> TravelDetailScreen …
mj010504 Jan 16, 2026
8d8295a
[NDGL-12] chore: 불필요한 import 제거
mj010504 Jan 17, 2026
4c427ae
[NDGL-12] fix: BaseViewModel reduce 로직 수정
mj010504 Jan 17, 2026
03d04db
[NDGL-12] chore: screen, preview에 private 접근자 추가
mj010504 Jan 18, 2026
ef05712
[NDGL-12] chore: intent 네이밍 수정
mj010504 Jan 18, 2026
949dc88
[NDGL-12] chore: collectAsState 추가 및 collectSideEffect 멤버함수로 변경
mj010504 Jan 18, 2026
09e1549
[NDGL-12] chore: intent 네이밍 방식 수정
mj010504 Jan 23, 2026
9debc34
[NDGL-16] chore: detekt, ktlint 추가
mj010504 Jan 18, 2026
8401319
[NDGL-16] chore: build-logic 구조 수정
mj010504 Jan 19, 2026
a97bc22
[NDGL-16] chore: KotlinLibraryPlugin에도 detekt 적용
mj010504 Jan 19, 2026
0968f61
[NDGL-16] chore: android_ci.yml 파일 추가
mj010504 Jan 19, 2026
2279fed
[NDGL-16] chore: detekt 적용
mj010504 Jan 22, 2026
f768925
[NDGL-16] chore: ktlint 버전 변경 및 ktlintFormat 적용
mj010504 Jan 23, 2026
72b96c0
[NDGL-16] docs: ci 파일 수정
mj010504 Jan 23, 2026
a9b729a
[NDGL-16] docs: detekt-config.yml 패키지 네이밍 패턴 수정
mj010504 Jan 23, 2026
6839670
[NDGL-16] chore: detekt, ktlint 적용
mj010504 Jan 24, 2026
6e8871e
Merge branch 'develop' into chore/NDGL-16
mj010504 Jan 24, 2026
5b19517
[NDGL-16] chore: ktlintFormat 적용
mj010504 Jan 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .claude/settings.local.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"permissions": {
"allow": [
"Bash(git add:*)",
"Bash(git rebase:*)",
"Bash(git fetch:*)"
]
}
Comment on lines +1 to +8
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# 확인할 사항들
echo "=== .claude 디렉토리 구조 ==="
find .claude -type f 2>/dev/null | head -20

echo "=== .gitignore에서 .local 관련 항목 ==="
if [ -f .gitignore ]; then
  grep -i "local\|\.claude" .gitignore || echo "관련 항목 없음"
fi

echo "=== settings 관련 파일 확인 ==="
find . -name "*settings*" -type f 2>/dev/null | grep -v node_modules | head -20

echo "=== .claude 디렉토리 전체 파일 ==="
ls -la .claude 2>/dev/null || echo ".claude 디렉토리 없음"

Repository: YAPP-Github/27th-App-Team-1-Android

Length of output: 688


.claude/settings.local.json의 용도 명확히 필요

파일명의 "local" 접미사는 로컬 전용 설정을 의미하나, 현재 커밋되어 있어 프로젝트 관례와 불일치합니다. 다음 중 하나로 정리를 권장합니다:

  • 로컬 전용이면: .gitignore에 추가
  • 팀 공유 설정이면: settings.json으로 명명 변경 또는 공유/로컬 버전 분리
🤖 Prompt for AI Agents
In @.claude/settings.local.json around lines 1 - 8, The file
.claude/settings.local.json contains local-only settings (the permissions.allow
array) but is committed; decide whether this should be local-only or shared: if
local-only, remove it from the repository and add .claude/settings.local.json to
.gitignore (preserve the permissions.allow content locally before removing); if
intended to be shared, rename to .claude/settings.json (or split into
settings.json + settings.local.json pattern) and commit the shared file,
ensuring the permissions.allow entries are kept in the shared settings and any
local overrides are moved to an ignored local file.

}
14 changes: 14 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
root = true

[*]
charset = utf-8
indent_size = 4
indent_style = space
max_line_length = 150
insert_final_newline = true
trim_trailing_whitespace = true

[*.{kt,kts}]
ij_kotlin_allow_trailing_comma = true
ij_kotlin_allow_trailing_comma_on_call_site = true
ktlint_function_naming_ignore_when_annotated_with = Composable
37 changes: 37 additions & 0 deletions .github/workflows/android_ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: Android CI

on:
push:
branches: [ "develop" ]
pull_request:
branches: [ "develop" ]

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
with:
gradle-home-cache-cleanup: true

- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Set up local.properties
run: echo "${{ secrets.LOCAL_PROPERTIES }}" > local.properties

- name: Code style checks
run: ./gradlew ktlintCheck detekt

- name: Run build
run: ./gradlew assembleDebug --stacktrace
6 changes: 6 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ plugins {

android {
namespace = Configuration.APPLICATION_ID

buildTypes {
release {
isMinifyEnabled = true
}
}
Comment on lines +8 to +12
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot Jan 23, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

release 빌드에 ProGuard 설정이 누락되었습니다.

isMinifyEnabled = true를 설정했지만 ProGuard 파일이 지정되지 않았습니다. KotlinAndroid.kt에서 base 설정으로 isMinifyEnabled = false와 proguard 파일을 정의하고 있는데, 여기서 isMinifyEnabled = true로 override하면서 proguard 파일 설정이 누락되면 릴리스 빌드 시 필요한 코드가 제거될 수 있습니다.

🔧 ProGuard 파일 추가 제안
     buildTypes {
         release {
             isMinifyEnabled = true
+            proguardFiles(
+                getDefaultProguardFile("proguard-android-optimize.txt"),
+                "proguard-rules.pro",
+            )
         }
     }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
buildTypes {
release {
isMinifyEnabled = true
}
}
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro",
)
}
}
🤖 Prompt for AI Agents
In `@app/build.gradle.kts` around lines 8 - 12, The release build sets
isMinifyEnabled = true but does not specify ProGuard rules; update the
buildTypes { release { ... } } block to include proguardFiles so the release
minification uses the standard Android proguard file and your project rules
(e.g., add a call to
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro")). Ensure this is placed alongside the existing
isMinifyEnabled = true in the release block so required classes are kept during
minification.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Project.configureKotlinAndroid()에 포함되어 있음

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check the content of KotlinAndroid.kt to verify ProGuard configuration
cat build-logic/src/main/kotlin/convention/KotlinAndroid.kt

Length of output: 2093


@mj010504 맞습니다! 확인해보니 Project.configureKotlinAndroid()에서 이미 ProGuard 설정이 포함되어 있네요:

buildTypes {
    getByName("release") {
        isMinifyEnabled = false
        proguardFiles(
            getDefaultProguardFile("proguard-android-optimize.txt"),
            "proguard-rules.pro",
        )
    }
}

기본 설정에서 ProGuard 파일이 지정되어 있고, app/build.gradle.kts에서는 isMinifyEnabledtrue로 override하는 것이므로 문제없습니다. 제 리뷰 코멘트가 잘못되었습니다. 설명해주셔서 감사합니다! 🙏

  (\__/)
  (•ᴗ•)
  />📚 Learning noted!

✏️ Learnings added
Learnt from: mj010504
Repo: YAPP-Github/27th-App-Team-1-Android PR: 7
File: app/build.gradle.kts:8-12
Timestamp: 2026-01-23T07:56:13.976Z
Learning: In the Android project using build-logic convention plugins, the `configureKotlinAndroid()` function in `build-logic/src/main/kotlin/convention/KotlinAndroid.kt` already configures ProGuard files for the release buildType. Individual modules can override just `isMinifyEnabled` without needing to re-specify the ProGuard files.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

}

dependencies {
Expand Down
1 change: 0 additions & 1 deletion app/src/main/java/com/yapp/ndgl/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,3 @@ class MainActivity : ComponentActivity() {
}
}
}

2 changes: 0 additions & 2 deletions app/src/main/java/com/yapp/ndgl/navigation/BottomNavTab.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.yapp.ndgl.navigation

import androidx.annotation.DrawableRes
import com.yapp.ndgl.navigation.Route
import com.yapp.ndgl.core.ui.R

enum class BottomNavTab(
Expand All @@ -24,5 +23,4 @@ enum class BottomNavTab(
label = "여행",
route = Route.Travel,
),
;
}
8 changes: 4 additions & 4 deletions app/src/main/java/com/yapp/ndgl/ui/BottomNavigationBar.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ import com.yapp.ndgl.navigation.Route

@Composable
internal fun BottomNavigationBar(
currentTab : Route,
onTabSelected : (Route) -> Unit,
currentTab: Route,
onTabSelected: (Route) -> Unit,
) {
// FIXME 네비게이션 바 디자인 수정 및 추상화
NavigationBar {
Expand All @@ -24,10 +24,10 @@ internal fun BottomNavigationBar(
icon = {
Icon(
imageVector = ImageVector.vectorResource(id = topLevelRoute.icon),
contentDescription = topLevelRoute.label
contentDescription = topLevelRoute.label,
)
},
label = { Text(text = topLevelRoute.label) }
label = { Text(text = topLevelRoute.label) },
)
}
}
Expand Down
11 changes: 6 additions & 5 deletions app/src/main/java/com/yapp/ndgl/ui/NDGLApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,20 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.ui.NavDisplay
import com.yapp.ndgl.feature.travelhelper.navigation.travelHelperEntry
import com.yapp.ndgl.feature.home.navigation.homeEntry
import com.yapp.ndgl.feature.travel.navigation.travelEntry
import com.yapp.ndgl.feature.travelhelper.navigation.travelHelperEntry
import com.yapp.ndgl.navigation.BottomNavTab
import com.yapp.ndgl.navigation.Navigator
import com.yapp.ndgl.navigation.Route
import com.yapp.ndgl.navigation.rememberNavigationState
import com.yapp.ndgl.navigation.toEntries
import com.yapp.ndgl.feature.travel.navigation.travelEntry

@Composable
fun NDGLApp() {
val navigationState = rememberNavigationState(
startRoute = Route.Home, topLevelKeys = BottomNavTab.entries.map { it.route }.toSet(),
startRoute = Route.Home,
topLevelKeys = BottomNavTab.entries.map { it.route }.toSet(),
)
val navigator = remember { Navigator(navigationState) }

Expand All @@ -31,7 +32,8 @@ fun NDGLApp() {
travelHelperEntry(navigator)
}

val shouldShowBottomBar = remember(navigationState.currentKey) { navigationState.currentKey in navigationState.topLevelKeys }
val shouldShowBottomBar =
remember(navigationState.currentKey) { navigationState.currentKey in navigationState.topLevelKeys }

Scaffold(
modifier = Modifier.fillMaxSize(),
Expand All @@ -55,4 +57,3 @@ fun NDGLApp() {
)
}
}

4 changes: 2 additions & 2 deletions build-logic/src/main/kotlin/NDGLAndroidLibraryPlugin.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import convention.configureComposeAndroid
import convention.configureFirebase
import extensions.configureAndroidLibrary
import convention.configureKotlinAndroid
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies
Expand All @@ -13,7 +13,7 @@ class NDGLAndroidLibraryPlugin : Plugin<Project> {
apply("org.jetbrains.kotlin.android")
}

configureAndroidLibrary()
configureKotlinAndroid()
configureFirebase()
configureComposeAndroid()

Expand Down
2 changes: 0 additions & 2 deletions build-logic/src/main/kotlin/NDGLApplicationPlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import convention.configureComposeAndroid
import convention.configureHiltAndroid
import convention.configureKotlinAndroid
import convention.configureTimber
import extensions.configureAndroidApplication
import org.gradle.api.Plugin
import org.gradle.api.Project

Expand All @@ -13,7 +12,6 @@ class NDGLApplicationPlugin : Plugin<Project> {
}

configureKotlinAndroid()
configureAndroidApplication()
configureHiltAndroid()
configureTimber()
configureComposeAndroid()
Expand Down
2 changes: 0 additions & 2 deletions build-logic/src/main/kotlin/NDGLDataPlugin.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import convention.configureCoroutineAndroid
import convention.configureHiltAndroid
import convention.configureKotlinAndroid
import extensions.configureAndroidLibrary
import org.gradle.api.Plugin
import org.gradle.api.Project

Expand All @@ -12,7 +11,6 @@ class NDGLDataPlugin : Plugin<Project> {
}

configureKotlinAndroid()
configureAndroidLibrary()
configureHiltAndroid()
configureCoroutineAndroid()
}
Expand Down
7 changes: 1 addition & 6 deletions build-logic/src/main/kotlin/NDGLFeaturePlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import convention.configureComposeAndroid
import convention.configureCoroutineAndroid
import convention.configureFirebase
import convention.configureHiltAndroid
import extensions.configureAndroidLibrary
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies
Expand All @@ -11,14 +10,10 @@ import util.libs
class NDGLFeaturePlugin : Plugin<Project> {
override fun apply(target: Project): Unit = with(target) {
with(pluginManager) {
apply("com.android.library")
apply("org.jetbrains.kotlin.android")
apply("ndgl.android.library")
}

configureAndroidLibrary()
configureHiltAndroid()
configureFirebase()
configureComposeAndroid()
configureCoroutineAndroid()

dependencies {
Expand Down
26 changes: 24 additions & 2 deletions build-logic/src/main/kotlin/NDGLKotlinLibraryPlugin.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,35 @@

import extensions.configureKotlinJvm
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.dependencies
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
import util.libs

class NDGLKotlinLibraryPlugin : Plugin<Project> {
override fun apply(target: Project): Unit = with(target) {
with(pluginManager) {
apply("org.jetbrains.kotlin.jvm")
}

configureKotlinJvm()

dependencies {
"detektPlugins"(libs.findLibrary("detekt.formatting").get())
}
}
}

internal fun Project.configureKotlinJvm() {
extensions.configure<JavaPluginExtension> {
sourceCompatibility = Configuration.JAVA_VERSION
targetCompatibility = Configuration.JAVA_VERSION
}

extensions.configure<KotlinJvmProjectExtension> {
compilerOptions {
jvmTarget.set(JvmTarget.fromTarget(Configuration.JVM_TARGET))
}
}
}
12 changes: 11 additions & 1 deletion build-logic/src/main/kotlin/convention/KotlinAndroid.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,15 @@ internal fun Project.configureKotlinAndroid() {
defaultConfig {
minSdk = Configuration.MIN_SDK
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro",
)
}
}
compileOptions {
sourceCompatibility = Configuration.JAVA_VERSION
targetCompatibility = Configuration.JAVA_VERSION
Expand All @@ -39,6 +48,7 @@ internal fun Project.configureKotlinAndroid() {

dependencies {
"coreLibraryDesugaring"(libs.findLibrary("android.desugarJdkLibs").get())
"detektPlugins"(libs.findLibrary("detekt.formatting").get())
}
}

Expand All @@ -51,7 +61,7 @@ internal fun Project.configureKotlin() {
freeCompilerArgs.set(
freeCompilerArgs.get() + listOf(
"-opt-in=kotlin.RequiresOptIn",
)
),
)
}
}
Expand Down
88 changes: 0 additions & 88 deletions build-logic/src/main/kotlin/extensions/ProjectExtensions.kt

This file was deleted.

Loading