Skip to content

Conversation

@kimjeakwan
Copy link
Collaborator

@kimjeakwan kimjeakwan commented Mar 7, 2025

๐Ÿ’ก ๊ฐœ์š”

๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ, ํŒŒ์ผ๊ตฌ์กฐ ๋ณ€๊ฒฝ,์ฝ”๋“œ ์ปจ๋ฒค์…˜์— ๋งž๊ฒŒ ๋ณ€๊ฒฝ, Doma Navbar๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค,

๐Ÿ“ƒ ์ž‘์—…๋‚ด์šฉ

๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ PostDemeritSearchScreen ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ ,
๊ถŒํ•œ ๋ณ‘๊ฒฝ์„ ์œ„ํ•ด AdminAPI ์— ๊ถŒํ•œ๋ณ€๊ฒฝ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์„ ๋ฐฐ๋‹˜๋“ค์ด ์ฝ”๋“œ๋ฆฌ๋ทฐํ•ด์ฃผ์‹  ํŒŒ์ผ๊ตฌ์กฐ ๋ณ€๊ฒฝ ๋ฐ ๋„ค์ด๋ฐ์„ ๋ฆฌํŽ™ํ† ๋ง ํ–ˆ์Šต๋‹ˆ๋‹ค. DomaNavbar ๋ฅผ ์œ„ํ•œ combinnavgation ๋ฐ combinview ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค

๐Ÿ”€ ๋ณ€๊ฒฝ์‚ฌํ•ญ

Admin API ๊ถŒํ•œ๋ณ€๊ฒฝ API ์ถ”๊ฐ€, AutrityRequest ์ถ”๊ฐ€, ChangeAuthorityUseCase ์ถ”๊ฐ€, CombinationViewNavgation ์ถ”๊ฐ€, DoMaCombinatinView ์ถ”๊ฐ€, DOmaSearchTextField ์ถ”๊ฐ€, GetStudentSearchUseCase ์ถ”๊ฐ€ LocalDatasource ์—
ROle ์ถ”๊ฐ€, PostDemeirComponent ์ถ”๊ฐ€ , ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ SearchEmptyText ์ถ”๊ฐ€
MainScreen์— scrollState ๋ฅผ ์ƒํƒœํ˜ธ์ด์ŠคํŒ…

๐Ÿ™‹โ€โ™‚๏ธ ์งˆ๋ฌธ์‚ฌํ•ญ

  • ๊ฐœ์„ ํ•  ์ , ์˜คํƒ€, ์ฝ”๋“œ์— ์ด์‚ฐํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด Comment ๋‹ฌ์•„์ฃผ์„ธ์š”.

๐Ÿด ์‚ฌ์šฉ๋ฐฉ๋ฒ•

๐ŸŽธ ๊ธฐํƒ€

Summary by CodeRabbit

  • ์‹ ๊ทœ ๊ธฐ๋Šฅ

    • ์ƒˆ๋กœ์šด ๊ฒ€์ƒ‰ ๋ฐ ํ•™์ƒ ๋ฒŒ์  ๊ด€๋ฆฌ ํ™”๋ฉด๊ณผ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ถ”๊ฐ€๋˜์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ํ•™์ƒ ์ •๋ณด๋ฅผ ์‰ฝ๊ฒŒ ์กฐํšŒํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐ”์™€ ์กฐํ•ฉ ๋ทฐ ๋“ฑ ์ฃผ์š” UI ์š”์†Œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์–ด ์•ฑ ์ „๋ฐ˜์˜ ์ธํ„ฐ๋ž™์…˜ ๋ฐ ๋””์ž์ธ์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฆฌํŒฉํ† ๋ง ๋ฐ ์œ ์ง€ ๋ณด์ˆ˜

    • ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๊ด€๋ฆฌ ๋ฐ ์ธ์ฆ ๊ด€๋ จ ๊ธฐ๋Šฅ์ด ๊ฐ•ํ™”๋˜์—ˆ์œผ๋ฉฐ, ํ† ํฐ ๊ฐฑ์‹  ํ”„๋กœ์„ธ์Šค ์•ˆ์ •์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์ „๋ฐ˜์ ์ธ ์ฝ”๋“œ ๊ตฌ์กฐ ์ •๋ฆฌ์™€ ๋””์ž์ธ ๋ฆฌ์†Œ์Šค ์—…๋ฐ์ดํŠธ๋กœ ์„ฑ๋Šฅ๊ณผ ์ผ๊ด€์„ฑ์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 13

๐Ÿ”ญ Outside diff range comments (3)
presentation/src/main/java/view/mypage/navigation/MyPageNavigation.kt (1)

1-11: โš ๏ธ Potential issue

NavGraphBuilder ํ™•์žฅ ํ•จ์ˆ˜๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ์— NavGraphBuilder์˜ ํ™•์žฅ ํ•จ์ˆ˜๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. AI ์š”์•ฝ์— ๋”ฐ๋ฅด๋ฉด ์ด์ „ ๋ฒ„์ „์˜ ํŒŒ์ผ์—๋Š” NavGraphBuilder.MyScreen() ํ•จ์ˆ˜๊ฐ€ ์žˆ์—ˆ์œผ๋‚˜ ํ˜„์žฌ ๋ฒ„์ „์—๋Š” ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด์„ ์ •์˜ํ•˜๋Š” ์ด ํ•จ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ธฐ๋Šฅ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด MyScreen ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

import androidx.compose.runtime.Composable
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import view.mypage.MyPageScreen

fun NavGraphBuilder.MyScreen(
    navigationBack: () -> Unit,
    onErrorToast: (throwable: Throwable?, message: Int?) -> Unit
) {
    composable(route = MyPage_route) {
        MyPageScreen(
            navigationBack = navigationBack,
            onErrorToast = onErrorToast
        )
    }
}
presentation/src/main/java/viewModel/admin/AdminViewModel.kt (2)

1-136: โš ๏ธ Potential issue

getStudentSearch ๋ฉ”์†Œ๋“œ ๋ˆ„๋ฝ

AdminRepository์—์„œ getUsersName์ด getStudentSearch๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”๋ฐ, ์ด ViewModel์—์„œ๋Š” ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•ด getStudentSearch ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด getStudentSearch ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

+    internal fun getStudentSearch(name: String) = viewModelScope.launch {
+        getAdminUsersUseCase.getStudentSearch(name)
+            .asResult()
+            .collectLatest { result ->
+                when (result) {
+                    is until.Result.Success -> {
+                        _getUserNameUiState.value = GetUserNameUiState.Success(result.data)
+                    }
+
+                    is until.Result.Loading -> {
+                        _getUserNameUiState.value = GetUserNameUiState.Loading
+                    }
+
+                    is until.Result.Error -> {
+                        _getUserNameUiState.value = GetUserNameUiState.Fail
+                    }
+                }
+            }
+    }

40-44: ๐Ÿ’ก Verification agent

๐Ÿงฉ Analysis chain

๋ฏธ์‚ฌ์šฉ ์ƒํƒœ ํ™•์ธ ํ•„์š”

getUsersName ๋ฉ”์†Œ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์ง€๋งŒ, ๊ด€๋ จ ์ƒํƒœ ํ•„๋“œ์ธ _getUserNameUiState์™€ getUserNameUiState๋Š” ์—ฌ์ „ํžˆ ์œ ์ง€๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


๐Ÿ Script executed:

#!/bin/bash
# getUserNameUiState ์ƒํƒœ๊ฐ€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ฐธ์กฐ๋˜๋Š”์ง€ ํ™•์ธ
rg "getUserNameUiState" --type kotlin

Length of output: 354


์ค‘์š”: ๋ฏธ์‚ฌ์šฉ ์ƒํƒœ ํ•„๋“œ ์ œ๊ฑฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

  • ํ˜„์žฌ presentation/src/main/java/viewModel/admin/AdminViewModel.kt ํŒŒ์ผ ๋‚ด์—์„œ _getUserNameUiState์™€ getUserNameUiState๋Š” ์„ ์–ธ๋งŒ ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ฐธ์กฐ๋˜๋Š” ํ”์ ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • getUsersName ๋ฉ”์†Œ๋“œ๊ฐ€ ์ œ๊ฑฐ๋œ ์ƒํƒœ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ƒํƒœ ํ•„๋“œ๋ผ๋ฉด, ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋กœ ํŒ๋‹จ๋˜์–ด ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ ์ถ”ํ›„์— ์‚ฌ์šฉ ์šฉ๋„๊ฐ€ ๋ช…ํ™•ํ•ด์ง„๋‹ค๋ฉด, ํ•ด๋‹น ์ƒํƒœ ํ•„๋“œ์˜ ์œ ์ง€ ์ด์œ ๋ฅผ ์ฃผ์„์œผ๋กœ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ คํ•ด ์ฃผ์„ธ์š”.
๐Ÿงน Nitpick comments (68)
buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab (1)

1-3: ์นด์šดํ„ฐ ๊ฐ’ ๋ณ€๊ฒฝ ์˜๋„ ํ™•์ธ ์š”์ฒญ

ํ•ด๋‹น ํŒŒ์ผ์—์„œ ๊ธฐ์กด์— "5"๋กœ ์„ค์ •๋œ ๊ฐ’์ด "3"์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์ด ์บ์‹œ ๋˜๋Š” ๊ด€๋ จ ๋นŒ๋“œ ์„ค์ •๊ณผ ์—ฐ๊ด€๋˜์–ด ์˜๋„๋œ ๊ฒƒ์ธ์ง€ ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ๋ฐฐ๊ฒฝ ๋ฐ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

presentation/src/main/java/view/main/component/SearchEmptyText.kt (4)

19-20: ๋“ค์—ฌ์“ฐ๊ธฐ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋žŒ๋‹ค ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ์ผ๊ด€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

-    DoMaAndroidTheme {
-            colors, typography ->
+    DoMaAndroidTheme { colors, typography ->

26-26: Spacer ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ณ ๋ ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Column ๋‚ด์—์„œ width ๋ชจ๋””ํŒŒ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•œ Spacer๋Š” ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Column์€ ์„ธ๋กœ ๋ฐฉํ–ฅ ๋ ˆ์ด์•„์›ƒ์ด๋ฏ€๋กœ ๊ณต๊ฐ„์„ ์ฃผ๋ ค๋ฉด height๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

-            Spacer(modifier = Modifier.width(4.dp))
+            Spacer(modifier = Modifier.height(4.dp))

27-32: ํ…์ŠคํŠธ ์Šคํƒ€์ผ์ด ์ž˜ ์ ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ, ๊ณต๋ฐฑ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ…์ŠคํŠธ ์Šคํƒ€์ผ๊ณผ ์ƒ‰์ƒ์ด ์ ์ ˆํžˆ ์ ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, text ์†์„ฑ์— ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

-                text ="์—†๋Š” ์ด๋ฆ„์ด์—์š”!",
+                text = "์—†๋Š” ์ด๋ฆ„์ด์—์š”!",

16-37: ๋ฌธ์„œํ™” ๋ฐ UI ๊ฐœ์„  ์ œ์•ˆ

์ด ์ปดํฌ๋„ŒํŠธ์˜ ๋ชฉ์ ๊ณผ ์‚ฌ์šฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” KDoc ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ์„ ์œ„ํ•ด ํ…์ŠคํŠธ ์™ธ์— ์•„์ด์ฝ˜์ด๋‚˜ ์ผ๋Ÿฌ์ŠคํŠธ๋ ˆ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

+/**
+ * ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์„ ๋•Œ ํ‘œ์‹œ๋˜๋Š” ํ…์ŠคํŠธ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.
+ * ๋นˆ ๊ฒฐ๊ณผ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹œ๊ฐ์ ์œผ๋กœ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
+ */
 @Composable
 internal fun SearchEmptyText() {
presentation/src/main/java/view/theme/color/ColorTheme.kt (3)

9-9: ์†์„ฑ ์ด๋ฆ„์˜ ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”.

DARKGARY๋ผ๋Š” ์ด๋ฆ„์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ŠคํŽ ๋ง์€ DARKGRAY์ž…๋‹ˆ๋‹ค ('R'์ด ๋ˆ„๋ฝ๋จ).

- abstract val DARKGARY: Color
+ abstract val DARKGRAY: Color

5-16: ์ƒ‰์ƒ ์ด๋ฆ„์˜ ๋Œ€์†Œ๋ฌธ์ž ํ‘œ๊ธฐ๋ฒ•์„ ํ†ต์ผํ•ด์ฃผ์„ธ์š”.

์ƒ‰์ƒ ์†์„ฑ ์ด๋ฆ„์˜ ๋Œ€์†Œ๋ฌธ์ž ํ‘œ๊ธฐ๊ฐ€ ์ผ๊ด€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ์ „๋ถ€ ๋Œ€๋ฌธ์ž(MAIN, WHITE, GRAY), ์ผ๋ถ€๋Š” ์ฒซ ๊ธ€์ž๋งŒ ๋Œ€๋ฌธ์ž(Black, Gold, Broze), ์ผ๋ถ€๋Š” ์†Œ๋ฌธ์ž(silver)๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ƒ‰์ƒ ์ƒ์ˆ˜๋Š” ๋™์ผํ•œ ๋Œ€์†Œ๋ฌธ์ž ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์ƒ‰์ƒ ์ƒ์ˆ˜๋ฅผ UPPERCASE_WITH_UNDERSCORES ํ˜•์‹์œผ๋กœ ํ†ต์ผํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

abstract class ColorTheme {
    abstract val MAIN: Color
-   abstract val Black: Color
+   abstract val BLACK: Color
    abstract val WHITE: Color
    abstract val DARKGARY: Color

    abstract val GRAY: Color
    abstract val LIGHTGRAY: Color
-   abstract val Gold: Color
-   abstract val silver: Color
-   abstract val Broze: Color
+   abstract val GOLD: Color
+   abstract val SILVER: Color
+   abstract val BRONZE: Color


    abstract val SYSTEM: Color

-   abstract val CardShadow: Color
-   abstract val StatusShadow: Color
+   abstract val CARD_SHADOW: Color
+   abstract val STATUS_SHADOW: Color
}

15-15: ์†์„ฑ ์ด๋ฆ„์˜ ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”.

Broze๋ผ๋Š” ์ด๋ฆ„์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ŠคํŽ ๋ง์€ Bronze์ž…๋‹ˆ๋‹ค ('n'์ด ๋ˆ„๋ฝ๋จ).

- abstract val Broze: Color
+ abstract val Bronze: Color
presentation/src/main/java/view/theme/color/DoMaColor.kt (4)

7-7: ์†์„ฑ ์ด๋ฆ„์˜ ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”.

DARKGARY๋ผ๋Š” ์ด๋ฆ„์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ŠคํŽ ๋ง์€ DARKGRAY์ž…๋‹ˆ๋‹ค ('R'์ด ๋ˆ„๋ฝ๋จ). ColorTheme ํด๋ž˜์Šค์—์„œ๋„ ๋™์ผํ•œ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

- override val DARKGARY = Color(0xFFBEBEBE)
+ override val DARKGRAY = Color(0xFFBEBEBE)

16-16: ์†์„ฑ ์ด๋ฆ„์˜ ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”.

Broze๋ผ๋Š” ์ด๋ฆ„์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ŠคํŽ ๋ง์€ Bronze์ž…๋‹ˆ๋‹ค ('n'์ด ๋ˆ„๋ฝ๋จ). ColorTheme ํด๋ž˜์Šค์—์„œ๋„ ๋™์ผํ•œ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

- override val Broze = Color(0xFFF7A080)
+ override val Bronze = Color(0xFFF7A080)

5-22: ์ƒ‰์ƒ ์ด๋ฆ„์˜ ๋Œ€์†Œ๋ฌธ์ž ํ‘œ๊ธฐ๋ฒ•์„ ํ†ต์ผํ•ด์ฃผ์„ธ์š”.

์ƒ‰์ƒ ์†์„ฑ ์ด๋ฆ„์˜ ๋Œ€์†Œ๋ฌธ์ž ํ‘œ๊ธฐ๊ฐ€ ์ผ๊ด€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ์ „๋ถ€ ๋Œ€๋ฌธ์ž(MAIN, WHITE, GRAY), ์ผ๋ถ€๋Š” ์ฒซ ๊ธ€์ž๋งŒ ๋Œ€๋ฌธ์ž(Black, Gold, Broze), ์ผ๋ถ€๋Š” ์†Œ๋ฌธ์ž(silver)๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ƒ‰์ƒ ์ƒ์ˆ˜๋Š” ๋™์ผํ•œ ๋Œ€์†Œ๋ฌธ์ž ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์ƒ‰์ƒ ์ƒ์ˆ˜๋ฅผ UPPERCASE_WITH_UNDERSCORES ํ˜•์‹์œผ๋กœ ํ†ต์ผํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

object DoMaColor : ColorTheme(){
    override val MAIN = Color(0xFF252525)
    override val DARKGARY = Color(0xFFBEBEBE)
-   override val Black = Color(0xFF000000)
+   override val BLACK = Color(0xFF000000)
    override val WHITE = Color(0xFFFFFFFF)


    override val LIGHTGRAY = Color(0xFF555555)
    override val GRAY = Color(0xFF9AD54A)
-   override val Gold = Color(0xFFFFD651)
-   override val silver = Color(0xFFBEBEBE)
-   override val Broze = Color(0xFFF7A080)
+   override val GOLD = Color(0xFFFFD651)
+   override val SILVER = Color(0xFFBEBEBE)
+   override val BRONZE = Color(0xFFF7A080)

    override val SYSTEM = Color(0xFF14C38E) // ์‹œ์Šคํ…œ ์ƒ‰์ƒ (๊ฐ•์กฐ ์ƒ‰์œผ๋กœ ์„ค์ •)

-   override val CardShadow = Color(0xFF1A1A1A) // ์นด๋“œ ๊ทธ๋ฆผ์ž ์ƒ‰์ƒ
-   override val StatusShadow = Color(0xFF141414) //
+   override val CARD_SHADOW = Color(0xFF1A1A1A) // ์นด๋“œ ๊ทธ๋ฆผ์ž ์ƒ‰์ƒ
+   override val STATUS_SHADOW = Color(0xFF141414) //


}

11-11: ๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„์„ ์ œ๊ฑฐํ•ด์ฃผ์„ธ์š”.

11ํ–‰์˜ ๋นˆ ์ค„์€ ๋ถˆํ•„์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„์€ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/view/mypage/navigation/MyPageNavigation.kt (1)

6-6: ์ƒ์ˆ˜๋ช…์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

MyPage_loute์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„์€ MyPage_route์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜คํƒ€๋Š” ๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-const val MyPage_loute = "Mypage_loute"
+const val MyPage_route = "Mypage_route"
presentation/src/main/java/view/mypage/component/MyPageEmptyText.kt (1)

16-36: Composable ํ•จ์ˆ˜ ๊ตฌํ˜„์ด ๊น”๋”ํ•ฉ๋‹ˆ๋‹ค.

ํ…์ŠคํŠธ๋ฅผ ์ค‘์•™์— ๋ฐฐ์น˜ํ•˜๊ณ  ์ ์ ˆํ•œ ์Šคํƒ€์ผ๋ง์„ ์ ์šฉํ•œ ์ ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋นˆ ์ƒํƒœ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ UX ์ธก๋ฉด์—์„œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹  ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”. ์ด๋Š” ๋‹ค๊ตญ์–ด ์ง€์›๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

-            Text(
-                text ="์กฐํšŒ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.",
-                style = typography.bodySmall,
-                fontWeight = FontWeight.SemiBold,
-                color = colors.CardShadow
-            )
+            Text(
+                text = stringResource(id = R.string.lookup_failed),
+                style = typography.bodySmall,
+                fontWeight = FontWeight.SemiBold,
+                color = colors.CardShadow
+            )

stringResource๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด import androidx.compose.ui.res.stringResource๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , strings.xml์— lookup_failed ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

presentation/src/main/java/view/mypage/component/MyClean.kt (2)

71-95: ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ ๊ฐœ์„  ๋ฐ ์Šคํƒ€์ผ ์ˆ˜์ •

Column์—์„œ Row๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด๋ฆ„๊ณผ ์ธ์‚ฌ๋ง์„ ํ•œ ์ค„์— ๋ฐฐ์น˜ํ•œ ๊ฒƒ์€ ๋” ๋‚˜์€ UI ๋””์ž์ธ์„ ์œ„ํ•œ ์ข‹์€ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ์Šคํƒ€์ผ๊ณผ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ธ ์ ๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ AnnotatedString์„ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๊ฐœ์„ ํ•  ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฝ”๋“œ๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ '๋‹˜' ์ ‘๋ฏธ์‚ฌ๋ฅผ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ๊ฒฐํ•ฉํ•œ ํ›„ ์ „์ฒด์— ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ์ ‘๋ฏธ์‚ฌ์— ๋‹ค๋ฅธ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด ๋ณด์„ธ์š”:

-                    text = AnnotatedString.Builder("${data.name}๋‹˜").apply {
-                        addStyle(
-                            style = SpanStyle(
-                                color = colors.GRAY, fontSize = 20.sp
-                            ),
-                            start = 0, end = data.name.length
-                        )
-                    }.toAnnotatedString(),
+                    text = buildAnnotatedString {
+                        append(data.name)
+                        withStyle(style = SpanStyle(color = colors.GRAY, fontSize = 20.sp)) {
+                            append("๋‹˜")
+                        }
+                    },

์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฆ„๊ณผ '๋‹˜' ์ ‘๋ฏธ์‚ฌ์— ๋‹ค๋ฅธ ์Šคํƒ€์ผ์„ ๋” ์ง๊ด€์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


227-243: ํ”„๋ฆฌ๋ทฐ ํ•จ์ˆ˜ ์ถ”๊ฐ€๋Š” ์ข‹์€ ๊ฐœ๋ฐœ ๊ด€ํ–‰์ž…๋‹ˆ๋‹ค.

Composable ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ ํ”„๋ฆฌ๋ทฐ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์€ ๊ฐœ๋ฐœ ๋ฐ ๋””์ž์ธ ๊ณผ์ •์—์„œ UI๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด ์ข‹์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ƒํ™ฉ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋” ์™„๋ฒฝํ•œ ํ”„๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์ƒํ™ฉ(์˜ˆ: ๊ธด ์ด๋ฆ„, ๋นˆ ๋ฐ์ดํ„ฐ ๋“ฑ)์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ์—ฌ๋Ÿฌ ํ”„๋ฆฌ๋ทฐ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

presentation/src/main/java/view/mypage/component/DemeritList.kt (4)

75-75: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์„ ๋ฆฌ์†Œ์Šค๋กœ ๊ด€๋ฆฌํ•˜์„ธ์š”.

"๋ฒŒ์  ๋ฆฌ์ŠคํŠธ"์™€ ๊ฐ™์€ ๋ฌธ์ž์—ด์€ ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ๋ง๊ณ  strings.xml ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค๊ตญ์–ด ์ง€์›์ด ์šฉ์ดํ•˜๊ณ  ํ…์ŠคํŠธ ๋ณ€๊ฒฝ ์‹œ ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ๋ฆฌ์†Œ์Šค๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

- text = "๋ฒŒ์  ๋ฆฌ์ŠคํŠธ",
+ text = stringResource(id = R.string.demerit_list),

107-107: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ ๊ฐ’์„ ํ…Œ๋งˆ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•˜์„ธ์š”.

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ ๊ฐ’(0xFFC1C1C1)์€ ํ…Œ๋งˆ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹คํฌ ๋ชจ๋“œ์™€ ๊ฐ™์€ ํ…Œ๋งˆ ๋ณ€๊ฒฝ ์‹œ ์ž๋™์œผ๋กœ ์ ์ ˆํ•œ ์ƒ‰์ƒ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

- color = Color(0xFFC1C1C1)
+ color = colors.GRAY // ๋˜๋Š” ํ…Œ๋งˆ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ ์ ˆํ•œ ์ƒ‰์ƒ

98-98: horizontalAlignment ์†์„ฑ์ด ๋ถˆํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Column ๋‚ด์˜ Text ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ด๋ฏธ Modifier.fillMaxWidth()๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด horizontalAlignment ์†์„ฑ์ด ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

- horizontalAlignment = Alignment.Start

117-117: ํŒŒ์ผ ๋์— ๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ๋์— ๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

-
presentation/src/main/java/component/until/keyboardAsState.kt (1)

22-32: ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ๊ณ ๋ คํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OnPreDrawListener๋Š” UI๊ฐ€ ๊ทธ๋ ค์งˆ ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋ฏ€๋กœ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์•ˆ์œผ๋กœ WindowInsets.imeAnimationTarget๊ณผ ํ•จ๊ป˜ Modifier.onGloballyPositioned๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ํ‚ค๋ณด๋“œ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ์—๋งŒ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ คํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Composable
fun KeyboardAsState(): State<Boolean> {
    val windowInsets = WindowInsets.ime
    val context = LocalContext.current
    var isImeVisible by remember { mutableStateOf(false) }
    
    LaunchedEffect(context) {
        val windowInsetsController = WindowInsetsControllerCompat(
            context.findActivity().window, 
            context.findActivity().window.decorView
        )
        // ํ‚ค๋ณด๋“œ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑ
        windowInsetsController.addOnControllableInsetsChangedListener { controller, typeMask ->
            if (typeMask and WindowInsetsCompat.Type.ime() != 0) {
                isImeVisible = windowInsets.isVisible
            }
        }
    }
    
    return rememberUpdatedState(isImeVisible)
}

// Activity ์ฐพ๋Š” ํ™•์žฅ ํ•จ์ˆ˜
fun Context.findActivity(): Activity {
    var context = this
    while (context is ContextWrapper) {
        if (context is Activity) return context
        context = context.baseContext
    }
    throw IllegalStateException("Activity๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค")
}
presentation/src/main/res/drawable/notice.xml (1)

1-13: ์•Œ๋ฆผ ์•„์ด์ฝ˜ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ” XML ๊ฒ€ํ† 
notice.xml ํŒŒ์ผ์€ 24dp ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ”๋กœ, ํˆฌ๋ช…ํ•œ ์ฑ„์šฐ๊ธฐ ์ƒ‰์ƒ๊ณผ ํšŒ์ƒ‰ ์ŠคํŠธ๋กœํฌ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์žกํ•˜๊ฒŒ ์ž‘์„ฑ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ถ”ํ›„ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ๊ฐ ์ฃผ์š” ๋ถ€๋ถ„์— ๊ฐ„๋‹จํ•œ ์ฃผ์„ ์ถ”๊ฐ€๋ฅผ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

presentation/src/main/res/drawable/notserach.xml (1)

1-20: ๊ฒ€์ƒ‰ ๊ด€๋ จ ์•„์ด์ฝ˜ ํŒŒ์ผ๋ช… ๋ฐ ๊ตฌ์„ฑ ์ ๊ฒ€
notserach.xml ํŒŒ์ผ์€ 72dp ํฌ๊ธฐ์˜ ์ƒ์„ธ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ”๋กœ, ๋ณต์žกํ•œ android:pathData๋ฅผ ํ†ตํ•ด ์ •๊ตํ•œ ๊ทธ๋ž˜ํ”ฝ์„ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ถ”๊ฐ€ ๊ฒ€ํ†  ์‚ฌํ•ญ: ํŒŒ์ผ ์ด๋ฆ„์— "serach" ์˜คํƒ€๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค(์˜ˆ: "notsearch.xml"์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ช…ํ™•ํ•  ์ˆ˜ ์žˆ์Œ).

domain/src/main/java/emumtype/DomaNavBarItemType.kt (1)

1-7: ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ์•„์ดํ…œ ํƒ€์ž… ์—ด๊ฑฐํ˜•์ด ์ž˜ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ์•„์ดํ…œ ํƒ€์ž…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜์—ฌ ์•ฑ ๋‚ด ์ด๋™์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๋ชจ๋“  ์—ด๊ฑฐํ˜• ์ƒ์ˆ˜๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ํ†ต์ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค:

enum class DomaNavBarItemType{
    HOME,
-   Notice,
+   NOTICE,
-   MY
+   MY
}
domain/src/main/java/emumtype/Authority.kt (1)

1-6: ๊ถŒํ•œ ์—ด๊ฑฐํ˜•์ด ์ž˜ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž์™€ ๊ด€๋ฆฌ์ž ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜๋Š” ์—ด๊ฑฐํ˜• ์ •์˜๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ถŒํ•œ ๊ด€๋ฆฌ์— ํ•„์ˆ˜์ ์ธ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ๋งˆ์ง€๋ง‰ ์ค„์˜ ์‰ผํ‘œ๋Š” ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

enum class Authority {
    ROLE_USER,
-   ROLE_MANAGER,
+   ROLE_MANAGER
}
domain/src/main/java/model/admin/request/AuthorityRequestModel.kt (1)

3-6: ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๊ตฌ์กฐ๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๊ถŒํ•œ ๋ณ€๊ฒฝ ์š”์ฒญ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. accountIdx์™€ authority ์†์„ฑ์ด ์ ์ ˆํžˆ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ถŒํ•œ(authority) ํ•„๋“œ์— ์ž…๋ ฅ ๊ฐ€๋Šฅํ•œ ๊ฐ’์— ๋Œ€ํ•œ ๋ฌธ์„œํ™”๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋” ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

domain/src/main/java/model/admin/response/AdminStudentListResponseModel.kt (2)

5-5: ๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„์„ ์ œ๊ฑฐํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋” ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


6-11: ์‘๋‹ต ๋ชจ๋ธ ๊ตฌ์กฐ๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

ํ•™์ƒ ๋ชฉ๋ก ์‘๋‹ต์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•œ ์†์„ฑ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์†์„ฑ์˜ ํƒ€์ž…๋„ ์ ์ ˆํ•˜๊ฒŒ ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ธ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๋ฌธ์„œ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด ํด๋ž˜์Šค์˜ ์šฉ๋„์™€ ๊ด€๋ จ API๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

/**
 * ๊ด€๋ฆฌ์ž๊ฐ€ ํ•™์ƒ ๋ชฉ๋ก์„ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์‘๋‹ต ๋ชจ๋ธ
 *
 * @property name ํ•™์ƒ ์ด๋ฆ„
 * @property penaltyPoint ๋ฒŒ์ 
 * @property roomNum ๋ฐฉ ๋ฒˆํ˜ธ
 * @property userId ์‚ฌ์šฉ์ž ๊ณ ์œ  ์‹๋ณ„์ž
 */
data class AdminStudentListResponseModel(
    val name: String,
    val penaltyPoint: Int,
    val roomNum: Int,
    val userId: UUID,
)
data/src/main/java/local/datasource/LocalDataSource.kt (1)

18-21: ๊ถŒํ•œ ์ •๋ณด ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

LocalDataSource ์ธํ„ฐํŽ˜์ด์Šค์— ์ถ”๊ฐ€๋œ ๋‘ ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ์ •๋ณด๋ฅผ ๋กœ์ปฌ์— ์ €์žฅํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค:

  • getAuthority(): ์ €์žฅ๋œ ๊ถŒํ•œ ์ •๋ณด๋ฅผ Flow๋กœ ์ œ๊ณต
  • setAuthority(): ๊ถŒํ•œ ์ •๋ณด๋ฅผ ๋กœ์ปฌ์— ์ €์žฅ

์ด ๋ณ€๊ฒฝ์€ ๋กœ๊ทธ์ธ ์‹œ ๋ฐ›์€ ๊ถŒํ•œ ์ •๋ณด๋ฅผ ๋กœ์ปฌ์— ์บ์‹ฑํ•˜์—ฌ ์•ฑ ์ „๋ฐ˜์—์„œ ์‚ฌ์šฉ์ž ๊ถŒํ•œ์— ๋”ฐ๋ฅธ ๊ธฐ๋Šฅ ์ œ์–ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๊ถŒํ•œ ์ •๋ณด ์‚ญ์ œ ๋ฉ”์„œ๋“œ(deleteAuthority())๋„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ผ๊ด€์„ฑ ์žˆ๋Š” ํŒจํ„ด์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์•„์›ƒ ์‹œ ๊ถŒํ•œ ์ •๋ณด๋„ ํ•จ๊ป˜ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 fun getAuthority(): Flow<String>

 suspend fun setAuthority(authority: String)
 
+suspend fun deleteAuthority()
+
 fun getRefreshToken(): Flow<String>
domain/src/main/java/usecase/admin/ChangeAuthorityUseCase.kt (1)

7-13: ๊ถŒํ•œ ๋ณ€๊ฒฝ ์œ ์Šค์ผ€์ด์Šค ๊ตฌํ˜„์ด Clean Architecture ํŒจํ„ด์„ ์ž˜ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด AdminRepository๋ฅผ ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. invoke ์—ฐ์‚ฐ์ž ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด usecase๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ ๋ถ€๋ถ„๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

runCatching์„ ์‚ฌ์šฉํ•ด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž์—๊ฒŒ ์˜ˆ์™ธ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

 operator fun invoke(body: AuthorityRequestModel)= runCatching {
     adminRepository.changeAuthority(body = body)
+}.onFailure { error ->
+    // ๋กœ๊น…์ด๋‚˜ ํŠน์ • ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
+    throw error // ๋˜๋Š” ์ ์ ˆํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
 }
data/src/main/java/remote/dto/auth/response/GAuthLoginResponse.kt (1)

14-16: Authority ์†์„ฑ ์ถ”๊ฐ€ ๋ฐ ํ˜•์‹ ๊ฐœ์„  ์ œ์•ˆ

Authority ์†์„ฑ์ด ์ž˜ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, 15๋ฒˆ ์ค„์˜ ๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„์€ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

    @Json(name = "Authority") val authority: Authority
-

)
presentation/src/main/java/view/main/component/PostDemeritComponent.kt (1)

1-56: ์ƒˆ๋กœ์šด ๋ฒŒ์  ๋ถ€์—ฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฒŒ์  ๋ถ€์—ฌ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ UI ์š”์†Œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์•„์›ƒ์€ ์ž˜ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ DoMaAndroidTheme์„ ์ ์šฉํ•˜์—ฌ ์ผ๊ด€๋œ ์Šคํƒ€์ผ๋ง์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๊ฐœ์„ ํ•  ์ :

  1. ์•„์ด์ฝ˜ ๋ฒ„ํŠผ์˜ ๋‚ด์šฉ์ด ๋‹จ์ˆœํžˆ DoMaIcon()์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ์–ด ์–ด๋–ค ์•„์ด์ฝ˜์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ๊ตฌ์ฒด์ ์ธ ์•„์ด์ฝ˜ ์ง€์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  2. onDemeritStudentClick()์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ธฐ๋ณด๋‹ค onClick์— ๋ฐ”๋กœ ํ•จ์ˆ˜ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

IconButton(
-   onClick = { onDemeritStudentClick() },
+   onClick = onDemeritStudentClick,
    modifier = Modifier,
) {
-   DoMaIcon()
+   DoMaIcon(iconType = IconType.DEMERIT) // ๋˜๋Š” ์ ์ ˆํ•œ ์•„์ด์ฝ˜ ์œ ํ˜•
}
  1. Row ๋‚ด๋ถ€์— ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ๊ฐ€์ด๋“œ๋‚˜ ํˆดํŒ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
data/src/main/java/remote/dto/admin/request/AuthorityRequest.kt (1)

19-23: ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ ๋ผ์ธ์„ ์ œ๊ฑฐํ•ด์ฃผ์„ธ์š”.

toModel() ํ•จ์ˆ˜ ๋‚ด์— 22-23๋ฒˆ ๋ผ์ธ ์‚ฌ์ด์— ๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

fun AuthorityRequest.toModel() = AuthorityRequestModel(
    accountIdx = accountIdx,
    authority = authority
-
)
presentation/src/main/java/view/main/component/StudentPatch.kt (1)

1-58: ์ ์ ˆํ•œ ์ฝ”๋“œ ๋ฌธ์„œํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

StudentPatch ์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜์— ๋Œ€ํ•œ KDoc ๋ฌธ์„œํ™”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜์˜ ๋ชฉ์ , ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์—ญํ•  ๋ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌธ์„œํ™”๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

+/**
+ * ํ•™์ƒ์—๊ฒŒ ๋ฒŒ์ ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” UI ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.
+ *
+ * @param modifier ์ปดํฌ๋„ŒํŠธ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ •์ž
+ * @param onStudentPatchClick ๋ฒŒ์  ๋ถ€์—ฌ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ
+ */
@Composable
fun StudentPatch(
    modifier: Modifier = Modifier,
    onStudentPatchClick: () -> Unit,

    ) {
presentation/src/main/java/component/navigationbar/DomaNavBar.kt (1)

18-71: ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐ” ๊ตฌํ˜„์ด ์ž˜ ๋˜์—ˆ์œผ๋‚˜ ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ „๋ฐ˜์ ์œผ๋กœ Jetpack Compose ํŒจํ„ด์„ ์ž˜ ๋”ฐ๋ฅด๊ณ  ์žˆ์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ๊ฐœ์„ ํ•  ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ๋™์ผํ•œ modifier ์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์ปดํฌ์ €๋ธ”์—์„œ ์žฌ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ผ๊ด€์„ฑ ์—†๋Š” ๋ช…๋ช… ๊ทœ์น™: DomaNavBarItemType.HOME์€ ๋Œ€๋ฌธ์ž์ธ ๋ฐ˜๋ฉด, ๋‹ค๋ฅธ ํ•ญ๋ชฉ๋“ค์€ ์ฒซ ๊ธ€์ž๋งŒ ๋Œ€๋ฌธ์ž์ž…๋‹ˆ๋‹ค.
  3. ๋‚ด๋น„๊ฒŒ์ด์…˜ ์•„์ดํ…œ ๊ฐ„ ๊ฐ„๊ฒฉ์ด ๋ช…์‹œ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  4. ์ ‘๊ทผ์„ฑ ๊ธฐ๋Šฅ(์˜ˆ: contentDescription)์ด ๊ตฌํ˜„๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค:

@Composable
fun DomaNavBar(
    modifier: Modifier = Modifier,
    currentDestination: DomaNavBarItemType,
    setCurrentDestination: (DomaNavBarItemType) -> Unit,
) {
    DoMaAndroidTheme { colors, typography ->
        Row(
            horizontalArrangement = Arrangement.SpaceBetween,
            modifier = modifier
                .fillMaxWidth()
                .background(colors.WHITE)
        ) {
            DomaNavBarItemType.values().forEach { item ->
                Column(
                    verticalArrangement = Arrangement.Center,
                    horizontalAlignment = Alignment.CenterHorizontally,
-                   modifier = modifier
+                   modifier = Modifier
                        .then(
                            if (currentDestination == item) {
                                Modifier
                            } else {
                                Modifier.clickablesingle(onClick = {setCurrentDestination(item)})
                            }
                        ),
                ) {
                    when (item) {
                        DomaNavBarItemType.Notice -> {
                            NoticeIcon(
                                isSelected = currentDestination == item,
-                               modifier = modifier,
+                               modifier = Modifier,
                            )
                        }

                        DomaNavBarItemType.HOME -> {
                            HomeIcon(
                                isSelected = currentDestination == item,
-                               modifier = modifier,
+                               modifier = Modifier,
                            )
                        }

                        DomaNavBarItemType.MY -> {
                            MyPageIcon(
                                isSelected = currentDestination == item,
-                               modifier = modifier,
+                               modifier = Modifier,
                            )
                        }
                    }

                }
            }
        }
    }
}
presentation/src/main/java/viewModel/homes/uistate/StudentListUiState.kt (1)

5-10: StudentListUiState ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ž˜ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ UI ์ƒํƒœ(๋กœ๋”ฉ, ๋น„์–ด์žˆ์Œ, ์„ฑ๊ณต, ์‹คํŒจ)๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ์ž‘์€ ํ˜•์‹ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

sealed interface StudentListUiState {
-    object Loading :StudentListUiState
+    object Loading : StudentListUiState
    object Empty : StudentListUiState
    data class Success(val data: List<AdminUserListResponseModel>) : StudentListUiState
    data class Fail(val exception: Throwable) : StudentListUiState
}

์ฝœ๋ก  ๋’ค์— ๊ณต๋ฐฑ์ด ๋ˆ„๋ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ์ถ”๊ฐ€ํ•˜์„ธ์š”.

data/src/main/java/remote/dto/admin/request/AdminPenaltyRequest.kt (2)

10-16: AdminPenaltyRequest์— ์ƒˆ๋กœ์šด ์†์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

accountIdx์™€ authority ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ๊ถŒํ•œ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. JSON ์–ด๋…ธํ…Œ์ด์…˜๋„ ์ ์ ˆํžˆ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ ๋ผ์ธ(15)์„ ์ œ๊ฑฐํ•˜๊ณ  ํ˜•์‹์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค:

@JsonClass(generateAdapter = true)
data class AdminPenaltyRequest (
    @Json(name = "penaltyPoint") val penaltyPoint: Int,
    @Json(name = "because") val because: String,
    @Json(name = "accountIdx") val accountIdx: UUID,
    @Json(name = "authority") val authority: Authority
-

)

25-31: toModel() ํ•จ์ˆ˜์— ์ƒˆ ์†์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

DTO๋ฅผ Model๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์— accountIdx์™€ authority ํ•„๋“œ๊ฐ€ ์ ์ ˆํžˆ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ ๋ผ์ธ(30-31)์„ ์ œ๊ฑฐํ•˜๊ณ  ํ˜•์‹์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค:

fun AdminPenaltyRequest.toModel() = AdminPenaltyRequestModel(
    because = because,
    penaltyPoint = penaltyPoint,
    accountIdx = accountIdx,
    authority = authority
-

)
presentation/src/main/java/component/designsystem/DomaSearchTextField.kt (14)

30-30: ์˜คํƒ€ ํ™•์ธ ํ•„์š”

component.modifier.SerchIcon ์ž„ํฌํŠธ์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 'SerchIcon'์—์„œ 'a'๊ฐ€ ๋น ์ ธ 'SearchIcon'์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

-import component.modifier.SerchIcon
+import component.modifier.SearchIcon

89-91: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ ๊ฐ’

Color(0xFF4C4C4C) ๊ฐ’์ด ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ํ…Œ๋งˆ์˜ ์ƒ‰์ƒ ์ƒ์ˆ˜๋กœ ์ถ”์ถœํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

-.border(
-    width = 1.dp,
-    color = Color(0xFF4C4C4C),
-    shape = RoundedCornerShape(size = 8.dp)
-)
+.border(
+    width = 1.dp,
+    color = colors.DARKGARY,
+    shape = RoundedCornerShape(size = 8.dp)
+)

110-114: ์ผ๊ด€๋œ ๋„ค์ด๋ฐ ์ ์šฉ ํ•„์š”

trailingIcon์—์„œ SerchIcon์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰๋œ ์˜คํƒ€๊ฐ€ ์—ฌ๊ธฐ์„œ๋„ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

-SerchIcon(
+SearchIcon(
    tint = colors.DARKGARY
)

34-35: ์ƒ์ˆ˜ ์ด๋ฆ„ ๊ฐœ์„  ํ•„์š”

EMPTY ์ƒ์ˆ˜๋Š” ๊ทธ ์šฉ๋„๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด๋Š” ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

- const val EMPTY = ""
+ const val EMPTY_STRING = ""

82-83: ์˜คํƒ€ ์ˆ˜์ • ํ•„์š”

DARKGARY๋Š” ์˜คํƒ€๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. DARKGRAY๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ํ‘œ๊ธฐ์ž…๋‹ˆ๋‹ค.

- color = colors.DARKGARY
+ color = colors.DARKGRAY

88-93: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ ๊ฐ’ ๋Œ€์‹  ํ…Œ๋งˆ ์ƒ‰์ƒ ์‚ฌ์šฉ ๊ถŒ์žฅ

๋ผ์ธ 90์˜ Color(0xFF4C4C4C)๋Š” ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ํ…Œ๋งˆ ์ƒ‰์ƒ ์‹œ์Šคํ…œ์„ ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

- color = Color(0xFF4C4C4C),
+ color = colors.DARKGRAY, // ๋˜๋Š” ์ ์ ˆํ•œ ํ…Œ๋งˆ ์ƒ‰์ƒ

104-105: ์˜คํƒ€ ์ˆ˜์ • ํ•„์š”

์—ฌ๊ธฐ์„œ๋„ DARKGARY ์˜คํƒ€๊ฐ€ ๋ฐœ๊ฒฌ๋ฉ๋‹ˆ๋‹ค.

- focusedPlaceholderColor = colors.DARKGARY,
- unfocusedPlaceholderColor = colors.DARKGARY,
+ focusedPlaceholderColor = colors.DARKGRAY,
+ unfocusedPlaceholderColor = colors.DARKGRAY,

110-114: ๊ฒ€์ƒ‰ ์•„์ด์ฝ˜ ์ ‘๊ทผ์„ฑ ๊ฐœ์„  ํ•„์š”

๊ฒ€์ƒ‰ ์•„์ด์ฝ˜์— contentDescription์ด ์—†์Šต๋‹ˆ๋‹ค. ์ ‘๊ทผ์„ฑ์„ ์œ„ํ•ด ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

SerchIcon(
    tint = colors.DARKGARY
+   contentDescription = "๊ฒ€์ƒ‰"
)

111-113: ์˜คํƒ€ ์ˆ˜์ • ํ•„์š” ๋ฐ ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„ ๊ฒ€ํ† 

SerchIcon์— 'a'๊ฐ€ ๋น ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ฒ ์ž๋Š” SearchIcon์ž…๋‹ˆ๋‹ค.

- SerchIcon(
-     tint = colors.DARKGARY
- )
+ SearchIcon(
+     tint = colors.DARKGRAY
+ )

122-129: ํ”„๋ฆฌ๋ทฐ ํ•จ์ˆ˜ ๊ฐœ์„ 

ํ”„๋ฆฌ๋ทฐ ํ•จ์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์€ ์ข‹์Šต๋‹ˆ๋‹ค. ๋” ๋‹ค์–‘ํ•œ ์ƒํƒœ(์˜ˆ: ํ…์ŠคํŠธ ์ž…๋ ฅ๋จ, ํฌ์ปค์Šค๋จ ๋“ฑ)๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์—ฌ๋Ÿฌ ํ”„๋ฆฌ๋ทฐ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋” ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


31-31: ์˜คํƒ€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SerchIcon์— ์˜คํƒ€๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. SearchIcon์ด ์˜ฌ๋ฐ”๋ฅธ ์ฒ ์ž๊ฐ€ ์•„๋‹Œ์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”.


83-83: ์˜คํƒ€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DARKGARY์— ์˜คํƒ€๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. DARKGRAY๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ฒ ์ž๊ฐ€ ์•„๋‹Œ์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”.


90-92: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ ๊ฐ’์„ ํ…Œ๋งˆ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Color(0xFF4C4C4C)์™€ ๊ฐ™์€ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ ๊ฐ’์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ๋งˆ๋‚˜ ์ƒ์ˆ˜ ํŒŒ์ผ์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

- color = Color(0xFF4C4C4C),
+ color = colors.borderColor, // ํ…Œ๋งˆ์— ์ ์ ˆํ•œ ์ƒ‰์ƒ์„ ์ •์˜ํ•˜์„ธ์š”

102-104: ํฌ์ปค์Šค ์ƒํƒœ์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ ๊ตฌ๋ณ„์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

ํฌ์ปค์Šค ๋ฐ ๋น„ํฌ์ปค์Šค ํ…์ŠคํŠธ ์ƒ‰์ƒ์ด ๋ชจ๋‘ colors.MAIN์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์ƒํƒœ ๊ฐ„์— ์‹œ๊ฐ์  ๊ตฌ๋ณ„์ด ์žˆ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

data/src/main/java/remote/datasource/admin/AdminDataSourceImpl.kt (1)

11-11: ๋Œ€์†Œ๋ฌธ์ž ์˜คํƒ€ ๋ฐœ๊ฒฌ

AdminStudentLIstResponse ์ž„ํฌํŠธ์— ๋Œ€์†Œ๋ฌธ์ž ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 'LIst'๊ฐ€ ์•„๋‹Œ 'List'๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

-import remote.dto.admin.response.AdminStudentLIstResponse
+import remote.dto.admin.response.AdminStudentListResponse
presentation/src/main/java/component/combinationvIew/CombinationViewNavigation.kt (1)

14-40: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์€ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

NavGraphBuilder์˜ ํ™•์žฅ ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 10๊ฐœ๋‚˜ ์žˆ์–ด ์œ ์ง€๋ณด์ˆ˜์™€ ๊ฐ€๋…์„ฑ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด๋‚˜ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ จ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๊ฐœ์„ ํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค๋ฉด:

data class NavigationCallbacks(
    val navigateToNotice: () -> Unit,
    val navigateToBack: () -> Unit,
    val navigateToMain: () -> Unit,
    val navigateToMyPage: () -> Unit,
    val navigateToLogin: () -> Unit
)

data class ActionCallbacks(
    val onDemeritStudentClick: () -> Unit,
    val onStudentPatchClick: () -> Unit,
    val onErrorToast: (throwable: Throwable?, message: Int?) -> Unit
)

fun NavGraphBuilder.combinationView(
    currentDestination: DomaNavBarItemType,
    setCurrentDestination: (DomaNavBarItemType) -> Unit,
    navigationCallbacks: NavigationCallbacks,
    actionCallbacks: ActionCallbacks
) {
    // ํ•จ์ˆ˜ ๊ตฌํ˜„...
}
presentation/src/main/java/view/main/screen/MainScreen.kt (6)

86-103: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์€ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

MainScreen ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์•„ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๊ฐœ์„ ํ•˜์„ธ์š”. ์˜ˆ:

data class MainScreenCallbacks(
    val tokenRefreshCallBack: () -> Unit,
    val initTokenRefreshCallBack: () -> Unit,
    val myRankCallBack: () -> Unit,
    val rankListCallBack: () -> Unit,
    val onDemeritStudentClick: () -> Unit,
    val onStudentPatchClick: () -> Unit,
    val onErrorToast: (throwable: Throwable?, message: Int?) -> Unit,
    val navigateToBack: () -> Unit
)

data class MainScreenStates(
    val role: Authority,
    val isRefreshing: Boolean,
    val tokenRefreshUiState: TokenRefreshUiState,
    val homesUiState: HomesUiState,
    val homesMyRankUiState: HomesMyRankUiState
)

115-122: ์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ ๋กœ์ง์— ๋Œ€ํ•œ ์ตœ์ ํ™” ๊ณ ๋ ค

๋ฌดํ•œ ๋ฃจํ”„๋กœ ์‹œ๊ฐ„์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์€ ์ผ๋ฐ˜์ ์ด์ง€๋งŒ, ๋ฐฐํ„ฐ๋ฆฌ ์†Œ๋ชจ์™€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด์ด ๋ณด์ด์ง€ ์•Š์„ ๋•Œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ค‘์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

val lifecycleOwner = LocalLifecycleOwner.current
LaunchedEffect("Time") {
    lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
        while (true) {
            delay(1_000L)
            currentTime = System.currentTimeMillis()
        }
    }
}

142-142: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ ๊ฐ’

๋ฐฐ๊ฒฝ์ƒ‰์ด ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ๋งˆ ์‹œ์Šคํ…œ์—์„œ ์ •์˜๋œ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํ…Œ๋งˆ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜์„ธ์š”:

- .background(color = Color(0xFF1E1E1E)),
+ .background(color = colors.BACKGROUND),

์ด๋•Œ colors.BACKGROUND๋Š” ํ…Œ๋งˆ์— ์ •์˜๋œ ๋ฐฐ๊ฒฝ์ƒ‰ ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒ์ˆ˜๊ฐ€ ์—†๋‹ค๋ฉด ํ…Œ๋งˆ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


183-185: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ ๊ฐ’

๋ฐฐ๊ฒฝ์ƒ‰์ด ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ๋งˆ ์ƒ‰์ƒ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํ…Œ๋งˆ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜์„ธ์š”:

- .background(color = Color(0xFF252525), shape = RoundedCornerShape(size = 10.dp)),
+ .background(color = colors.CARD_BACKGROUND, shape = RoundedCornerShape(size = 10.dp)),

208-214: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ํ…์ŠคํŠธ ์Šคํƒ€์ผ๊ณผ ์ƒ‰์ƒ

ํ…์ŠคํŠธ ์Šคํƒ€์ผ๊ณผ ์ƒ‰์ƒ์ด ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์–ด ํ…Œ๋งˆ ๋ณ€๊ฒฝ ์‹œ ์ผ๊ด€์„ฑ์ด ์œ ์ง€๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ๋งˆ ์Šคํƒ€์ผ๊ณผ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜์„ธ์š”:

- text = "์ˆœ์œ„", style = TextStyle(
-     fontSize = 14.sp,
-     fontWeight = FontWeight(600),
-     color = Color(0xFF555555),
- )
+ text = "์ˆœ์œ„",
+ style = typography.labelMedium,
+ color = colors.SECONDARY_TEXT

222-222: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ฐ„๊ฒฉ ๊ฐ’

Spacer์˜ ๋„ˆ๋น„๊ฐ€ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์–ด ๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์— ๋Œ€์‘ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ์„ ์œ„ํ•ด weight ๋˜๋Š” ๋น„์œจ ๊ธฐ๋ฐ˜ ๊ฐ„๊ฒฉ์„ ์‚ฌ์šฉํ•˜์„ธ์š”:

- Spacer(modifier = Modifier.width(150.dp))
+ Spacer(modifier = Modifier.weight(1f))

๋˜๋Š” ๋””์ž์ธ ์‹œ์Šคํ…œ์—์„œ ์ •์˜๋œ ๊ฐ„๊ฒฉ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

presentation/src/main/java/view/main/component/SearchList.kt (3)

33-90: SearchList Composable ๊ตฌํ˜„

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•˜๋Š” UI๋ฅผ ๋‹ค์–‘ํ•œ ์ƒํƒœ์— ๋”ฐ๋ผ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ UI ์ƒํƒœ์™€ ํ•™์ƒ ๋ชฉ๋ก UI ์ƒํƒœ๋ฅผ ๋ชจ๋‘ ๊ณ ๋ คํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ์ž˜ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ํ•˜๋“œ์ฝ”๋”ฉ๋œ ํ…์ŠคํŠธ ๋ฌธ์ž์—ด("๋กœ๋”ฉ์ค‘", "๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.")์€ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋‹ค๊ตญ์–ด ์ง€์› ๋ฐ ์œ ์ง€๋ณด์ˆ˜์— ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์„ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”:

- Text(text = "๋กœ๋”ฉ์ค‘")
+ Text(text = stringResource(id = R.string.loading))

- Text(text = "๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.")
+ Text(text = stringResource(id = R.string.no_search_results))

93-144: SearchItem UI ๊ตฌํ˜„

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์•„์ดํ…œ์˜ UI๋ฅผ ๊ตฌํ˜„ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ ๊ฐ’๊ณผ ๊ณ ์ • ๋„ˆ๋น„ ๊ฐ’(152.dp)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์—์„œ ๋ ˆ์ด์•„์›ƒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”:

  1. ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ์„ ํ…Œ๋งˆ ์ƒ‰์ƒ์œผ๋กœ ๋ณ€๊ฒฝ:
- .background(color = Color(0xFF252525), shape = RoundedCornerShape(size = 10.dp))
+ .background(color = MaterialTheme.colorScheme.surface, shape = RoundedCornerShape(size = 10.dp))

- color = Color(0xFF4C4C4C)
+ color = MaterialTheme.colorScheme.outline

- color = Color(0xFFFFFFFF)
+ color = MaterialTheme.colorScheme.onSurface
  1. ๊ณ ์ • ๋„ˆ๋น„ ๊ฐ’ ๋Œ€์‹  ๊ฐ€์ค‘์น˜ ๋˜๋Š” ๋น„์œจ ์‚ฌ์šฉ:
- Spacer(modifier = Modifier.width(152.dp))
+ Spacer(modifier = Modifier.weight(1f))

146-170: SearchListComponent ๊ตฌํ˜„

๊ฒ€์ƒ‰ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•˜๋Š” LazyColumn ๊ตฌํ˜„์ด ์ž˜ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํšจ์œจ์ ์ธ ์žฌ๊ตฌ์„ฑ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ ์ ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ, heightIn(max = 10_000.dp)๋Š” ๋งค์šฐ ํฐ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, LazyColumn์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์šฉ์— ๋งž๊ฒŒ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

heightIn ์ œํ•œ์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋” ํ•ฉ๋ฆฌ์ ์ธ ๊ฐ’์œผ๋กœ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์„ธ์š”:

- .heightIn(max = 10_000.dp)
+ // heightIn ์ œํ•œ ์ œ๊ฑฐ ๋˜๋Š”
+ .heightIn(max = 600.dp) // ๋” ํ•ฉ๋ฆฌ์ ์ธ ๊ฐ’
presentation/src/main/java/component/combinationvIew/DoMaCombinationView.kt (1)

14-27: DomaCombinationView ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜

DomaCombinationView ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŽ์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์–ด๋ ต๊ณ , ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์‹ค์ˆ˜ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋กœ ๊ทธ๋ฃนํ™”ํ•˜๊ฑฐ๋‚˜, ์ผ๊ด€๋œ ๋žŒ๋‹ค ๊ทธ๋ฃน์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”:

data class NavigationCallbacks(
    val navigateToNotice: () -> Unit,
    val navigateToMain: () -> Unit,
    val navigateToMyPage: () -> Unit,
    val navigateToLogin: () -> Unit,
    val navigateToBack: () -> Unit,
    val onDemeritStudentClick: () -> Unit,
    val onStudentPatchClick: () -> Unit,
)

@Composable
fun DomaCombinationView(
    modifier: Modifier = Modifier,
    currentDestination: DomaNavBarItemType,
    setCurrentDestination: (DomaNavBarItemType) -> Unit,
    navigationCallbacks: NavigationCallbacks,
    onErrorToast: (throwable: Throwable?, message: Int?) -> Unit
)
presentation/src/main/java/view/main/screen/PostDemeritSearchScreen.kt (2)

62-105: UI ๊ตฌ์กฐ๊ฐ€ ์ž˜ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค๋งŒ, ๊ฐœ์„ ํ•  ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰ ํ•„๋“œ ๊ตฌํ˜„๊ณผ ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค ๊ด€๋ฆฌ๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒ€์ƒ‰ ํ•„๋“œ์˜ placeholder ํ…์ŠคํŠธ "๋ฐฉ ํ˜ธ์ˆ˜, ์ด๋ฆ„ ํ•™๋…„๋“ฑ์„ ๊ฒ€์ƒ‰ํ•ด๋ณด์„ธ์š”"๋Š” ์ƒ์ˆ˜๋กœ ์ถ”์ถœํ•˜๊ฑฐ๋‚˜ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.


106-134: ๋ ˆ์ด์•„์›ƒ ๊ฐ„๊ฒฉ์ด ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ ˆ์ด์•„์›ƒ์—์„œ ์‚ฌ์šฉ๋œ ๊ณ ์ • ๊ฐ„๊ฒฉ ๊ฐ’๋“ค, ํŠนํžˆ 150.dp์™€ ๊ฐ™์€ ๊ฐ’์€ ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค ํฌ๊ธฐ์—์„œ ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ๋Œ€์ ์ธ ํฌ๊ธฐ๋‚˜ ๋น„์œจ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋””์ž์ธ ์‹œ์Šคํ…œ์—์„œ ์ •์˜๋œ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/viewModel/homes/HomesViewmodel.kt (2)

39-48: ์ฃผ์ž… ์˜์กด์„ฑ์ด ๋งŽ์€ ์ ์— ๋Œ€ํ•œ ๊ตฌ์กฐ์  ๊ณ ๋ ค
ViewModel ์ƒ์„ฑ์ž์— ๋งค์šฐ ๋งŽ์€ ์˜์กด์„ฑ์„ ์ง์ ‘ ์ฃผ์ž…ํ•˜๋ฉด, ํด๋ž˜์Šค๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Dagger/Hilt ๋“ฑ์˜ DI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด, UseCase๊ฐ€ ์„œ๋กœ ๊ฒฐํ•ฉ๋˜๋Š” ๊ณต์œ  ๋กœ์ง์„ ๋ณ„๋„ ๋ชจ๋“ˆ๋กœ ๋ฌถ๊ฑฐ๋‚˜, ViewModel์ด ๊ฐ–๋Š” ์ฑ…์ž„์„ ์ ์ ˆํžˆ ๋ถ„๋ฆฌํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


183-211: studentSearch์—์„œ ๋นˆ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ ๋กœ์ง์˜ ์ค‘๋ณต ์ƒํƒœ ์„ค์ •
๊ฒฐ๊ณผ๊ฐ€ ๋น„์–ด ์žˆ์„ ๋•Œ StudentSearchUiState.Loading์„ ์ผ์‹œ์ ์œผ๋กœ ๋‹ค์‹œ ์„ค์ •ํ•œ ๋’ค ์„ฑ๊ณต ์ƒํƒœ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ถ€๋ถ„์ด UI์—์„œ ์ž ๊น ๊นœ๋นก์ž„(Flicker)์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Empty ์ƒํƒœ๋ฅผ ๋ณ„๋„๋กœ ๋‘๊ฑฐ๋‚˜ ๋ฐ”๋กœ Success(emptyList())๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ˜•ํƒœ๋กœ ๊ฐœ์„ ์„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”.

๐Ÿ“œ Review details

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

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between 512b3d3 and 0bd976f.

โ›” Files ignored due to path filters (3)
  • buildSrc/build/kotlin/compileKotlin/cacheable/last-build.bin is excluded by !**/*.bin
  • buildSrc/build/kotlin/compileKotlin/local-state/build-history.bin is excluded by !**/*.bin
  • buildSrc/build/libs/buildSrc.jar is excluded by !**/*.jar
๐Ÿ“’ Files selected for processing (73)
  • .idea/other.xml (6 hunks)
  • app/src/main/java/DMNavHost.kt (0 hunks)
  • buildSrc/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab (1 hunks)
  • data/src/main/java/local/datasource/LocalDataSource.kt (1 hunks)
  • data/src/main/java/local/datasource/LocalDataSourceImpl.kt (1 hunks)
  • data/src/main/java/remote/api/auth/AdminAPI.kt (3 hunks)
  • data/src/main/java/remote/api/auth/NoticeAPI.kt (0 hunks)
  • data/src/main/java/remote/datasource/admin/AdminDataSource.kt (1 hunks)
  • data/src/main/java/remote/datasource/admin/AdminDataSourceImpl.kt (2 hunks)
  • data/src/main/java/remote/dto/admin/request/AdminCleanRequest.kt (1 hunks)
  • data/src/main/java/remote/dto/admin/request/AdminPenaltyRequest.kt (1 hunks)
  • data/src/main/java/remote/dto/admin/request/AuthorityRequest.kt (1 hunks)
  • data/src/main/java/remote/dto/admin/response/AdminPenaltyListResponse.kt (1 hunks)
  • data/src/main/java/remote/dto/admin/response/AdminStudentLIstResponse.kt (1 hunks)
  • data/src/main/java/remote/dto/admin/response/AdminUserListResponse.kt (1 hunks)
  • data/src/main/java/remote/dto/auth/response/GAuthLoginResponse.kt (1 hunks)
  • data/src/main/java/repoistory/AdminRepositoryImpl.kt (2 hunks)
  • data/src/main/java/repoistory/AuthRepositoryImpl.kt (1 hunks)
  • domain/src/main/java/emumtype/Authority.kt (1 hunks)
  • domain/src/main/java/emumtype/DomaNavBarItemType.kt (1 hunks)
  • domain/src/main/java/model/admin/request/AdminCleanRequestModel.kt (1 hunks)
  • domain/src/main/java/model/admin/request/AdminPenaltyRequestModel.kt (1 hunks)
  • domain/src/main/java/model/admin/request/AuthorityRequestModel.kt (1 hunks)
  • domain/src/main/java/model/admin/response/AdminStudentListResponseModel.kt (1 hunks)
  • domain/src/main/java/model/admin/response/AdminUserListResponseModel.kt (1 hunks)
  • domain/src/main/java/model/auth/response/GAuthLoginResponseModel.kt (1 hunks)
  • domain/src/main/java/reopoistory/AdminRepository.kt (1 hunks)
  • domain/src/main/java/reopoistory/AuthRepository.kt (1 hunks)
  • domain/src/main/java/usecase/admin/ChangeAuthorityUseCase.kt (1 hunks)
  • domain/src/main/java/usecase/admin/GetStudentSearchUseCase.kt (1 hunks)
  • presentation/src/main/java/component/combinationvIew/CombinationViewNavigation.kt (1 hunks)
  • presentation/src/main/java/component/combinationvIew/DoMaCombinationView.kt (1 hunks)
  • presentation/src/main/java/component/designsystem/DomaSearchTextField.kt (1 hunks)
  • presentation/src/main/java/component/modifier/DoMaIcon.kt (1 hunks)
  • presentation/src/main/java/component/navigationbar/DomaNavBar.kt (1 hunks)
  • presentation/src/main/java/component/until/keyboardAsState.kt (1 hunks)
  • presentation/src/main/java/until/Result.kt (1 hunks)
  • presentation/src/main/java/view/Mypage/component/DemeritList.kt (0 hunks)
  • presentation/src/main/java/view/Mypage/navigation/MyPageNavigation.kt (0 hunks)
  • presentation/src/main/java/view/main/Screen/MainScreen.kt (0 hunks)
  • presentation/src/main/java/view/main/component/MyPageButton.kt (1 hunks)
  • presentation/src/main/java/view/main/component/MyRankingComponent.kt (0 hunks)
  • presentation/src/main/java/view/main/component/PostDemeritComponent.kt (1 hunks)
  • presentation/src/main/java/view/main/component/Rankingcomponent.kt (0 hunks)
  • presentation/src/main/java/view/main/component/SearchEmptyText.kt (1 hunks)
  • presentation/src/main/java/view/main/component/SearchList.kt (1 hunks)
  • presentation/src/main/java/view/main/component/StudentPatch.kt (1 hunks)
  • presentation/src/main/java/view/main/navigation/MainNavigation.kt (1 hunks)
  • presentation/src/main/java/view/main/screen/MainScreen.kt (1 hunks)
  • presentation/src/main/java/view/main/screen/PostDemeritSearchScreen.kt (1 hunks)
  • presentation/src/main/java/view/mypage/component/DemeritList.kt (1 hunks)
  • presentation/src/main/java/view/mypage/component/MyClean.kt (5 hunks)
  • presentation/src/main/java/view/mypage/component/MyDemeritList.kt (3 hunks)
  • presentation/src/main/java/view/mypage/component/MyPageEmptyText.kt (1 hunks)
  • presentation/src/main/java/view/mypage/navigation/MyPageNavigation.kt (1 hunks)
  • presentation/src/main/java/view/mypage/screen/MyPage.kt (4 hunks)
  • presentation/src/main/java/view/notice/component/NoticeCard.kt (0 hunks)
  • presentation/src/main/java/view/notice/navgation/NoticeNavigation.kt (0 hunks)
  • presentation/src/main/java/view/notice/screen/NoticeScreen.kt (0 hunks)
  • presentation/src/main/java/view/theme/color/ColorTheme.kt (1 hunks)
  • presentation/src/main/java/view/theme/color/DoMaColor.kt (1 hunks)
  • presentation/src/main/java/viewModel/admin/AdminViewModel.kt (3 hunks)
  • presentation/src/main/java/viewModel/homes/HomesViewmodel.kt (4 hunks)
  • presentation/src/main/java/viewModel/homes/uistate/StudentListUiState.kt (1 hunks)
  • presentation/src/main/java/viewModel/homes/uistate/StudentSearchUiState.kt (1 hunks)
  • presentation/src/main/java/viewModel/login/uiState/TokenRefreshUiState.kt (1 hunks)
  • presentation/src/main/java/viewModel/users/UsersViewModel.kt (1 hunks)
  • presentation/src/main/res/drawable/home.xml (1 hunks)
  • presentation/src/main/res/drawable/left.xml (1 hunks)
  • presentation/src/main/res/drawable/mypage.xml (1 hunks)
  • presentation/src/main/res/drawable/notice.xml (1 hunks)
  • presentation/src/main/res/drawable/notserach.xml (1 hunks)
  • presentation/src/main/res/drawable/serach.xml (1 hunks)
๐Ÿ’ค Files with no reviewable changes (10)
  • presentation/src/main/java/view/notice/screen/NoticeScreen.kt
  • presentation/src/main/java/view/main/component/Rankingcomponent.kt
  • presentation/src/main/java/view/notice/navgation/NoticeNavigation.kt
  • presentation/src/main/java/view/notice/component/NoticeCard.kt
  • presentation/src/main/java/view/main/Screen/MainScreen.kt
  • presentation/src/main/java/view/main/component/MyRankingComponent.kt
  • presentation/src/main/java/view/Mypage/navigation/MyPageNavigation.kt
  • data/src/main/java/remote/api/auth/NoticeAPI.kt
  • app/src/main/java/DMNavHost.kt
  • presentation/src/main/java/view/Mypage/component/DemeritList.kt
โฐ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build
๐Ÿ”‡ Additional comments (129)
presentation/src/main/java/viewModel/users/UsersViewModel.kt (1)

3-4: ์ˆ˜์ •๋œ import ๊ฒฝ๋กœ ํ™•์ธ
ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ์—์„œ ์ฒซ ๊ธ€์ž๊ฐ€ ์†Œ๋ฌธ์ž์ธ โ€œuntilโ€๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์˜ฌ๋ฐ”๋ฅธ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ฅด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/view/main/component/SearchEmptyText.kt (3)

1-15: ์ ์ ˆํ•œ ์ž„ํฌํŠธ์™€ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๊ฐ€ ์ž˜ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Jetpack Compose UI ๊ตฌ์„ฑ์— ํ•„์š”ํ•œ ์š”์†Œ๋“ค์„ ์ž˜ ์ž„ํฌํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋„ ์ ์ ˆํ•˜๊ฒŒ view.main.component์— ์œ„์น˜ํ•˜์—ฌ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ์ž„์„ ๋ช…ํ™•ํžˆ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


16-17: ํ•จ์ˆ˜ ์„ ์–ธ์ด ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

internal ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ ์ ˆํžˆ ์ œํ•œํ•˜์˜€์Šต๋‹ˆ๋‹ค.


21-25: ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

Column์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ์ปจํ…์ธ ๋ฅผ ์ •๋ ฌํ•˜๊ณ , ๊ฐ€๋กœ ๋ฐฉํ–ฅ์œผ๋กœ๋Š” ์ค‘์•™ ์ •๋ ฌ์„ ์ ์šฉํ•œ ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. fillMaxWidth() ๋ชจ๋””ํŒŒ์ด์–ด๋กœ ์ „์ฒด ๋„ˆ๋น„๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

presentation/src/main/java/view/main/component/MyPageButton.kt (3)

33-33: ์ฝ”๋“œ ํ˜•์‹์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ปดํฌ์ €๋ธ”์—์„œ ๋ถˆํ•„์š”ํ•œ ์‰ผํ‘œ๊ฐ€ ์ œ๊ฑฐ๋˜์–ด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


40-40: ์ฝ”ํ‹€๋ฆฐ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•œ ์ฝ”๋“œ ๊ฐ„์†Œํ™”๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค.

MyPageButton() {} ์—์„œ MyPageButton {} ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์—์„œ ๋งˆ์ง€๋ง‰ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋žŒ๋‹ค์ผ ๊ฒฝ์šฐ ๊ด„ํ˜ธ ๋ฐ–์œผ๋กœ ๋žŒ๋‹ค๋ฅผ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๊ด„ํ˜ธ๋ฅผ ์™„์ „ํžˆ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ Trailing Lambda ๋ฌธ๋ฒ•์„ ํ™œ์šฉํ•ด ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•ด์กŒ์Šต๋‹ˆ๋‹ค.


1-41:

Details

โœ… Verification successful

๋ถˆํ•„์š”ํ•œ import ์ œ๊ฑฐ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

AI ์š”์•ฝ์— ๋”ฐ๋ฅด๋ฉด ์—ฌ๋Ÿฌ ๋ ˆ์ด์•„์›ƒ ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ์˜ import ๋ฌธ์ด ์ œ๊ฑฐ๋˜์—ˆ๋‹ค๊ณ  ํ•˜์ง€๋งŒ, ์‹ค์ œ ์ฝ”๋“œ์—์„œ๋Š” ์—ฌ์ „ํžˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” import๊ฐ€ ๋‚จ์•„์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ํŠนํžˆ Box๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ ์ปดํฌ๋„ŒํŠธ(Arrangement, Column, Row, height, width ๋“ฑ)์— ๋Œ€ํ•œ import๊ฐ€ ์žˆ๋‹ค๋ฉด ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.


๐Ÿ Script executed:

#!/bin/bash
# ํ˜„์žฌ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” import ํ™•์ธ
grep -n "^import " presentation/src/main/java/view/main/component/MyPageButton.kt | while read line; do
  import=$(echo $line | sed 's/.*import \(.*\)/\1/')
  # Box, clickable, fillMaxWidth, padding, Image, Composable, Stable, Modifier, ContentScale, painterResource, Preview๋Š” ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์ œ์™ธ
  if ! echo "$import" | grep -q "Box\|clickable\|fillMaxWidth\|padding\|Image\|Composable\|Stable\|Modifier\|ContentScale\|painterResource\|Preview\|R"; then
    echo "Potentially unused import at line: $line"
  fi
done

Length of output: 4356


๋ถˆํ•„์š”ํ•œ import ๊ฒ€ํ†  ๊ฒฐ๊ณผ

  • ์ž๋™ํ™” ๋„๊ตฌ๊ฐ€ import androidx.compose.ui.unit.dp๋ฅผ ๋ถˆํ•„์š”ํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ–ˆ์œผ๋‚˜, ์ด๋Š” ์‹ค์ œ๋กœ padding(1.dp)์—์„œ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ํ•„์š”ํ•œ import์ž…๋‹ˆ๋‹ค.
  • ๋‚˜๋จธ์ง€ import๋“ค์€ ๋ชจ๋‘ ์ฝ”๋“œ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์–ด ์ œ๊ฑฐํ•  ๋ถˆํ•„์š”ํ•œ ํ•ญ๋ชฉ์ด ์—†์Šต๋‹ˆ๋‹ค.
presentation/src/main/java/view/theme/color/DoMaColor.kt (1)

13-13: GRAY ์ƒ‰์ƒ ๊ฐ’์ด ์‹ค์ œ ํšŒ์ƒ‰์ด ์•„๋‹™๋‹ˆ๋‹ค.

GRAY ๋ณ€์ˆ˜์— ํšŒ์ƒ‰์ด ์•„๋‹Œ ๋…น์ƒ‰ ๊ณ„์—ด์˜ ์ƒ‰์ƒ(0xFF9AD54A)์ด ํ• ๋‹น๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ณ€์ˆ˜๋ช…๊ณผ ์‹ค์ œ ์ƒ‰์ƒ์ด ์ผ์น˜ํ•˜์ง€ ์•Š์•„ ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํšŒ์ƒ‰ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ณ€์ˆ˜๋ช…์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

- override val GRAY = Color(0xFF9AD54A)
+ override val GRAY = Color(0xFF808080) // ํ‘œ์ค€ ํšŒ์ƒ‰ ์ƒ‰์ƒ

๋˜๋Š” ๋ณ€์ˆ˜๋ช…์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•:

- override val GRAY = Color(0xFF9AD54A)
+ override val GREEN = Color(0xFF9AD54A) // ๋…น์ƒ‰ ๊ณ„์—ด ์ƒ‰์ƒ
presentation/src/main/java/view/mypage/navigation/MyPageNavigation.kt (1)

1-11:

Details

โ“ Verification inconclusive

๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ๊ณผ์˜ ์—ฐ๊ณ„์„ฑ ํ™•์ธ ํ•„์š”

PR์˜ ๋ชฉ์ ์€ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด์ง€๋งŒ, ์ด ํŒŒ์ผ์—๋Š” ๊ฒ€์ƒ‰ ๊ด€๋ จ ์ฝ”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. PR์˜ ๋งฅ๋ฝ์—์„œ ์ด ํŒŒ์ผ์ด ์–ด๋–ป๊ฒŒ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ๊ณผ ์—ฐ๊ณ„๋˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ AI ์š”์•ฝ์— ๋”ฐ๋ฅด๋ฉด ์ด ํŒŒ์ผ์€ ์ด์ „์— ์‚ญ์ œ๋˜์—ˆ๋‹ค๊ณ  ๋˜์–ด ์žˆ๋Š”๋ฐ, ํ˜„์žฌ ์ƒˆ ํŒŒ์ผ๋กœ ์ถ”๊ฐ€๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์ด ์—ฌ์ „ํžˆ ํ•„์š”ํ•œ์ง€, ์•„๋‹ˆ๋ฉด ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ ์‹ค์ˆ˜๋กœ ๋‹ค์‹œ ์ถ”๊ฐ€๋œ ๊ฒƒ์ธ์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”.


๐Ÿ Script executed:

#!/bin/bash
# ์ด ํŒŒ์ผ์ด ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ฐธ์กฐ๋˜๋Š”์ง€ ํ™•์ธ
rg -i "MyPage_loute|navigationToMyPage" --type kotlin

Length of output: 378


๊ฒ€์ฆ ๊ฒฐ๊ณผ: ํŒŒ์ผ์˜ ์—ญํ•  ๋ฐ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์—ฐ๊ณ„์„ฑ ๋ถˆ๋ช…ํ™•

  • ํ˜„์žฌ presentation/src/main/java/view/mypage/navigation/MyPageNavigation.kt ํŒŒ์ผ์€ ๋‚ด๋ถ€์— ์ •์˜๋œ MyPage_loute ์ƒ์ˆ˜์™€ navigationToMyPage() ํ•จ์ˆ˜๋งŒ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์ฐธ์กฐ๋˜๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ๊ณผ ์ง์ ‘์ ์ธ ์—ฐ๊ณ„์„ฑ์„ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • AI ์š”์•ฝ์— ๋”ฐ๋ฅด๋ฉด ์ด์ „์— ์‚ญ์ œ๋˜์—ˆ๋‹ค๊ณ  ๋˜์–ด ์žˆ์œผ๋‚˜, ์‹ค์ œ๋กœ๋Š” ์ƒˆ ํŒŒ์ผ๋กœ ์ถ”๊ฐ€๋˜์–ด ์žˆ์–ด ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ ์˜๋„๋œ ๋ณ€๊ฒฝ์ธ์ง€ ์—ฌ๋ถ€๊ฐ€ ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ํŒŒ์ผ์ด ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„๊ณผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…๋˜๊ฑฐ๋‚˜, ํ˜น์€ ๋ถˆํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ญ์ œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
presentation/src/main/java/view/mypage/screen/MyPage.kt (2)

35-35: ViewModel ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐฉ์‹ ๊ฐœ์„ ๋จ

hiltViewModel()์„ ์‚ฌ์šฉํ•˜์—ฌ ViewModel์„ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์€ ์ข‹์€ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์˜์กด์„ฑ์ด ๋ช…ํ™•ํ•ด์ง€๊ณ  ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•ด์ง‘๋‹ˆ๋‹ค.


55-55: ScrollState ํŒŒ๋ผ๋ฏธํ„ฐํ™” ์ข‹์€ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค.

ScrollState๋ฅผ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋„๋ก ๋ณ€๊ฒฝํ•œ ๊ฒƒ์€ ์ปดํฌ์ €๋ธ”์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๋†’์ด๋Š” ์ข‹์€ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์Šคํฌ๋กค ์ƒํƒœ๋ฅผ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

presentation/src/main/java/view/mypage/component/MyDemeritList.kt (2)

54-56: ๋นˆ ์ƒํƒœ ์ฒ˜๋ฆฌ ๊ฐœ์„ ๋จ

๋นˆ ์ƒํƒœ์ผ ๋•Œ MyPageEmptyText ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ์ ˆํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ UX ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค.


105-109: ์ฝ”๋“œ ํฌ๋งทํŒ… ๊ฐœ์„ ๋จ

Column์˜ modifier๋ฅผ ์—ฌ๋Ÿฌ ์ค„๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ€๋…์„ฑ์„ ๋†’์ธ ๊ฒƒ์€ ์ข‹์€ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค. ๊ธด modifier ์ฒด์ธ์„ ์—ฌ๋Ÿฌ ์ค„๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ฝ๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/view/mypage/component/MyClean.kt (1)

54-56: ๋นˆ ์ƒํƒœ ์ฒ˜๋ฆฌ ๊ฐœ์„ ๋จ

๋นˆ ์ƒํƒœ์ผ ๋•Œ MyPageEmptyText ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ UX ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค. ์ผ๊ด€๋œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ์•ฑ ์ „์ฒด์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

presentation/src/main/java/view/mypage/component/DemeritList.kt (1)

101-103:

Details

โ“ Verification inconclusive

๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ ๋ฐฉ์‹์„ ๊ฒ€ํ† ํ•˜์„ธ์š”.

ํ˜„์žฌ stringResource๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. R.string.stringResource๋ผ๋Š” ์ด๋ฆ„์˜ ๋ฆฌ์†Œ์Šค ID๊ฐ€ ์ ์ ˆํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  data.myBecause์™€ data.penaltyPoint๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์˜๋„ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ Script executed:

#!/bin/bash
# strings.xml ํŒŒ์ผ์—์„œ stringResource ID๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
cat $(fd -t f "strings.xml" res/values/) | grep -A 3 "stringResource"

Length of output: 166


๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค ์ •์˜ ๋ฐ ์‚ฌ์šฉ ๊ฒ€์ฆ ํ•„์š”
ํ˜„์žฌ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋œ R.string.stringResource๊ฐ€ ์‹ค์ œ๋กœ ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค ํŒŒ์ผ(strings.xml) ๋‚ด์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ ์–ธ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ „๋‹ฌ๋˜๋Š” ์ธ์ž(data.myBecause, data.penaltyPoint)๊ฐ€ ํ•ด๋‹น ๋ฌธ์ž์—ด ํฌ๋งท์˜ ์ž๋ฆฌํ‘œ์‹œ์ž์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ์žฌ๊ฒ€ํ† ํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

  • ํ”„๋กœ์ ํŠธ ๋‚ด์— strings.xml ํŒŒ์ผ์ด ์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒฝ๋กœ(์˜ˆ: presentation/src/main/res/values/strings.xml)์—์„œ stringResource ์ •์˜๋ฅผ ์žฌํ™•์ธํ•ด ์ฃผ์„ธ์š”.
  • ๋ฌธ์ž์—ด ํฌ๋งท์ด ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›๋„๋ก ์ •์˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹œ๊ณ , ๋ฆฌ์†Œ์Šค ID๊ฐ€ ์˜๋„ํ•œ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ์ ๊ฒ€ํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
presentation/src/main/java/component/until/keyboardAsState.kt (3)

33-34: ๊ตฌํ˜„์ด ์ž˜ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ „๋ฐ˜์ ์œผ๋กœ ํ‚ค๋ณด๋“œ ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๊ตฌํ˜„์ด ์ž˜ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก ๋ฐ ํ•ด์ œ๊ฐ€ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, rememberUpdatedState๋ฅผ ํ†ตํ•ด ์ตœ์‹  ์ƒํƒœ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


1-1:

Details

โœ… Verification successful

ํŒจํ‚ค์ง€ ์ด๋ฆ„ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด component.until๋กœ ๋˜์–ด ์žˆ๋Š”๋ฐ, 'until'์ด 'util'์˜ ์˜คํƒ€๋Š” ์•„๋‹Œ์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”. ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋“ค์€ 'util' ํŒจํ‚ค์ง€์— ์œ„์น˜ํ•˜๋Š” ๊ฒƒ์ด ๊ด€๋ก€์ž…๋‹ˆ๋‹ค.


๐Ÿ Script executed:

#!/bin/bash
# ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ until๊ณผ util ํŒจํ‚ค์ง€๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ
echo "Searching for 'until' packages in the project:"
find . -type d -path "*/component/until" | sort
echo "Searching for 'util' packages in the project:"
find . -type d -path "*/component/util" | sort

Length of output: 359


ํŒจํ‚ค์ง€ ๋„ค์ด๋ฐ ํ™•์ธ ์™„๋ฃŒ

๊ฒ€์ฆ ๊ฒฐ๊ณผ, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋‚ด์— ์‹ค์ œ๋กœ component/until ํŒจํ‚ค์ง€๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, component/util ํŒจํ‚ค์ง€๋Š” ํ™•์ธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ ํŒจํ‚ค์ง€ ๋ช…์ด ์˜๋„ํ•œ ๊ฒƒ์ด๋ฉด ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ด๋„ ๋˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์ธ ๊ด€๋ก€๋ฅผ ๋”ฐ๋ฅธ๋‹ค๋ฉด ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋“ค์„ ๋ณ„๋„์˜ util ํŒจํ‚ค์ง€๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ คํ•ด๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.


17-18:

Details

โŒ Incorrect review comment

Composable ํ•จ์ˆ˜ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Jetpack Compose์˜ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์— ๋”ฐ๋ฅด๋ฉด, Composable ํ•จ์ˆ˜๋Š” ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. keyboardAsState ๋Œ€์‹  KeyboardAsState๋กœ ๋ณ€๊ฒฝ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

-fun keyboardAsState(): State<Boolean> {
+fun KeyboardAsState(): State<Boolean> {

๐ŸŒ Web query:

Jetpack Compose ํ•จ์ˆ˜ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜

๐Ÿ’ก Result:

Jetpack Compose ํ•จ์ˆ˜์˜ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์€ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

1. Unit ๋ฐ˜ํ™˜ @composable ํ•จ์ˆ˜

  • PascalCase ์‚ฌ์šฉ
    UI ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  @Composable ํ•จ์ˆ˜๋Š” ๋ช…์‚ฌํ˜•์˜ PascalCase๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค[1][4][7].
    ์˜ˆ: FancyButton(), ProfileHeader()

  • ๋™์‚ฌ/ํ˜•์šฉ์‚ฌ ์‚ฌ์šฉ ๊ธˆ์ง€
    ํ•จ์ˆ˜๋ช…์ด ๋™์‚ฌ(์˜ˆ: RenderButton())๋‚˜ ํ˜•์šฉ์‚ฌ(์˜ˆ: Fancy())๋กœ ์‹œ์ž‘ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค[1][4].

์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ

@Composable
fun UserProfileCard() { /* ... */ }  // ๋ช…์‚ฌ + PascalCase

์ž˜๋ชป๋œ ์˜ˆ์‹œ

@Composable
fun drawButton() { /* ... */ }  // ๋™์‚ฌ + ์†Œ๋ฌธ์ž ์‹œ์ž‘

2. ๊ฐ’ ๋ฐ˜ํ™˜ @composable ํ•จ์ˆ˜

  • camelCase ์‚ฌ์šฉ
    Unit ์ด์™ธ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋Š” Kotlin ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์— ๋”ฐ๋ผ camelCase๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค[1][3][7].
    ์˜ˆ: defaultStyle(), rememberCoroutineScope()

  • remember ์ ‘๋‘์‚ฌ ๊ถŒ์žฅ
    ๋‚ด๋ถ€์—์„œ remember๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋Š” remember๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค[3][5].

    @Composable
    fun rememberViewModel(): MyViewModel { /* ... */ }

3. CompositionLocal ๋„ค์ด๋ฐ

  • "Local"์„ ์ ‘๋‘์‚ฌ๋กœ ์‚ฌ์šฉ
    CompositionLocal ํ‚ค๋Š” ๊ฐ’์˜ ํŠน์„ฑ์„ ์„ค๋ช…ํ•˜๋Š” ๋ช…์‚ฌ ์•ž์— Local์„ ๋ถ™์ž…๋‹ˆ๋‹ค[1][5][9].
    val LocalTheme = staticCompositionLocalOf<Theme>()  // ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ
    val ThemeLocal = staticCompositionLocalOf<Theme>()  // ์ž˜๋ชป๋œ ์˜ˆ

4. ๊ธฐํƒ€ ๊ทœ์น™

  • Modifier ์œ„์น˜
    modifier ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ์„ ํƒ์  ์ธ์ž๋กœ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค[8].

    @Composable
    fun CustomButton(
        modifier: Modifier = Modifier,  // ์ฒซ ๋ฒˆ์งธ ์„ ํƒ์  ์ธ์ž
        onClick: () -> Unit
    ) { /* ... */ }
  • Preview ํ•จ์ˆ˜
    ๋ฏธ๋ฆฌ๋ณด๊ธฐ์šฉ ํ•จ์ˆ˜์—๋Š” Preview ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค[8].

    @Preview
    @Composable
    fun UserProfileCardPreview() { /* ... */ }

๋น„๊ต ํ…Œ์ด๋ธ”: ๊ถŒ์žฅ vs ๋น„๊ถŒ์žฅ ์‚ฌ๋ก€

์œ ํ˜• ๊ถŒ์žฅ ์˜ˆ์‹œ ๋น„๊ถŒ์žฅ ์˜ˆ์‹œ
UI ์ปดํฌ์ €๋ธ” SettingsScreen() createSettingsUI()
๊ฐ’ ๋ฐ˜ํ™˜ ํ•จ์ˆ˜ calculateTextWidth() TextWidthCalculator()
CompositionLocal ํ‚ค LocalDensity DensityLocal

์ด ๊ทœ์น™๋“ค์€ Compose ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ตœ์ ํ™”์™€ ํŒ€ ํ˜‘์—… ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ช…์‚ฌํ˜• PascalCase๋Š” ์„ ์–ธ์  UI์˜ ํŠน์„ฑ์„ ๋ฐ˜์˜ํ•˜๋ฉฐ, remember ์ ‘๋‘์‚ฌ๋Š” ๊ฐ์ฒด์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค[3][5][7].

Citations:


๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ๊ฒ€์ฆ ๊ฒฐ๊ณผ: keyboardAsState ์ด๋ฆ„์ด ์˜ฌ๋ฐ”๋ฆ…๋‹ˆ๋‹ค.

ํ•ด๋‹น ํ•จ์ˆ˜๋Š” State<Boolean>์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’ ๋ฐ˜ํ™˜ @composable ํ•จ์ˆ˜์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์›น ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅด๋ฉด, ๊ฐ’ ๋ฐ˜ํ™˜ ํ•จ์ˆ˜๋Š” Kotlin ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์— ๋”ฐ๋ผ camelCase๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ํ˜„์žฌ์˜ keyboardAsState ๋„ค์ด๋ฐ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. PascalCase๋Š” UI ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Unit์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์— ๊ถŒ์žฅ๋˜๋ฏ€๋กœ, ์ด ๊ฒฝ์šฐ์—๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

Likely an incorrect or invalid review comment.

presentation/src/main/res/drawable/left.xml (1)

1-14: ์•„์ด์ฝ˜ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ” ์ •์˜ ์ ๊ฒ€
์ƒˆ๋กœ ์ถ”๊ฐ€๋œ left.xml ํŒŒ์ผ์€ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ”์„ ํ†ตํ•ด 24dp ํฌ๊ธฐ์˜ ์•„์ด์ฝ˜์„ ์ ์ ˆํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. xmlns, width, height, viewport ์†์„ฑ ๋“ฑ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง€์ •๋˜์—ˆ์œผ๋ฉฐ, <path> ์š”์†Œ์˜ ์†์„ฑ (fillColor, strokeColor, strokeWidth, strokeLineCap, pathData) ๋„ ๋””์ž์ธ ๊ฐ€์ด๋“œ์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€ ์ตœ์ข… ํ™•์ธํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

presentation/src/main/res/drawable/home.xml (1)

1-15: ํ™ˆ ์•„์ด์ฝ˜ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ” ๊ตฌ์„ฑ ์ ํ•ฉ์„ฑ ํ™•์ธ
home.xml ํŒŒ์ผ์€ 24dp ํฌ๊ธฐ ๋‚ด์—์„œ ๋‘ ๊ฐœ์˜ <path> ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด€๋œ ์ƒ‰์ƒ(#7F7F7F)์œผ๋กœ ํ™ˆ ์•„์ด์ฝ˜์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋””์ž์ธ ์š”๊ตฌ์‚ฌํ•ญ์— ๋ถ€ํ•ฉํ•˜๋ฉฐ, XML ๊ตฌ์กฐ๋„ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

presentation/src/main/res/drawable/mypage.xml (1)

1-15: ๋งˆ์ดํŽ˜์ด์ง€ ์•„์ด์ฝ˜ XML ๊ฒ€ํ† 
mypage.xml ํŒŒ์ผ์€ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„๊ณผ ๊ด€๋ จ๋œ ์•„์ด์ฝ˜์„ ์œ„ํ•œ ๋ฒกํ„ฐ ๋“œ๋กœ์–ด๋ธ”๋กœ, 24dp ํฌ๊ธฐ์™€ ์ ์ ˆํ•œ stroke ์†์„ฑ(์ƒ‰์ƒ, ๋‘๊ป˜, ๋ผ์šด๋“œ ์ฒ˜๋ฆฌ) ๋ฐ ํˆฌ๋ช…ํ•œ fillColor๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

domain/src/main/java/model/admin/response/AdminUserListResponseModel.kt (1)

10-10: AdminUserListResponseModel์— roomNum ์†์„ฑ์ด ์ž˜ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๋ชฉ๋ก ์‘๋‹ต ๋ชจ๋ธ์— ๋ฐฉ ๋ฒˆํ˜ธ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์€ ๊ธฐ์ˆ™์‚ฌ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ด ์ •๋ณด๋Š” ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ์œ ์šฉํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

domain/src/main/java/reopoistory/AuthRepository.kt (1)

18-18: ์—ญํ•  ์กฐํšŒ ๊ธฐ๋Šฅ์ด ์ž˜ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

AuthRepository์— ์‚ฌ์šฉ์ž ์—ญํ• ์„ ์กฐํšŒํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์€ ๊ถŒํ•œ ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. Flow๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฐ˜์‘ํ˜•์œผ๋กœ ์„ค๊ณ„ํ•œ ์ ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

data/src/main/java/repoistory/AuthRepositoryImpl.kt (1)

22-24: ์—ญํ•  ์กฐํšŒ ๊ธฐ๋Šฅ์ด ์ ์ ˆํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์—ญํ• ์„ ๊ฐ€์ ธ์˜ค๋Š” getRole() ๋ฉ”์„œ๋“œ๊ฐ€ localDataSource.getAuthority()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ธฐ์กด ์ฝ”๋“œ ๊ตฌ์กฐ์— ์ž˜ ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

domain/src/main/java/model/auth/response/GAuthLoginResponseModel.kt (2)

3-4: Authority ํƒ€์ž… import๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ authority ํ•„๋“œ์— ํ•„์š”ํ•œ import๋กœ, ๋กœ๊ทธ์ธ ์‘๋‹ต ๋ชจ๋ธ์— ๊ถŒํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„์ž…๋‹ˆ๋‹ค.


5-11:

Details

โ“ Verification inconclusive

์‚ฌ์šฉ์ž ๊ถŒํ•œ ์ •๋ณด ํ•„๋“œ๊ฐ€ ๋กœ๊ทธ์ธ ์‘๋‹ต ๋ชจ๋ธ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธ ์‘๋‹ต ๋ชจ๋ธ์— authority ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ์ธ์ฆ ๊ณผ์ •์—์„œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ถŒํ•œ ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ ์ ‘๊ทผ ์ œ์–ด์— ํ•„์ˆ˜์ ์ธ ๊ฐœ์„ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๊ธฐ์กด์— ์ด ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์—์„œ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ด€๋ จ ์ฝ”๋“œ๋“ค๋„ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์„ธ์š”.


๐Ÿ Script executed:

#!/bin/bash
# GAuthLoginResponseModel์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ๊ฒ€์ƒ‰
rg "GAuthLoginResponseModel" --type kotlin

Length of output: 2616


์ƒˆ๋กœ์šด 'authority' ํ•„๋“œ ์ถ”๊ฐ€ ๊ฒ€์ฆ ์™„๋ฃŒ ๋ฐ ์ถ”๊ฐ€ ํ™•์ธ ํ•„์š”

GAuthLoginResponseModel์— ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ 'authority' ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ, ์ด ๋ชจ๋ธ์ด ์—ฌ๋Ÿฌ ๊ณณ(์˜ˆ: AuthRepositoryImpl, HomesViewmodel, TokenRefreshUiState, AuthViewModel, remote/dto/auth/response/GAuthLoginResponse.kt, ๋„๋ฉ”์ธ ๋ฐ ์œ ์ฆˆ์ผ€์ด์Šค ๊ด€๋ จ ํŒŒ์ผ ๋“ฑ)์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์•„๋ž˜ ์‚ฌํ•ญ๋“ค์„ ๊ผญ ์ ๊ฒ€ํ•ด ์ฃผ์„ธ์š”:

  • ๊ด€๋ จ DTO ๋ณ€ํ™˜ ํ•จ์ˆ˜(์˜ˆ: GAuthLoginResponse.toLogin())๊ฐ€ ์ƒˆ๋กœ์šด 'authority' ํ•„๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋งคํ•‘ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€ํ† 
  • ํ•ด๋‹น ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฐ ๋ทฐ๋ชจ๋ธ ๋“ฑ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋”ฐ๋ฅธ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธ

์ „๋ฐ˜์ ์œผ๋กœ ๊ฐœ์„ ์‚ฌํ•ญ์€ ๊ธ์ •์ ์ด๋‚˜, ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ๋„ ์ƒˆ ํ•„๋“œ ์ฒ˜๋ฆฌ ๋ˆ„๋ฝ์ด ์—†๋Š”์ง€ ์žฌ๊ฒ€ํ† ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

domain/src/main/java/usecase/admin/ChangeAuthorityUseCase.kt (1)

1-6: ๊ถŒํ•œ ๋ณ€๊ฒฝ ์œ ์Šค์ผ€์ด์Šค๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ์„ค์ •์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ํŒจํ‚ค์ง€์™€ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์œ„ํ•œ import๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

domain/src/main/java/model/admin/request/AdminPenaltyRequestModel.kt (2)

3-5: ํ•„์š”ํ•œ ํƒ€์ž… import๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ํ•„๋“œ์ธ accountIdx์™€ authority ํƒ€์ž…์„ ์œ„ํ•œ import๊ฐ€ ์ ์ ˆํžˆ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


9-10:

Details

โ“ Verification inconclusive

๊ด€๋ฆฌ์ž ํŽ˜๋„ํ‹ฐ ์š”์ฒญ ๋ชจ๋ธ์— ๊ณ„์ • ์‹๋ณ„์ž์™€ ๊ถŒํ•œ ์ •๋ณด๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŽ˜๋„ํ‹ฐ ์š”์ฒญ ๋ชจ๋ธ์— ๋‹ค์Œ ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

  • accountIdx: ํŽ˜๋„ํ‹ฐ๋ฅผ ๋ถ€์—ฌํ•  ๊ณ„์ •์˜ ๊ณ ์œ  ์‹๋ณ„์ž
  • authority: ๊ณ„์ •์˜ ๊ถŒํ•œ ์ •๋ณด

์ด๋Š” ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ์—์„œ ํŠน์ • ์‚ฌ์šฉ์ž์—๊ฒŒ ํŽ˜๋„ํ‹ฐ๋ฅผ ๋ถ€์—ฌํ•  ๋•Œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

ํŽ˜๋„ํ‹ฐ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๋ฐ authority ํ•„๋“œ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŽ˜๋„ํ‹ฐ ๋ถ€์—ฌ ์‹œ ๊ถŒํ•œ ๋ณ€๊ฒฝ์ด ํ•จ๊ป˜ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ์ธ์ง€, ์•„๋‹ˆ๋ฉด ๊ถŒํ•œ ๊ฒ€์ฆ์„ ์œ„ํ•œ ๊ฒƒ์ธ์ง€ ์ฝ”๋“œ ์ฃผ์„์ด๋‚˜ ๋ฌธ์„œํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ Script executed:

#!/bin/bash
# AdminPenaltyRequestModel ์‚ฌ์šฉ ์ฝ”๋“œ์™€ ๊ด€๋ จ API ๊ฒ€์ƒ‰
rg "AdminPenaltyRequestModel" --type kotlin -A 10
rg "penaltyPoint.*authority" --type kotlin

Length of output: 11396


[ํ™•์ธ ํ•„์š”] authority ํ•„๋“œ์˜ ์—ญํ• ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ฌธ์„œํ™” ์š”์ฒญ

  • AdminPenaltyRequestModel (domain/src/main/java/model/admin/request/AdminPenaltyRequestModel.kt)์—์„œ accountIdx์™€ authority ํ•„๋“œ๊ฐ€ ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ๋ชจ๋ธ์€ DTO ๋ณ€ํ™˜ ๋ฐ ๊ด€๋ จ UseCase(์˜ˆ: PostPenaltyUseCase)์™€ Repository ๊ณ„์ธต์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋งŒ, ํ˜„์žฌ ์ฝ”๋“œ์—์„œ๋Š” authority ํ•„๋“œ๊ฐ€ ํŽ˜๋„ํ‹ฐ ๋ถ€์—ฌ ์‹œ ๊ถŒํ•œ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ๊ฒƒ์ธ์ง€, ์•„๋‹ˆ๋ฉด ๋‹จ์ˆœ ๊ถŒํ•œ ๊ฒ€์ฆ์„ ์œ„ํ•œ ๊ฒƒ์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ํŒŒ์ผ(์˜ˆ: AdminPenaltyRequest DTO, AdminRepository, AdminRepositoryImpl ๋“ฑ)์—์„œ๋„ ์ด ์ ์— ๋Œ€ํ•œ ๋ณ„๋„ ์„ค๋ช…์ด๋‚˜ ์ฃผ์„์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

์ถ”ํ›„ ํ˜ผ๋ž€์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด authority ํ•„๋“œ์˜ ์˜๋„์™€ ์‚ฌ์šฉ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•˜๋Š” ์ฝ”๋“œ ์ฃผ์„ ๋˜๋Š” ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

data/src/main/java/remote/dto/admin/response/AdminUserListResponse.kt (2)

9-15: roomNum ์†์„ฑ ์ถ”๊ฐ€ - ์ข‹์€ ๋ณ€๊ฒฝ!

AdminUserListResponse ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค์— roomNum ์†์„ฑ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์€ ์‚ฌ์šฉ์ž ์ •๋ณด์— ๋ฐฉ ๋ฒˆํ˜ธ๋ฅผ ํฌํ•จ์‹œ์ผœ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋Š” PR ๋ชฉํ‘œ์ธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ์ ์ ˆํ•œ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค.


18-24: toModel ํ•จ์ˆ˜์— roomNum ์†์„ฑ ์ถ”๊ฐ€ ์™„๋ฃŒ

๋ชจ๋ธ ๋ณ€ํ™˜ ํ•จ์ˆ˜์— roomNum ์†์„ฑ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค์™€ ๋ชจ๋ธ ํด๋ž˜์Šค ๊ฐ„์˜ ์ผ๊ด€์„ฑ์ด ์ž˜ ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

data/src/main/java/remote/dto/auth/response/GAuthLoginResponse.kt (2)

6-6: Authority ์—ด๊ฑฐํ˜• ์ถ”๊ฐ€ ๋ฐ ์ž„ํฌํŠธ

Authority ์—ด๊ฑฐํ˜•์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ž„ํฌํŠธํ•œ ๊ฒƒ์€ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์ข‹์€ ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž… ์•ˆ์ „์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.


21-22: toLogin ํ•จ์ˆ˜์— authority ์†์„ฑ ์ ์šฉ ์™„๋ฃŒ

๋ชจ๋ธ ๋ณ€ํ™˜ ํ•จ์ˆ˜์— authority ์†์„ฑ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์ •๋ณด๊ฐ€ ๋ชจ๋ธ ๊ณ„์ธต์œผ๋กœ ์ž˜ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

data/src/main/java/remote/dto/admin/response/AdminStudentLIstResponse.kt (1)

1-7: ์ž„ํฌํŠธ ๋ฐ ํŒจํ‚ค์ง€ ์„ ์–ธ ํ™•์ธ

ํ•„์š”ํ•œ ๋ชจ๋“  ์ž„ํฌํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ ์–ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

domain/src/main/java/model/admin/request/AdminCleanRequestModel.kt (2)

3-5: ํ•„์š”ํ•œ ์ž„ํฌํŠธ ์ถ”๊ฐ€

Authority์™€ UUID ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ž„ํฌํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


6-11: ๊ณ„์ • ID์™€ ๊ถŒํ•œ ์†์„ฑ ์ถ”๊ฐ€

AdminCleanRequestModel์— accountIdx์™€ authority ์†์„ฑ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์€ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๊ด€๋ฆฌ์™€ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ ์ข‹์€ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค. ์ด๋Š” PR์˜ ๋ชฉํ‘œ์ธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„๊ณผ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž ์‹๋ณ„๊ณผ ๊ถŒํ•œ ๊ฒ€์ฆ์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

data/src/main/java/remote/dto/admin/request/AdminCleanRequest.kt (1)

5-7: ๊ณ„์ • ์‹๋ณ„์ž์™€ ๊ถŒํ•œ ์ •๋ณด๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

AdminCleanRequest ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค์— accountIdx์™€ authority ์†์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์€ ๋‹ค๋ฅธ ์š”์ฒญ ๋ชจ๋ธ(์˜ˆ: AdminPenaltyRequest)๊ณผ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ๊ณ„์ • ๊ถŒํ•œ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉํ•˜๋Š” ๋ฐ ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค.

data class AdminCleanRequest(
    @Json(name = "toDayClean") val toDayClean: String,
    @Json(name = "cleanPoint") val cleanPoint: Int,
+   @Json(name = "accountIdx") val accountIdx: UUID,
+   @Json(name = "authority") val authority: Authority,
)

์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ API ํ†ต์‹  ์‹œ ์‚ฌ์šฉ์ž ์‹๋ณ„ ๋ฐ ๊ถŒํ•œ ํ™•์ธ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จ์‹œ์ผœ ๋” ์•ˆ์ „ํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์š”์ฒญ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Also applies to: 13-14, 20-21, 27-28

presentation/src/main/java/until/Result.kt (2)

1-1: ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด Untill์—์„œ until๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ผ์ธ์— ๋งž๊ฒŒ ์ ์ ˆํ•œ ์ผ€์ด์Šค ์ปจ๋ฒค์…˜์„ ์ ์šฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


8-9:

Details

โ“ Verification inconclusive

ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ 'out' ํ•œ์ •์ž๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Success ํด๋ž˜์Šค์˜ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ T์—์„œ out ํ•œ์ •์ž๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

- data class Success<out T>(val data: T) : Result<T>
+ data class Success<T>(val data: T) : Result<T>

์ฃผ์˜: Result ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์—ฌ์ „ํžˆ out T๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ, Success ํด๋ž˜์Šค์—์„œ๋Š” ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํƒ€์ž… ๊ณต๋ณ€์„ฑ(covariance)์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ผ๋ถ€ ํƒ€์ž… ๋ณ€ํ™˜ ๊ด€๋ จ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํŒจํ„ด์œผ๋กœ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ํ™•์ธํ•˜์—ฌ ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ์˜ํ–ฅ์„ ํ‰๊ฐ€ํ•ด๋ณด์„ธ์š”:


๐Ÿ Script executed:

#!/bin/bash
# Success ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„ ์ฐพ๊ธฐ
rg "Success<" --type kotlin

Length of output: 123


ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ 'out' ์ œ๊ฑฐ ์˜ํ–ฅ ์žฌํ™•์ธ

๊ฒ€์ฆ ๊ฒฐ๊ณผ, Success ํด๋ž˜์Šค ์‚ฌ์šฉ์€ ํ˜„์žฌ presentation/src/main/java/until/Result.kt ํŒŒ์ผ ๋‚ด์—๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, Result ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์—ฌ์ „ํžˆ out T๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, Success ํด๋ž˜์Šค์—์„œ out ํ•œ์ •์ž๋ฅผ ์ œ๊ฑฐํ•œ ๋ณ€๊ฒฝ์ด ํƒ€์ž… ๊ณต๋ณ€์„ฑ์— ์˜ํ–ฅ์„ ์ค„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ํŠน์ • ์ƒํ™ฉ์—์„œ ํƒ€์ž… ๋ณ€ํ™˜ ๊ด€๋ จ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ, ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ „๋ฐ˜์ ์ธ ํƒ€์ž… ์•ˆ์ •์„ฑ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”์ง€ ์ถ”๊ฐ€ ํ™•์ธํ•ด์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

  • ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ:
    - data class Success<out T>(val data: T) : Result<T>
    + data class Success<T>(val data: T) : Result<T>
data/src/main/java/remote/dto/admin/response/AdminPenaltyListResponse.kt (1)

9-9: JSON ํ•„๋“œ ์ด๋ฆ„ ์˜คํƒ€๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

pointList ์†์„ฑ์˜ JSON ์–ด๋…ธํ…Œ์ด์…˜์ด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

- @Json(name = "ponitList") val pointList: Int,
+ @Json(name = "pointList") val pointList: Int,

์ด ์ˆ˜์ •์œผ๋กœ JSON ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ๊ณผ์ •์—์„œ ํ•„๋“œ์™€ ์†์„ฑ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐฑ์—”๋“œ API์™€์˜ ํ†ต์‹ ์—์„œ ์ž ์žฌ์ ์ธ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์ค‘์š”ํ•œ ์ˆ˜์ •์ž…๋‹ˆ๋‹ค.

data/src/main/java/remote/dto/admin/request/AuthorityRequest.kt (2)

8-12: ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค ๊ตฌ์กฐ๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

AuthorityRequest ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๊ฐ€ Moshi ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•œ ์ ์ ˆํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. accountIdx์™€ authority ํ•„๋“œ ๋ชจ๋‘ JSON ๋งคํ•‘์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


14-17: ๋ชจ๋ธ ๋ณ€ํ™˜ ๋กœ์ง์ด ์ž˜ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

AuthorityRequestModel์„ DTO๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ™•์žฅ ํ•จ์ˆ˜๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

domain/src/main/java/usecase/admin/GetStudentSearchUseCase.kt (2)

8-10: ํด๋ž˜์Šค ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด GetUsersNameUseCase์—์„œ GetStudentSearchUseCase๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๊ธฐ๋Šฅ์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


11-12: ๋ฉ”์†Œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ๋ณ€๊ฒฝ๊ณผ ๊ธฐ๋Šฅ ํ˜ธ์ถœ ๋ณ€๊ฒฝ์ด ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ nullable(String?)์—์„œ non-nullable(String)๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๊ณ , ํ˜ธ์ถœ ๋ฉ”์†Œ๋“œ๋„ getUsersName์—์„œ getStudentSearch๋กœ ์ผ๊ด€๋˜๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์˜ ๋ชฉ์ ์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ๊ฐœ์„ ๋œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

data/src/main/java/local/datasource/LocalDataSourceImpl.kt (3)

14-20: ๊ถŒํ•œ ๊ด€๋ จ ํ‚ค ์ถ”๊ฐ€๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

AUTHORITY ํ‚ค๊ฐ€ ๋‹ค๋ฅธ ์ธ์ฆ ๊ด€๋ จ ํ‚ค๋“ค๊ณผ ํ•จ๊ป˜ AuthDataStoreKey companion object์— ์ž˜ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


22-25: ๊ถŒํ•œ ์กฐํšŒ ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๊ถŒํ•œ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” getAuthority() ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์กฐํšŒ ๋ฉ”์†Œ๋“œ๋“ค๊ณผ ๋™์ผํ•œ ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถŒํ•œ์ด ์—†์„ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ๋„ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.


27-31: ๊ถŒํ•œ ์„ค์ • ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๊ถŒํ•œ์„ ์„ค์ •ํ•˜๋Š” setAuthority() ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์„ค์ • ๋ฉ”์†Œ๋“œ๋“ค๊ณผ ๋™์ผํ•œ ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/view/main/component/StudentPatch.kt (4)

22-27: ์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

StudentPatch ์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ Modifier์™€ ํด๋ฆญ ์ด๋ฒคํŠธ ์ฝœ๋ฐฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


28-37: Row ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

DoMaAndroidTheme์„ ์ ์šฉํ•˜๊ณ  Row ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด์šฉ์„ ์ˆ˜ํ‰์œผ๋กœ ๋ฐฐ์น˜ํ•˜๋Š” ๊ตฌ์„ฑ์ด ์ž˜ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐ์™€ ํŒจ๋”ฉ, ์ •๋ ฌ ์„ค์ •์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.


38-47: ํ…์ŠคํŠธ ์Šคํƒ€์ผ ์„ค์ •์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

"๋ฒŒ์  ์ฃผ๊ธฐ" ํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์Šคํƒ€์ผ์ด ์ ์ ˆํ•˜๊ฒŒ ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํฐํŠธ ํฌ๊ธฐ, ํŒจ๋ฐ€๋ฆฌ, ๋‘๊ป˜, ์ƒ‰์ƒ ๋ฐ ์ •๋ ฌ์ด ์ž˜ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


48-53:

Details

โ“ Verification inconclusive

IconButton์—์„œ DoMaIcon ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

DoMaIcon()์„ ์‚ฌ์šฉํ•  ๋•Œ ์–ด๋–ค ์•„์ด์ฝ˜์„ ํ‘œ์‹œํ• ์ง€์— ๋Œ€ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. IconButton์˜ onClick ํ•จ์ˆ˜ ๋‚ด๋ถ€์— onStudentPatchClick() ํ•จ์ˆ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ˜ธ์ถœ๋˜๊ณ  ์žˆ์ง€๋งŒ, DoMaIcon์— ์•„์ด์ฝ˜ ์œ ํ˜•์ด๋‚˜ ์ถ”๊ฐ€ ์†์„ฑ์ด ์ „๋‹ฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.


๐Ÿ Script executed:

#!/bin/bash
# DoMaIcon ์ปดํฌ๋„ŒํŠธ ์ •์˜๋ฅผ ํ™•์ธ
ast-grep --pattern "fun DoMaIcon" -A 20

Length of output: 41


๊ฒ€์ฆ ์š”์ฒญ: DoMaIcon ์ปดํฌ๋„ŒํŠธ ์ •์˜ ์žฌํ™•์ธ ํ•„์š”

ํ˜„์žฌ IconButton ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ๋˜๋Š” DoMaIcon()์— ์•„์ด์ฝ˜ ์ข…๋ฅ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ์ธ์ž๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์‹คํ–‰ํ•œ ast-grep ๋ช…๋ น์–ด์—์„œ๋Š” DoMaIcon ํ•จ์ˆ˜ ์ •์˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์•„ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ”„๋กœ์ ํŠธ ๋‚ด ์–ด๋””์—์„œ ์ •์˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

  • DoMaIcon ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ๋ณ„๋„ ํŒŒ์ผ์—์„œ ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ธ์ž ์ „๋‹ฌ์ด ํ•„์š”ํ•œ์ง€ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.
  • ์ •์˜๊ฐ€ ํ”„๋กœ์ ํŠธ ๋‚ด์— ์กด์žฌํ•œ๋‹ค๋ฉด, ์˜ฌ๋ฐ”๋ฅธ ์•„์ด์ฝ˜ ์‹๋ณ„์ž(์˜ˆ: icon parameter)๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ ์ •์˜์™€ ์‚ฌ์šฉ๋ฒ•์„ ์ˆ˜๋™์œผ๋กœ ์žฌ๊ฒ€ํ† ํ•˜์—ฌ, ์˜๋„ํ•œ ์ธ์ž ์ „๋‹ฌ์ด ์ด๋ค„์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
presentation/src/main/java/viewModel/login/uiState/TokenRefreshUiState.kt (1)

5-9: ํ† ํฐ ๊ฐฑ์‹  UI ์ƒํƒœ๊ฐ€ ์ž˜ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ† ํฐ ๊ฐฑ์‹  ์ž‘์—…์˜ ๋‹ค์–‘ํ•œ ์ƒํƒœ(๋กœ๋”ฉ, ์„ฑ๊ณต, ์˜ค๋ฅ˜)๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•˜๊ณ  Kotlin์˜ sealed interface ๊ธฐ๋Šฅ์„ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

data/src/main/java/remote/dto/admin/request/AdminPenaltyRequest.kt (2)

5-7: ์ƒˆ๋กœ์šด import๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Authority ์—ด๊ฑฐํ˜•๊ณผ UUID ํƒ€์ž…์ด ์ถ”๊ฐ€๋˜์–ด ๊ถŒํ•œ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ด ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


18-23: toDto() ํ•จ์ˆ˜์— ์ƒˆ ์†์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Model์„ DTO๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์— accountIdx์™€ authority ํ•„๋“œ๊ฐ€ ์ ์ ˆํžˆ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

domain/src/main/java/reopoistory/AdminRepository.kt (9)

6-6: ์ƒˆ๋กœ์šด ์š”์ฒญ ๋ชจ๋ธ ์ถ”๊ฐ€ ํ™•์ธ.

AuthorityRequestModel ์ž„ํฌํŠธ๊ฐ€ ๊ถŒํ•œ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


15-15:

Details

โ“ Verification inconclusive

API ๋ฉ”์†Œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

getUsersName(name: String?) ๋ฉ”์†Œ๋“œ๊ฐ€ getStudentSearch(name: String)๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค. String? ์—์„œ String์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์ด์ œ null ๊ฐ’์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์—์„œ ์ด ๋ณ€ํ™”์— ๋งž๊ฒŒ ์กฐ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ Script executed:

#!/bin/bash
# ์ด์ „ getUsersName ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ™•์ธ
rg "getUsersName\(" --type kotlin

Length of output: 35


API ๋ฉ”์†Œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ณ€๊ฒฝ โ€“ ํ˜ธ์ถœ๋ถ€ ์ถ”๊ฐ€ ๊ฒ€์ฆ ์š”์ฒญ

ํ•ด๋‹น ์ปค๋ฐ‹์—์„œ ๊ธฐ์กด์˜ getUsersName(name: String?) ๋ฉ”์†Œ๋“œ๊ฐ€ getStudentSearch(name: String)๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์ด String?์—์„œ String์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด, ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์—์„œ๋„ null ๊ฐ’ ์ „๋‹ฌ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋„๋ก ์กฐ์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๊ฒ€์ฆ: AdminRepository.kt ํŒŒ์ผ์—์„œ ๋ณ€๊ฒฝ๋œ ๋ฉ”์†Œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ํ™•์ธํ•˜์˜€์œผ๋ฉฐ, rg "getUsersName(" --type kotlin ๋ช…๋ น์–ด๋กœ ํ˜ธ์ถœ๋ถ€๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•„, ๊ธฐ์กด ํ˜ธ์ถœ๋ถ€๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ๊ฑฐ๋‚˜ ์ˆ˜์ •๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€ ๊ฒ€์ฆ ์š”์ฒญ: ๋‹ค๋งŒ, ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ๋‚ฎ์€ ํ’ˆ์งˆ์˜ ์ถ”๋ก ์— ๊ธฐ๋ฐ˜๋œ ๊ฒƒ์ด๋ฏ€๋กœ, ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์—ฌ์ „ํžˆ getUsersName์„ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์ด ์—†๋Š”์ง€ ์ˆ˜๋™์œผ๋กœ ์žฌ๊ฒ€์ฆํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

17-17:

Details

โ“ Verification inconclusive

๊ถŒํ•œ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด changeAuthority ๋ฉ”์†Œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„๋ถ€๊ฐ€ ๋ชจ๋“  ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”.


๐Ÿ Script executed:

#!/bin/bash
# AdminRepository ๊ตฌํ˜„์ฒด์—์„œ changeAuthority ๊ตฌํ˜„ ์—ฌ๋ถ€ ํ™•์ธ
rg "class \w+Impl.*?implements AdminRepository" -A 30 --multiline | rg "override fun changeAuthority"

Length of output: 103


ํ™•์ธ ํ•„์š”: changeAuthority ์˜ค๋ฒ„๋ผ์ด๋“œ ๊ตฌํ˜„ ๊ด€๋ จ

ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฒ€์ƒ‰ํ•œ ๊ฒฐ๊ณผ, AdminRepository๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค์—์„œ override fun changeAuthority๊ฐ€ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
์ด๋กœ ์ธํ•ด ์ถ”๊ฐ€ ๊ฒ€์ฆ์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  AdminRepository ๊ตฌํ˜„ ํด๋ž˜์Šค(*Impl)์—์„œ changeAuthority ๋ฉ”์†Œ๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์˜ค๋ฒ„๋ผ์ด๋“œ๋˜์–ด ๊ตฌํ˜„๋˜์—ˆ๋Š”์ง€ ์ˆ˜๋™์œผ๋กœ ํ™•์ธํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  • Kotlin์—์„œ๋Š” ํด๋ž˜์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ implements๊ฐ€ ์•„๋‹ˆ๋ผ :๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •๋œ ์ •๊ทœ์‹์œผ๋กœ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฒ€์ฆํ•ด ๋ณด์‹œ๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฒ€์ฆ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ, ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ชจ๋“  ๊ตฌํ˜„์ฒด์— ์ถ”๊ฐ€๋˜์—ˆ๋‹ค๋ฉด ์ด ๋ฆฌ๋ทฐ๋Š” ํ•ด๊ฒฐ๋œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ถ”๊ฐ€ ๊ตฌํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ Script executed:

#!/bin/bash
# AdminRepository ๊ตฌํ˜„์ฒด์—์„œ changeAuthority ๊ตฌํ˜„ ์—ฌ๋ถ€ ์žฌ๊ฒ€์ฆ (Kotlin ๋ฌธ๋ฒ• ':' ์‚ฌ์šฉ)
rg -t kotlin "class \w+Impl\s*:\s*AdminRepository" -A 50 --multiline | rg "override fun changeAuthority"

Length of output: 228


์กฐ์น˜ ํ•„์š”: ๋ชจ๋“  ๊ตฌํ˜„์ฒด์— changeAuthority ์˜ค๋ฒ„๋ผ์ด๋“œ ํ™•์ธ

์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์žฌ๊ฒ€์ฆํ•œ ๊ฒฐ๊ณผ, AdminRepository๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค(์˜ˆ: *Impl)์—์„œ override fun changeAuthority ๊ตฌ๋ฌธ์ด ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Kotlin์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ์‹œ implements ๋Œ€์‹  :๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ˆ˜์ •๋œ ์ •๊ทœ์‹์œผ๋กœ๋„ ๊ธฐ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ชจ๋“  ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ์ˆ˜๋™ ๊ฒ€์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ํ™•์ธ ๋Œ€์ƒ: ๋ชจ๋“  AdminRepository ๊ตฌํ˜„ ํด๋ž˜์Šค (์˜ˆ: *Impl)
  • ๊ฒ€์ฆ ํฌ์ธํŠธ: changeAuthority ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋“œ ์—ฌ๋ถ€

6-6: ์ƒˆ๋กœ์šด ๊ถŒํ•œ ๊ด€๋ฆฌ ๋ชจ๋ธ ์ž„ํฌํŠธ ์ถ”๊ฐ€

AuthorityRequestModel์˜ ์ž„ํฌํŠธ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ถŒํ•œ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ์ค‘์š”ํ•œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.


15-15: ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๊ฐœ์„ 

๊ธฐ์กด getUsersName(name: String?) ๋ฉ”์„œ๋“œ๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ๋„ ํ—ˆ์šฉ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” getStudentSearch(name: String)๋กœ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์€ ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋กœ์จ ๋„ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋ถ€๋‹ด์ด ์ค„๊ณ  ๋ช…ํ™•ํ•œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


17-17: ๊ถŒํ•œ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

์ƒˆ๋กœ์šด ๊ถŒํ•œ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Flow<Unit> ๋ฐ˜ํ™˜ ํƒ€์ž…์€ ์ž‘์—… ์™„๋ฃŒ ์‹ ํ˜ธ๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.


6-6: ์ ์ ˆํ•œ ์ž„ํฌํŠธ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ถŒํ•œ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ AuthorityRequestModel ์ž„ํฌํŠธ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


15-15: ๋ฉ”์†Œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๊ฐœ์„ ์ด ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค.

์ด์ „ getUsersName(name: String?) ๋ฉ”์†Œ๋“œ๊ฐ€ getStudentSearch(name: String)๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ nullable์—์„œ non-nullable๋กœ ๋ณ€๊ฒฝ๋˜์–ด ํ•ญ์ƒ ์œ ํšจํ•œ ์ด๋ฆ„์ด ์ œ๊ณต๋˜์–ด์•ผ ํ•จ์„ ๋ช…ํ™•ํžˆ ํ–ˆ์Šต๋‹ˆ๋‹ค.


17-17: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ถŒํ•œ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ changeAuthority ๋ฉ”์†Œ๋“œ๊ฐ€ ์ ์ ˆํžˆ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Flow<Unit> ๋ฐ˜ํ™˜ ํƒ€์ž…์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ์ž‘์—…์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

presentation/src/main/java/viewModel/admin/AdminViewModel.kt (5)

3-3: ํด๋ž˜์Šค๋ช… ๋ณ€๊ฒฝ ์ ์šฉ๋จ

Untill ํด๋ž˜์Šค๋ช…์ด until๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์†Œ๋ฌธ์ž ์‹œ์ž‘์€ Kotlin ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์— ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.


52-62: ํด๋ž˜์Šค๋ช… ์ฐธ์กฐ ์—…๋ฐ์ดํŠธ ์™„๋ฃŒ

๋ชจ๋“  Untill.Result ์ฐธ์กฐ๊ฐ€ until.Result๋กœ ์ผ๊ด€๋˜๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


67-90: ์ฝ”๋“œ ํฌ๋งทํŒ… ๊ฐœ์„ 

postPenalty ๋ฉ”์†Œ๋“œ์˜ ๋“ค์—ฌ์“ฐ๊ธฐ์™€ ํฌ๋งทํŒ…์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๊ด€๋œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ๋กœ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


97-107: ํด๋ž˜์Šค๋ช… ์ฐธ์กฐ ์—…๋ฐ์ดํŠธ ์™„๋ฃŒ

getPenaltyList์—์„œ๋„ until.Result ์ฐธ์กฐ๋กœ ์ผ๊ด€๋˜๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


114-135: ์ฝ”๋“œ ํฌ๋งทํŒ… ๊ฐœ์„ 

postClean ๋ฉ”์†Œ๋“œ์˜ ๋“ค์—ฌ์“ฐ๊ธฐ์™€ ํŒŒ๋ผ๋ฏธํ„ฐ ํฌ๋งทํŒ…์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/component/designsystem/DomaSearchTextField.kt (15)

36-52: ์ž˜ ์„ค๊ณ„๋œ API ๊ตฌ์กฐ

DomaSearchTextField ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ํ’๋ถ€ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ธํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ ํŽธ์˜์„ฑ๋„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.


57-61: ํšจ์œจ์ ์ธ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

DisposableEffect๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ํ•ด์ œ ์‹œ ํฌ์ปค์Šค๋ฅผ ์ •๋ฆฌํ•˜๊ณ , LaunchedEffect๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ฐ”์šด์Šค ๊ธฐ๋Šฅ์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Also applies to: 63-66


71-74: ์ž…๋ ฅ ํ•„ํ„ฐ๋ง ๋กœ์ง ๊ฒ€ํ†  ํ•„์š”

ํ˜„์žฌ ๋ชจ๋“  ๊ณต๋ฐฑ์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰ํ•  ๋•Œ ๋‹จ์–ด ์‚ฌ์ด์˜ ๊ณต๋ฐฑ์„ ๋„ฃ์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜๋„์ ์ธ ์„ค๊ณ„์ธ์ง€ ํ™•์ธํ•ด ์ฃผ์„ธ์š”. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒ€์ƒ‰์—์„œ๋Š” ๊ณต๋ฐฑ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ณต๋ฐฑ์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ๋Š”์ง€, ํ˜น์€ ์ด๊ฒƒ์ด ์˜๋„์ ์ธ ์„ค๊ณ„์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


122-129: ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ตฌํ˜„ ์ข‹์Œ

๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.


37-52: ๊ฒ€์ƒ‰ ํ•„๋“œ ์ปดํฌ๋„ŒํŠธ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ตฌ์„ฑ

์ž˜ ์„ค๊ณ„๋œ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๊ธฐ๋ณธ๊ฐ’์„ ํ†ตํ•ด ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ debounceTime ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์—์„œ ๋ถˆํ•„์š”ํ•œ API ํ˜ธ์ถœ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.


63-66: ๋””๋ฐ”์šด์Šค ์ฒ˜๋ฆฌ ๊ตฌํ˜„

LaunchedEffect์™€ delay๋ฅผ ์‚ฌ์šฉํ•œ ๋””๋ฐ”์šด์Šค ๊ตฌํ˜„์ด ์ž˜ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ค‘์— ๋ถˆํ•„์š”ํ•œ ๊ฒ€์ƒ‰ ์š”์ฒญ์„ ์ค„์ด๋Š” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.


71-74: ๋ชจ๋“  ๊ณต๋ฐฑ ๋ฌธ์ž ํ•„ํ„ฐ๋ง ๋กœ์ง ๊ฒ€ํ†  ํ•„์š”

ํ˜„์žฌ ์ฝ”๋“œ๋Š” ๋ชจ๋“  ๊ณต๋ฐฑ ๋ฌธ์ž๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ถ€ ๊ฒ€์ƒ‰ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์–ด์— ๊ณต๋ฐฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ(์˜ˆ: "ํ™ ๊ธธ๋™")๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- val filteredText = it.filterNot { text -> text.isWhitespace() }
+ val filteredText = it.trim() // ์•ž๋’ค ๊ณต๋ฐฑ๋งŒ ์ œ๊ฑฐํ•˜๊ณ  ๋‹จ์–ด ์‚ฌ์ด ๊ณต๋ฐฑ์€ ์œ ์ง€

102-103: ํ…์ŠคํŠธ ์ƒ‰์ƒ๊ณผ ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ ํ™•์ธ ํ•„์š”

ํ…์ŠคํŠธ ์ƒ‰์ƒ๊ณผ ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ์ด ๋ชจ๋‘ MAIN์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ ์ ˆํ•œ ๋Œ€๋น„๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ€๋…์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ‰์ƒ ๋Œ€๋น„๋ฅผ ํ™•์ธํ•˜๊ณ  ํ•„์š”ํ•˜๋ฉด ์กฐ์ •ํ•ด ์ฃผ์„ธ์š”.


1-33: ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ ๋ฐ ์ž„ํฌํŠธ๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ๊ตฌ์„ฑ๊ณผ ํ•„์š”ํ•œ Compose ๋ฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์˜์กด์„ฑ ์ž„ํฌํŠธ๊ฐ€ ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


34-34: ์ƒ์ˆ˜ ์ •์˜๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๋นˆ ๋ฌธ์ž์—ด์„ ์œ„ํ•œ EMPTY ์ƒ์ˆ˜๊ฐ€ ์ž˜ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


36-52: ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์ด ํฌ๊ด„์ ์ž…๋‹ˆ๋‹ค.

ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง„ ํฌ๊ด„์ ์ธ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์ด ์ž˜ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


57-61: ์ž์› ๊ด€๋ฆฌ๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ DisposableEffect๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ์ปค์Šค๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ž์› ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.


63-66: ๋””๋ฐ”์šด์Šค ๊ตฌํ˜„์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

LaunchedEffect๋ฅผ ์‚ฌ์šฉํ•œ ๋””๋ฐ”์šด์Šค ๊ตฌํ˜„์€ ๊ณผ๋„ํ•œ ๊ฒ€์ƒ‰ ์ž‘์—…์„ ๋ฐฉ์ง€ํ•˜๋Š” ์ข‹์€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์ž…๋‹ˆ๋‹ค.


72-73: ๊ณต๋ฐฑ ํ•„ํ„ฐ๋ง ๋กœ์ง์„ ๊ฒ€ํ† ํ•ด์ฃผ์„ธ์š”.

ํ˜„์žฌ ๊ตฌํ˜„์€ ์ž…๋ ฅ์—์„œ ๋ชจ๋“  ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ณต๋ฐฑ์ด ํฌํ•จ๋œ ๊ตฌ๋ฌธ์„ ๊ฒ€์ƒ‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ์˜๋„ํ•˜์ง€ ์•Š์€ ๋™์ž‘์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ํ˜„์žฌ ๊ตฌํ˜„:
val filteredText = it.filterNot { text -> text.isWhitespace() }

// ๋Œ€์•ˆ ๊ตฌํ˜„ (์—ฐ์†๋œ ๊ณต๋ฐฑ๋งŒ ์ œ๊ฑฐ):
val filteredText = it.replace("\\s+".toRegex(), " ").trim()

122-129: ํ”„๋ฆฌ๋ทฐ ์ปดํฌ์ €๋ธ”์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

IDE์—์„œ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ”„๋ฆฌ๋ทฐ ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ•„์š”ํ•œ ์ตœ์†Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

data/src/main/java/remote/datasource/admin/AdminDataSourceImpl.kt (3)

21-23: ํ•™์ƒ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ

getStudentSearch ๋ฉ”์†Œ๋“œ๊ฐ€ ์ ์ ˆํžˆ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ null์ด ์•„๋‹Œ ๋ฌธ์ž์—ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ•์ œํ•˜์—ฌ API์˜ ์•ˆ์ •์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


24-25: ๊ถŒํ•œ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ

changeAuthority ๋ฉ”์†Œ๋“œ๊ฐ€ ์ ์ ˆํžˆ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. API ํ˜ธ์ถœ ์‹œ performApiRequest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ์‘๋‹ต ๋ณ€ํ™˜์„ ์ผ๊ด€๋˜๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


1-38:

Details

โ“ Verification inconclusive

๋ฏธ์‚ฌ์šฉ ๋ฉ”์†Œ๋“œ ์ œ๊ฑฐ ํ™•์ธ ํ•„์š”

getUsersName ๋ฉ”์†Œ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค๋งŒ, ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ Script executed:

#!/bin/bash
# getUsersName ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ™•์ธ
rg "getUsersName\(" --type kotlin

Length of output: 35


๊ฒ€์ฆ ์š”์ฒญ: ๋ฏธ์‚ฌ์šฉ ๋ฉ”์†Œ๋“œ ์ œ๊ฑฐ ๊ด€๋ จ ์ˆ˜๋™ ํ™•์ธ ํ•„์š”

์ž๋™ ๊ฒ€์ƒ‰ ๋„๊ตฌ(rg "getUsersName\(" --type kotlin)๋กœ ํ™•์ธํ•œ ๊ฒฐ๊ณผ, ์ฝ”๋“œ๋ฒ ์ด์Šค ๋‚ด์—์„œ getUsersName ํ˜ธ์ถœ ๋ถ€๋ถ„์ด ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์ž๋™ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์‹ ๋ขฐ์„ฑ์ด ์™„๋ฒฝํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹ค์ œ ์‚ฌ์šฉ์ฒ˜๊ฐ€ ๋ชจ๋‘ ๋ฐ˜์˜๋˜์—ˆ๋Š”์ง€ ์ง์ ‘ ์ˆ˜๋™์œผ๋กœ ๊ฒ€์ฆํ•ด ์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

  • ํ™•์ธ ํŒŒ์ผ: data/src/main/java/remote/datasource/admin/AdminDataSourceImpl.kt
  • ๊ฒ€์ฆ ํ•ญ๋ชฉ: getUsersName ๋ฉ”์†Œ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ๊ณ , ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋˜ ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
presentation/src/main/java/viewModel/homes/uistate/StudentSearchUiState.kt (1)

5-11: ์ž˜ ๊ตฌํ˜„๋œ ์ƒํƒœ ๊ด€๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค!

๊ฒ€์ƒ‰ UI์˜ ๋‹ค์–‘ํ•œ ์ƒํƒœ๋ฅผ sealed interface๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•œ ์ ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Loading, Empty, QueryEmpty, Success, Error ์ƒํƒœ๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ํฌ๊ด„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ Success ์ƒํƒœ์—์„œ ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๊ณ , Error ์ƒํƒœ์—์„œ ์˜ˆ์™ธ๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ๋ฐฉ์‹์ด ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

presentation/src/main/java/component/modifier/DoMaIcon.kt (3)

14-24: ์ ์ ˆํ•˜๊ฒŒ ๊ตฌํ˜„๋œ ์•„์ด์ฝ˜ ์ปดํฌ์ €๋ธ”์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


37-48: ์ ์ ˆํ•˜๊ฒŒ ๊ตฌํ˜„๋œ ์•„์ด์ฝ˜ ์ปดํฌ์ €๋ธ”์ž…๋‹ˆ๋‹ค.

์„ ํƒ ์ƒํƒœ์— ๋”ฐ๋ผ ์ƒ‰์ƒ์ด ์ ์ ˆํžˆ ๋ณ€๊ฒฝ๋˜๋„๋ก ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


49-60: ์ ์ ˆํ•˜๊ฒŒ ๊ตฌํ˜„๋œ ์•„์ด์ฝ˜ ์ปดํฌ์ €๋ธ”์ž…๋‹ˆ๋‹ค.

์„ ํƒ ์ƒํƒœ์— ๋”ฐ๋ผ ์ƒ‰์ƒ์ด ์ ์ ˆํžˆ ๋ณ€๊ฒฝ๋˜๋„๋ก ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/component/combinationvIew/CombinationViewNavigation.kt (1)

8-12: ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌํ˜„๋œ ๋„ค๋น„๊ฒŒ์ด์…˜ ํ™•์žฅ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

NavController์˜ ํ™•์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋กœ์ง์„ ์บก์Аํ™”ํ•œ ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/view/main/screen/MainScreen.kt (3)

55-84: MainRoute ํ•จ์ˆ˜๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ViewModel์˜ ์ƒํƒœ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  MainScreen์— ์ „๋‹ฌํ•˜๋Š” ํŒจํ„ด์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. Authority ์—ด๊ฑฐํ˜•์˜ ์‚ฌ์šฉ๋„ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.


104-113: ์ดˆ๊ธฐํ™” ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

LaunchedEffect์™€ DisposableEffect์˜ ์‚ฌ์šฉ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ์ž์› ์ •๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


250-268: ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/view/main/navigation/MainNavigation.kt (3)

11-12: ์ƒˆ๋กœ์šด ๋ผ์šฐํŠธ ์ƒ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ผ์šฐํŠธ ์ƒ์ˆ˜๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜๋Š” ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.


19-21: ์ƒˆ๋กœ์šด ๋„ค๋น„๊ฒŒ์ด์…˜ ํ™•์žฅ ํ•จ์ˆ˜ ์ถ”๊ฐ€

NavController์— ์ ์ ˆํ•œ ํ™•์žฅ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋””๋ฉ”๋ฆฟ ํฌ์ŠคํŠธ ํ™”๋ฉด์œผ๋กœ ์‰ฝ๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ์˜ต์…˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋„ ์ž˜ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


23-33: postDemeritScreen ๊ตฌํ˜„

NavGraphBuilder์— postDemeritScreen ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋””๋ฉ”๋ฆฟ ํฌ์ŠคํŠธ ํ™”๋ฉด์„ composable๋กœ ๋“ฑ๋กํ•˜์…จ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค๋„ ์ž˜ ์ „๋‹ฌ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

data/src/main/java/remote/api/auth/AdminAPI.kt (4)

22-25: ๊ถŒํ•œ ๋ณ€๊ฒฝ API ์ถ”๊ฐ€

๊ถŒํ•œ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด API ๋ฉ”์†Œ๋“œ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•˜์…จ์Šต๋‹ˆ๋‹ค. PATCH ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.


28-30: getStudentSearch ๋ฉ”์†Œ๋“œ ์ˆ˜์ •

๋ฉ”์†Œ๋“œ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์ด String?์—์„œ String์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” null ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋„๋ก ๋ณ€๊ฒฝ๋œ ๊ฒƒ์ธ๋ฐ, ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ์—์„œ null ์ฒดํฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ณ€๊ฒฝ์ด ๊ธฐ์กด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”. ํŠนํžˆ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์—์„œ null ๊ฐ’์„ ์ „๋‹ฌํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


32-36: ๊ฒฝ๋กœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ API ์—”๋“œํฌ์ธํŠธ ๊ฐœ์„ 

ํ•˜๋“œ์ฝ”๋”ฉ๋œ "user_id" ๋Œ€์‹  ๊ฒฝ๋กœ ๋ณ€์ˆ˜ "{user_id}"๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐœ์„ ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋” ์œ ์—ฐํ•œ API ๊ตฌํ˜„์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.


41-45: clean API ์—”๋“œํฌ์ธํŠธ ๊ฒฝ๋กœ ๊ฐœ์„ 

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ postClean API์—์„œ๋„ ๊ฒฝ๋กœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐœ์„ ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ์ด์ „ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฐฉ์‹๋ณด๋‹ค ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

presentation/src/main/java/component/combinationvIew/DoMaCombinationView.kt (1)

29-58: DomaCombinationView ๊ตฌํ˜„

Scaffold์™€ ์กฐ๊ฑด๋ถ€ ๋ผ์šฐํŠธ ๋ Œ๋”๋ง ๊ตฌํ˜„์ด ์ž˜ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋Œ€์ƒ๋ณ„๋กœ ์ ์ ˆํ•œ ๋ผ์šฐํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ํ•„์š”ํ•œ ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋งŒ, when ํ‘œํ˜„์‹์ด exhaustiveํ•˜๊ธฐ ๋•Œ๋ฌธ์— DomaNavBarItemType์ด ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ ์ด ์ฝ”๋“œ๋„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ผ€์ด์Šค(else)๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/view/main/screen/PostDemeritSearchScreen.kt (2)

41-60: PostDemeritSearchRoute ๊ตฌํ˜„์ด ์ž˜ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ViewModel์—์„œ ์ƒํƒœ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ํ™”๋ฉด์— ์ „๋‹ฌํ•˜๋Š” ํŒจํ„ด์ด ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


136-142: SearchList ์ปดํฌ๋„ŒํŠธ์˜ ์‚ฌ์šฉ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

UI ์ƒํƒœ์™€ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ์ž˜ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

data/src/main/java/repoistory/AdminRepositoryImpl.kt (4)

22-24: ๊ถŒํ•œ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์ด ์ž˜ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด changeAuthority ๋ฉ”์†Œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ด ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


25-27: ํ•™์ƒ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์ด ์ ์ ˆํžˆ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

getStudentSearch ๋ฉ”์†Œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์ด๋ฆ„์œผ๋กœ ํ•™์ƒ์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


31-32: ๋ฉ”์†Œ๋“œ ์„œ๋ช…์ด ์ •๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด์˜ ๋ณต์žกํ•œ ํ˜•์‹์ด ๋‹จ์ˆœํ™”๋˜์–ด ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


37-38: ๋ฉ”์†Œ๋“œ ์„œ๋ช…์ด ์ •๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด์˜ ๋ณต์žกํ•œ ํ˜•์‹์ด ๋‹จ์ˆœํ™”๋˜์–ด ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

data/src/main/java/remote/datasource/admin/AdminDataSource.kt (4)

17-17: ๊ถŒํ•œ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์ด ์ธํ„ฐํŽ˜์ด์Šค์— ์ž˜ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

changeAuthority ๋ฉ”์†Œ๋“œ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์— ์ถ”๊ฐ€๋˜์–ด ๊ถŒํ•œ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ด ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


19-20: ํ•™์ƒ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์ด ์ธํ„ฐํŽ˜์ด์Šค์— ์ž˜ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

getStudentSearch ๋ฉ”์†Œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์ด๋ฆ„์œผ๋กœ ํ•™์ƒ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


21-21: ๋ฉ”์†Œ๋“œ ์„œ๋ช…์ด ์ •๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด์˜ ๋ณต์žกํ•œ ํ˜•์‹์ด ๋‹จ์ˆœํ™”๋˜์–ด ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


25-25: ๋ฉ”์†Œ๋“œ ์„œ๋ช…์ด ์ •๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด์˜ ๋ณต์žกํ•œ ํ˜•์‹์ด ๋‹จ์ˆœํ™”๋˜์–ด ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

.idea/other.xml (6)

61-71: ์ƒˆ ๋””๋ฐ”์ด์Šค ๊ตฌ์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Samsung A35 ๋””๋ฐ”์ด์Šค ์„ค์ •์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ข€ ๋” ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ์—์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.


105-115: ์ƒˆ ๋””๋ฐ”์ด์Šค ๊ตฌ์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Motorola moto g 5G (2022) ๋””๋ฐ”์ด์Šค ์„ค์ •์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์ œ์กฐ์‚ฌ ๊ธฐ๊ธฐ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ง€์›์ด ๊ฐ•ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


284-290: ๊ธฐ์กด ๋””๋ฐ”์ด์Šค ์ •๋ณด๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Samsung ๋””๋ฐ”์ด์Šค์˜ ์ฝ”๋“œ๋ช…๊ณผ ID๊ฐ€ "gta7lite"์—์„œ "gts7xllite"๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๊ณ , ํ™”๋ฉด ์ •๋ณด๋„ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


303-313: ์ƒˆ ๋””๋ฐ”์ด์Šค ๊ตฌ์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Samsung Galaxy Tab S8 ๋””๋ฐ”์ด์Šค ์„ค์ •์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํƒœ๋ธ”๋ฆฟ ๋””๋ฐ”์ด์Šค์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.


369-379: ์ƒˆ ๋””๋ฐ”์ด์Šค ๊ตฌ์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Samsung Galaxy S21 ๋””๋ฐ”์ด์Šค ์„ค์ •์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ๊ธฐ๊ธฐ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.


469-479: ์ƒˆ ๋””๋ฐ”์ด์Šค ๊ตฌ์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Samsung Galaxy S21 Plus ๋””๋ฐ”์ด์Šค ์„ค์ •์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ํฌ๊ธฐ์˜ ๊ธฐ๊ธฐ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/viewModel/homes/HomesViewmodel.kt (11)

3-4: ๋ชจ๋“ˆ ์ž„ํฌํŠธ ํ™•์ธ ์™„๋ฃŒ
์ด ์„น์…˜์˜ ์ƒˆ๋กœ์šด ์ž„ํฌํŠธ๋“ค์€ ๊ฐ ๊ธฐ๋Šฅ(์ฝ”๋ฃจํ‹ด, Flow, UseCase, ๋ชจ๋ธ, UIState ๋“ฑ)์— ํ•„์š”ํ•œ ์š”์†Œ๋กœ ๋ณด์ด๋ฉฐ, ์ „์ฒด์ ์œผ๋กœ ์ ์ ˆํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

Also applies to: 8-8, 11-11, 13-13, 15-15, 16-23, 30-33


51-55: UIState Flow ์„ ์–ธ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ํ™•์ธ
_changeAuthorityUiState์™€ _isRefreshing ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ๋ช…ํ™•ํ•˜๋ฉฐ, ๋ชฉ์ ์— ๋งž๊ฒŒ ์ž˜ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


57-59: ํ† ํฐ ๊ฐฑ์‹  ๋ฐ ํ† ํฐ ์ €์žฅ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง
_tokenRefreshUiState์™€ _saveTokenUiState ๋ชจ๋‘ UI ์ƒํƒœ ํ๋ฆ„์„ ์ •์˜ํ•˜๊ธฐ์— ์ ์ ˆํ•˜๋ฉฐ, ๊ฐ€๋…์„ฑ๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

Also applies to: 61-62


70-71: ํ•™์ƒ ๊ฒ€์ƒ‰/๋ชฉ๋ก UIState ์„ ์–ธ
_studentSearchUiState, _studentListUiState๋ฅผ ๋ณ„๋„๋กœ ๋‘์–ด, ๊ฒ€์ƒ‰ ๋กœ์ง๊ณผ ๋ชฉ๋ก ๋กœ์ง์„ ๋ถ„๋ฆฌํ•œ ์ ์ด ๋ช…ํ™•ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ดํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

Also applies to: 73-74


82-83: SavedStateHandle์„ ์‚ฌ์šฉํ•œ ์ƒํƒœ ๋ณด์กด
roleState์™€ studentListSearch ์ƒํƒœ๋ฅผ SavedStateHandle๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žฌ์ƒ์„ฑ๋˜์–ด๋„ ํ•„์š”ํ•œ ๊ฐ’์„ ๋ณด์ „ํ•˜๊ธฐ์— ์ข‹์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.


107-118: changeAuthority์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํ๋ฆ„ ์ ๊ฒ€
onSuccess์™€ onFailure๋กœ 1์ฐจ ๋ถ„๊ธฐ ํ›„ Flow ๋‚ด๋ถ€์—์„œ catch๋ฅผ ํ†ตํ•ด ์˜ˆ์™ธ๋ฅผ ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


120-122: initTokenRefresh ๋ฉ”์„œ๋“œ์˜ ๊ฐ„๊ฒฐํ•œ ์ดˆ๊ธฐํ™”
ํ† ํฐ ์ƒํƒœ๋ฅผ ๋‹ค์‹œ ๋กœ๋”ฉ ์ƒํƒœ๋กœ ๋Œ๋ฆฌ๋Š” ๋‹จ์ˆœ ๋กœ์ง์œผ๋กœ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•˜์—ฌ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.


214-232: getStudentList์˜ ํ˜ธ์ถœ ์—ฌ๋ถ€ ํ™•์ธ
ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” private๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฉฐ, VM ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์™ธ๋ถ€ ์ ‘๊ทผ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋ฉด public์œผ๋กœ ๋…ธ์ถœํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ๊ณณ์—์„œ ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœ๋˜๋Š”์ง€๋ฅผ ์ ๊ฒ€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


244-244: ์—๋Ÿฌ ์ƒํƒœ์—์„œ ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ
Fail ์ƒํƒœ์— ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ null์„ ์ œ๊ณตํ•˜์—ฌ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ํ™•๋ณดํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋‚˜, UI ๋กœ์ง ๋‚ด์—์„œ ์ด ๊ฐ’(๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ)์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ํ™•์ธ๋งŒ ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


255-258: onStudentSearchChange ๋กœ์ง
์ด๋ฆ„ ๊ฒ€์ƒ‰ ๊ฐ’์„ SavedStateHandle์— ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜์—ฌ ์ƒํƒœ ๋ณต์›์— ์œ ๋ฆฌํ•œ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๊ฒ€์ฆ ๋กœ์ง์ด๋‚˜ ํŠธ๋ฆฌ๋ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์ด ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ์ฒ˜๋ฆฌํ•ด๋„ ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.


260-261: ์ƒ์ˆ˜ ์ •์˜ ์ฒดํฌ
STUDENT_SEARCH์™€ ROLE_STATE ์ƒ์ˆ˜๋ฅผ ๋ณ„๋„ ํ‚ค๋กœ ๋‘์–ด ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ์‹์ด ์ž˜ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Comment on lines +8 to +10
fun NavController.navigationToMyPage() {
this.navigate(MyPage_loute)
}
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

๋‚ด๋น„๊ฒŒ์ด์…˜ ํ•จ์ˆ˜๊ฐ€ ์˜คํƒ€๊ฐ€ ์žˆ๋Š” ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋น„๊ฒŒ์ด์…˜ ํ•จ์ˆ˜๋Š” ์˜คํƒ€๊ฐ€ ์žˆ๋Š” ์ƒ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ƒ์ˆ˜ ์ด๋ฆ„์„ ์ˆ˜์ •ํ•œ ํ›„์—๋Š” ์ด ๋ถ€๋ถ„๋„ ์ผ๊ด€๋˜๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

fun NavController.navigationToMyPage() {
-    this.navigate(MyPage_loute)
+    this.navigate(MyPage_route)
}
๐Ÿ“ 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
fun NavController.navigationToMyPage() {
this.navigate(MyPage_loute)
}
fun NavController.navigationToMyPage() {
this.navigate(MyPage_route)
}

}

is UsersUiState.Empty -> {
MyPageEmptyText()
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue

MyPageEmptyText ์ปดํฌ๋„ŒํŠธ ์ฐธ์กฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MyPageEmptyText() ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์ด ํŒŒ์ผ์—์„œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž„ํฌํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ํ•„์š”ํ•œ ์ž„ํฌํŠธ ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š”.

+ import view.mypage.component.MyPageEmptyText // ๋˜๋Š” ์‹ค์ œ ๊ฒฝ๋กœ์— ๋งž๊ฒŒ ์ˆ˜์ •
๐Ÿ“ 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
MyPageEmptyText()
// At the top of the file (below the package declaration)
import view.mypage.component.MyPageEmptyText // ๋˜๋Š” ์‹ค์ œ ๊ฒฝ๋กœ์— ๋งž๊ฒŒ ์ˆ˜์ •
// ... other import statements ...
// Somewhere later in the file, at or before line 49:
MyPageEmptyText()

Comment on lines 8 to 14
@JsonClass(generateAdapter = true)
data class AdminStudentLIstResponse (
@Json(name = "name") val name: String,
@Json(name = "penaltyPoint") val penaltyPoint: Int,
@Json(name = "roomNum") val roomNum: Int,
@Json(name = "userId") val userId: UUID,
)
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue

ํด๋ž˜์Šค ์ด๋ฆ„ ์˜คํƒ€ ์ˆ˜์ • ํ•„์š”

๋ฐ์ดํ„ฐ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. AdminStudentLIstResponse์—์„œ 'LIst'์˜ 'I'๊ฐ€ ๋Œ€๋ฌธ์ž๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด AdminStudentListResponse๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

-data class AdminStudentLIstResponse (
+data class AdminStudentListResponse (
    @Json(name = "name") val name: String,
    @Json(name = "penaltyPoint") val penaltyPoint: Int,
    @Json(name = "roomNum") val roomNum: Int,
    @Json(name = "userId") val userId: UUID,
)
๐Ÿ“ 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
@JsonClass(generateAdapter = true)
data class AdminStudentLIstResponse (
@Json(name = "name") val name: String,
@Json(name = "penaltyPoint") val penaltyPoint: Int,
@Json(name = "roomNum") val roomNum: Int,
@Json(name = "userId") val userId: UUID,
)
@JsonClass(generateAdapter = true)
data class AdminStudentListResponse (
@Json(name = "name") val name: String,
@Json(name = "penaltyPoint") val penaltyPoint: Int,
@Json(name = "roomNum") val roomNum: Int,
@Json(name = "userId") val userId: UUID,
)

Comment on lines +74 to +83
@Composable
fun NotSearchIcon(
modifier: Modifier = Modifier,
){
Icon(
painter = painterResource(id = R.drawable.notserach),
contentDescription = "mypageIcon",
modifier = modifier,
)
} No newline at end of file
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue

๋ฆฌ์†Œ์Šค ์ด๋ฆ„์— ์˜คํƒ€๊ฐ€ ์žˆ๊ณ  contentDescription์ด ๋ถ€์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

R.drawable.notserach์— ์˜คํƒ€๊ฐ€ ์žˆ๊ณ , contentDescription์ด "mypageIcon"์œผ๋กœ ์ž˜๋ชป ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์„ธ์š”:

fun NotSearchIcon(
    modifier: Modifier = Modifier,
){
    Icon(
-        painter = painterResource(id = R.drawable.notserach),
-        contentDescription = "mypageIcon",
+        painter = painterResource(id = R.drawable.notsearch),
+        contentDescription = "notSearchIcon",
        modifier = modifier,
    )
}

๋ฆฌ์†Œ์Šค ์ด๋ฆ„๋„ drawable ํด๋”์—์„œ notserach.xml์„ notsearch.xml๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ 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
@Composable
fun NotSearchIcon(
modifier: Modifier = Modifier,
){
Icon(
painter = painterResource(id = R.drawable.notserach),
contentDescription = "mypageIcon",
modifier = modifier,
)
}
@Composable
fun NotSearchIcon(
modifier: Modifier = Modifier,
){
Icon(
painter = painterResource(id = R.drawable.notsearch),
contentDescription = "notSearchIcon",
modifier = modifier,
)
}

Comment on lines +1 to +2
package component.combinationvIew

Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

ํŒจํ‚ค์ง€ ์ด๋ฆ„์— ๋Œ€์†Œ๋ฌธ์ž ํ˜ผ์šฉ ๋ฌธ์ œ

ํŒจํ‚ค์ง€ ์ด๋ฆ„ combinationvIew์— ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ํ˜ผ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(v๊ฐ€ ์†Œ๋ฌธ์ž, I๊ฐ€ ๋Œ€๋ฌธ์ž). ์ž๋ฐ”/์ฝ”ํ‹€๋ฆฐ ์ปจ๋ฒค์…˜์— ๋”ฐ๋ฅด๋ฉด ํŒจํ‚ค์ง€๋ช…์€ ๋ชจ๋‘ ์†Œ๋ฌธ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ combinationview๋กœ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ๋œ ๋ชจ๋“  ์ž„ํฌํŠธ๋„ ํ•จ๊ป˜ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Comment on lines +64 to +65
internal var role = authRepository.getRole()
private var refreshToken = runBlocking { authRepository.getRefreshToken().first() }
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

ViewModel ์ดˆ๊ธฐํ™” ์‹œ์ ์— runBlocking ์‚ฌ์šฉ ์ฃผ์˜
์†์„ฑ ์ดˆ๊ธฐํ™” ๊ณผ์ •์—์„œ runBlocking์„ ํ˜ธ์ถœํ•˜๋ฉด UI ์Šค๋ ˆ๋“œ๋ฅผ ์ž ๊ฐ€, ์•ฑ ์‘๋‹ต์„ฑ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋ฃจํ‹ด Flow์—์„œ ๊ฐ’์„ ๋ฐ›์•„์˜ค๋Š” ๋ถ€๋ถ„์€ suspend ํ•จ์ˆ˜๋กœ ์ „ํ™˜ํ•˜๊ฑฐ๋‚˜, lazy ์ดˆ๊ธฐํ™”๋กœ ๋ณ€๊ฒฝํ•ด ๋ณด์‹œ๊ธฐ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ์ˆ˜์ • ์˜ˆ์‹œ(๊ฐ„๋‹จํ™”๋œ ์˜ˆ):

- internal var role = authRepository.getRole()
- private var refreshToken = runBlocking { authRepository.getRefreshToken().first() }

+ internal var role: String? = null
+ private var refreshToken: String? = null

init {
    viewModelScope.launch {
        role = authRepository.getRole()
        refreshToken = authRepository.getRefreshToken().first()
    }
}
๐Ÿ“ 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
internal var role = authRepository.getRole()
private var refreshToken = runBlocking { authRepository.getRefreshToken().first() }
internal var role: String? = null
private var refreshToken: String? = null
init {
viewModelScope.launch {
role = authRepository.getRole()
refreshToken = authRepository.getRefreshToken().first()
}
}

Comment on lines +85 to +105
internal fun tokenRefresh() = viewModelScope.launch {
_isRefreshing.value = true
delay(1_000L)
refreshToken = runBlocking { authRepository.getRefreshToken().first() }
tokenRefreshUseCase(refreshToken = "Bearer ${refreshToken}")
.asResult()
.collectLatest { result ->
when (result) {
is Result.Loading -> _tokenRefreshUiState.value = TokenRefreshUiState.Loading
is Result.Success -> {
_tokenRefreshUiState.value = TokenRefreshUiState.Success(result.data)
saveToken(data = result.data)
}

is Result.Error -> {
_tokenRefreshUiState.value = TokenRefreshUiState.Error(result.exception)
_isRefreshing.value = false
}
}
}
}
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

tokenRefresh ๋‚ด๋ถ€์˜ delay(1_000L)์™€ runBlocking ์‚ฌ์šฉ
ํ† ํฐ ๊ฐฑ์‹  ๋กœ์ง์—์„œ ์ธ์œ„์ ์ธ 1์ดˆ ์ง€์—ฐ๊ณผ runBlocking ์‚ฌ์šฉ์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ง€์—ฐ๊ณผ ๋ธ”๋กœํ‚น ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ์ด์ ์„ ์‚ด๋ฆฌ๋ ค๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„ ์ œ๊ฑฐ ๋˜๋Š” ๊ตฌ์กฐ ๊ฐœ์„ ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ(๊ฐ„๋‹จํ™”):

internal fun tokenRefresh() = viewModelScope.launch {
    _isRefreshing.value = true
-   delay(1_000L)
-   refreshToken = runBlocking { authRepository.getRefreshToken().first() }
+   refreshToken = authRepository.getRefreshToken().first()
    tokenRefreshUseCase("Bearer $refreshToken")
        .asResult()
        .collectLatest { result ->
            ...
        }
}

Comment on lines +124 to +137
private fun saveToken(data: GAuthLoginResponseModel) = viewModelScope.launch {
_saveTokenUiState.value = SaveTokenUiState.Loading
saveTokenUseCase(data = data)
.onSuccess {
_saveTokenUiState.value = SaveTokenUiState.Success
role = authRepository.getRole()
refreshToken = runBlocking { authRepository.getRefreshToken().first() }
_isRefreshing.value = false
}
.onFailure {
_saveTokenUiState.value = SaveTokenUiState.Error(it)
_isRefreshing.value = false
}
}
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

saveToken์—์„œ์˜ runBlocking ๊ฐœ์„  ์ œ์•ˆ
ํ† ํฐ ์ €์žฅ ๊ณผ์ •์—์„œ ๋‹ค์‹œ runBlocking์„ ์‚ฌ์šฉํ•˜๋ฉด UI๊ฐ€ ์ค‘๋‹จ๋  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋ฃจํ‹ด ๋‚ด suspend ํ˜ธ์ถœ๋กœ ์ „ํ™˜ํ•˜๊ฑฐ๋‚˜, ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋„๋ก ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ(๊ฐ„๋‹จํ™”):

private fun saveToken(data: GAuthLoginResponseModel) = viewModelScope.launch {
    _saveTokenUiState.value = SaveTokenUiState.Loading
    saveTokenUseCase(data = data)
        .onSuccess {
            _saveTokenUiState.value = SaveTokenUiState.Success
-           role = authRepository.getRole()
-           refreshToken = runBlocking { authRepository.getRefreshToken().first() }
+           role = authRepository.getRole() // suspend ์‚ฌ์šฉ ์‹œ launch ๋ธ”๋ก์—์„œ ํ˜ธ์ถœ
+           refreshToken = authRepository.getRefreshToken().first()
            _isRefreshing.value = false
        }
        .onFailure {
            _saveTokenUiState.value = SaveTokenUiState.Error(it)
            _isRefreshing.value = false
        }
}
๐Ÿ“ 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
private fun saveToken(data: GAuthLoginResponseModel) = viewModelScope.launch {
_saveTokenUiState.value = SaveTokenUiState.Loading
saveTokenUseCase(data = data)
.onSuccess {
_saveTokenUiState.value = SaveTokenUiState.Success
role = authRepository.getRole()
refreshToken = runBlocking { authRepository.getRefreshToken().first() }
_isRefreshing.value = false
}
.onFailure {
_saveTokenUiState.value = SaveTokenUiState.Error(it)
_isRefreshing.value = false
}
}
private fun saveToken(data: GAuthLoginResponseModel) = viewModelScope.launch {
_saveTokenUiState.value = SaveTokenUiState.Loading
saveTokenUseCase(data = data)
.onSuccess {
_saveTokenUiState.value = SaveTokenUiState.Success
role = authRepository.getRole() // suspend ์‚ฌ์šฉ ์‹œ launch ๋ธ”๋ก์—์„œ ํ˜ธ์ถœ
refreshToken = authRepository.getRefreshToken().first()
_isRefreshing.value = false
}
.onFailure {
_saveTokenUiState.value = SaveTokenUiState.Error(it)
_isRefreshing.value = false
}
}

@kimjeakwan kimjeakwan changed the title ๐Ÿ”€(34) :: ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ”€(34) :: ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ๋ฐ ํŒŒ์ผ๊ตฌ์กฐ ๋ณ€๊ฒฝ ๋“ฑ ๋ฆฌํŽ™ํ† ๋ง์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. Mar 7, 2025
@kimjeakwan kimjeakwan changed the title ๐Ÿ”€(34) :: ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ๋ฐ ํŒŒ์ผ๊ตฌ์กฐ ๋ณ€๊ฒฝ ๋“ฑ ๋ฆฌํŽ™ํ† ๋ง์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ”€(64) :: ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ๋ฐ ํŒŒ์ผ๊ตฌ์กฐ ๋ณ€๊ฒฝ ๋“ฑ ๋ฆฌํŽ™ํ† ๋ง์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. Mar 7, 2025
data class GAuthLoginResponseModel(
val accessToken: String,
val refreshToken: String,
val accessTokenExpiresIn: String,
Copy link
Collaborator

Choose a reason for hiding this comment

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

๊ณต๋ฐฑ ํ•œ์นธ ์ง€์›Œ์ฃผ์„ธ์š”

Comment on lines 32 to 37
)
}

}

} No newline at end of file
Copy link
Collaborator

Choose a reason for hiding this comment

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

34๋ฒˆ ์ค„๊ณผ 36๋ฒˆ ์ค„ ์‚ญ์ œํ•ด์ฃผ์„ธ์š”

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

๐Ÿงน Nitpick comments (9)
presentation/src/main/java/view/theme/color/DoMaColor.kt (6)

7-8: ์ƒ‰์ƒ ์ด๋ฆ„ ์˜คํƒ€ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ƒ‰์ƒ ์ด๋ฆ„์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  • DARKGARY๋Š” DARKGRAY๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • SMAlLDARKGARY๋Š” SMALLDARKGRAY๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ 'l'์ด ์†Œ๋ฌธ์ž๋กœ ๋˜์–ด์žˆ์–ด ๋Œ€์†Œ๋ฌธ์ž ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ƒ‰์ƒ ์ด๋ฆ„์€ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

-    override val DARKGARY = Color(0xFFBEBEBE)
-    override val SMAlLDARKGARY = Color(0xFF4C4C4C)
+    override val DARKGRAY = Color(0xFFBEBEBE)
+    override val SMALLDARKGRAY = Color(0xFF4C4C4C)

5-29: ์ƒ‰์ƒ ์ด๋ฆ„ ๋ช…๋ช… ๊ทœ์น™์˜ ์ผ๊ด€์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒ‰์ƒ ์ด๋ฆ„์˜ ๋ช…๋ช… ๊ทœ์น™์ด ์ผ๊ด€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

  • ๋Œ€๋ฌธ์ž snake_case: MAIN, WHITE, BACKGROUND ๋“ฑ
  • ํŒŒ์Šค์นผ ์ผ€์ด์Šค: Black, Gold, Broze(์˜คํƒ€, Bronze๊ฐ€ ๋งž์Œ)
  • ์นด๋ฉœ ์ผ€์ด์Šค: silver

์ƒ‰์ƒ ์ด๋ฆ„์€ ๋ชจ๋‘ ๋™์ผํ•œ ๋ช…๋ช… ๊ทœ์น™์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ƒ์ˆ˜๋“ค๊ณผ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๋Œ€๋ฌธ์ž snake_case๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

 object DoMaColor : ColorTheme(){
     override val MAIN = Color(0xFF252525)
-    override val DARKGARY = Color(0xFFBEBEBE)
-    override val SMAlLDARKGARY = Color(0xFF4C4C4C)
-    override val Black = Color(0xFF000000)
-    override val WHITE = Color(0xFFFFFFFF)
-    override val BACKGROUND = Color(0xFF1E1E1E)
+    override val DARKGRAY = Color(0xFFBEBEBE)
+    override val SMALL_DARKGRAY = Color(0xFF4C4C4C)
+    override val BLACK = Color(0xFF000000)
+    override val WHITE = Color(0xFFFFFFFF)
+    override val BACKGROUND = Color(0xFF1E1E1E)

     override val LIGHTGRAY = Color(0xFF555555)
     override val GRAY = Color(0xFF9AD54A)
-    override val Gold = Color(0xFFFFD651)
-    override val silver = Color(0xFFBEBEBE)
-    override val Broze = Color(0xFFF7A080)
+    override val GOLD = Color(0xFFFFD651)
+    override val SILVER = Color(0xFFBEBEBE)
+    override val BRONZE = Color(0xFFF7A080)

     override val SYSTEM = Color(0xFF14C38E) // ์‹œ์Šคํ…œ ์ƒ‰์ƒ (๊ฐ•์กฐ ์ƒ‰์œผ๋กœ ์„ค์ •)

-    override val CardShadow = Color(0xFF1A1A1A) // ์นด๋“œ ๊ทธ๋ฆผ์ž ์ƒ‰์ƒ
-    override val StatusShadow = Color(0xFF141414) //
+    override val CARD_SHADOW = Color(0xFF1A1A1A) // ์นด๋“œ ๊ทธ๋ฆผ์ž ์ƒ‰์ƒ
+    override val STATUS_SHADOW = Color(0xFF141414) //
 }

17-17: ์ค‘๋ณต๋œ ์ƒ‰์ƒ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค.

silver ์ƒ‰์ƒ(0xFFBEBEBE)๊ณผ DARKGARY ์ƒ‰์ƒ(0xFFBEBEBE)์ด ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ‰์ƒ ์ค‘๋ณต์€ ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ•˜๋‚˜์˜ ์ƒ‰์ƒ๋งŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

-    override val DARKGARY = Color(0xFFBEBEBE)
-    override val silver = Color(0xFFBEBEBE)
+    override val SILVER = Color(0xFFBEBEBE) // ํ•˜๋‚˜์˜ ์ƒ‰์ƒ์œผ๋กœ ํ†ตํ•ฉ

18-18: "Broze" ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Broze๋Š” ์˜คํƒ€์ด๋ฉฐ Bronze๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ฒ ์ž์ž…๋‹ˆ๋‹ค.

-    override val Broze = Color(0xFFF7A080)
+    override val BRONZE = Color(0xFFF7A080)

5-29: ์ƒ‰์ƒ ์‚ฌ์šฉ ๋ชฉ์ ์— ๋Œ€ํ•œ ๋ฌธ์„œํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ์ƒ‰์ƒ์—๋งŒ ์ฃผ์„์ด ๋‹ฌ๋ ค ์žˆ๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ทธ ๋ชฉ์ ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ƒ‰์ƒ์— ๋Œ€ํ•ด ์ผ๊ด€๋œ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ƒ‰์ƒ์„ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

 object DoMaColor : ColorTheme(){
-    override val MAIN = Color(0xFF252525)
+    override val MAIN = Color(0xFF252525) // ๋ฉ”์ธ ํ…Œ๋งˆ ์ƒ‰์ƒ
...
-    override val BLACK = Color(0xFF000000)
-    override val WHITE = Color(0xFFFFFFFF)
-    override val BACKGROUND = Color(0xFF1E1E1E)
+    override val BLACK = Color(0xFF000000) // ๊ฒ€์ •์ƒ‰ ํ…์ŠคํŠธ ๋ฐ ์•„์ด์ฝ˜์šฉ
+    override val WHITE = Color(0xFFFFFFFF) // ํฐ์ƒ‰ ํ…์ŠคํŠธ ๋ฐ ์•„์ด์ฝ˜์šฉ
+    override val BACKGROUND = Color(0xFF1E1E1E) // ์•ฑ ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ
...

13-13: ๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ์— ์—ฌ๋Ÿฌ ๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„์„ ์ œ๊ฑฐํ•˜๊ณ  ๋…ผ๋ฆฌ์  ๊ทธ๋ฃน ์‚ฌ์ด์—๋งŒ ์ ์ ˆํ•œ ๊ฐ„๊ฒฉ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Also applies to: 26-28

presentation/src/main/java/view/main/screen/MainScreen.kt (3)

117-122: ๋ฌดํ•œ ๋ฃจํ”„์˜ ์„ฑ๋Šฅ ์˜ํ–ฅ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

ํ˜„์žฌ ์‹œ๊ฐ„์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋ฌดํ•œ ๋ฃจํ”„์™€ 1์ดˆ ์ง€์—ฐ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋ฐฐํ„ฐ๋ฆฌ ์†Œ๋ชจ๊ฐ€ ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด์ด ํ‘œ์‹œ๋  ๋•Œ๋งŒ ์‹œ๊ฐ„์„ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜, ๋” ๊ธด ๊ฐ„๊ฒฉ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

- LaunchedEffect("Time") {
-     while (true) {
-         delay(1_000L)
-         currentTime = System.currentTimeMillis()
-     }
- }
+ LaunchedEffect("Time") {
+     while (true) {
+         currentTime = System.currentTimeMillis()
+         delay(60_000L) // 1๋ถ„๋งˆ๋‹ค ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ํ•„์š”์— ๋”ฐ๋ผ ์กฐ์ •
+     }
+ }

193-197: ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

"์ด๋ฒˆ์ฃผ ๋žญํ‚น"๊ณผ ๊ฐ™์€ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์€ ๋‹ค๊ตญ์–ด ์ง€์›๊ณผ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด strings.xml ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์— ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

- text= "์ด๋ฒˆ์ฃผ ๋žญํ‚น",
+ text= stringResource(R.string.this_week_ranking),

247-265: ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ตฌํ˜„์ด ํ…Œ์ŠคํŠธ์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

PreviewMainScreen ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด UI๋ฅผ ๋ฏธ๋ฆฌ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์€ UI ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์ƒํƒœ(๋กœ๋”ฉ, ์—๋Ÿฌ, ๋ฐ์ดํ„ฐ ์žˆ์Œ)์— ๋Œ€ํ•œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์ƒํƒœ๋ฅผ ๋ฏธ๋ฆฌ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ํ”„๋ฆฌ๋ทฐ ํ•จ์ˆ˜๋ฅผ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”:

@Composable
@Preview
fun PreviewMainScreenWithData() {
    MainScreen(
        homesUiState = HomesUiState.Success(/* ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ */),
        rankListCallBack = {},
        homesMyRankUiState = HomesMyRankUiState.Success(/* ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ */),
        onErrorToast = { _, _ -> },
        navigateToBack = {},
        myRankCallBack = {},
        onDemeritStudentClick = {},
        onStudentPatchClick = {},
        tokenRefreshUiState = TokenRefreshUiState.Success,
        tokenRefreshCallBack = {},
        initTokenRefreshCallBack = {},
        isRefreshing = false,
        role = Authority.ROLE_ADMIN
    )
}
๐Ÿ“œ Review details

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

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between 3f6d567 and c826c1e.

๐Ÿ“’ Files selected for processing (5)
  • presentation/src/main/java/view/main/screen/MainScreen.kt (1 hunks)
  • presentation/src/main/java/view/notice/component/NoticeCard.kt (1 hunks)
  • presentation/src/main/java/view/notice/screen/NoticeScreen.kt (1 hunks)
  • presentation/src/main/java/view/theme/color/ColorTheme.kt (1 hunks)
  • presentation/src/main/java/view/theme/color/DoMaColor.kt (2 hunks)
๐Ÿšง Files skipped from review as they are similar to previous changes (3)
  • presentation/src/main/java/view/notice/screen/NoticeScreen.kt
  • presentation/src/main/java/view/theme/color/ColorTheme.kt
  • presentation/src/main/java/view/notice/component/NoticeCard.kt
โฐ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build
๐Ÿ”‡ Additional comments (4)
presentation/src/main/java/view/main/screen/MainScreen.kt (4)

55-84: ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ์ž˜ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

MainRoute ์ปดํฌ๋„ŒํŠธ๊ฐ€ ViewModel์˜ ์ƒํƒœ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  MainScreen์— ์ „๋‹ฌํ•˜์—ฌ UI์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ž˜ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์€ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.


104-107: LaunchedEffect๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ์„ ์œ„ํ•ด LaunchedEffect๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์€ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ปดํฌ์ €๋ธ”์ด ์ฒ˜์Œ ๊ตฌ์„ฑ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋„๋ก Unit์„ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ API ํ˜ธ์ถœ์„ ๋ฐฉ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.


226-229: RankingList ์ปดํฌ๋„ŒํŠธ์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

RankingList ์ปดํฌ๋„ŒํŠธ์— onErrorToast ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•˜์—ฌ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•˜๋Š” ํŒจํ„ด์ด ์ž˜ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์ค‘์•™ํ™”ํ•˜๊ณ  ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์œ ์ง€ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.


230-239: ์กฐ๊ฑด๋ถ€ UI ๋ Œ๋”๋ง์„ ์ž˜ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์—ญํ• ์— ๋”ฐ๋ผ ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ์„ ์กฐ๊ฑด๋ถ€๋กœ ํ‘œ์‹œํ•˜๋Š” ํŒจํ„ด์ด ์ž˜ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

Column(
modifier = modifier
.fillMaxSize()
.background(color = Color(0xFF1E1E1E)),
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ๊ฐ’ ๋Œ€์‹  ํ…Œ๋งˆ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

Color(0xFF1E1E1E)์™€ ๊ฐ™์€ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ ์ „์ฒด์˜ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ํ…Œ๋งˆ์—์„œ ์ •์˜๋œ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

- .background(color = Color(0xFF1E1E1E)),
+ .background(color = colors.background),
๐Ÿ“ 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
.background(color = Color(0xFF1E1E1E)),
.background(color = colors.background),

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

๐Ÿ”ญ Outside diff range comments (1)
presentation/src/main/java/view/theme/color/DoMaColor.kt (1)

5-28: ๐Ÿ› ๏ธ Refactor suggestion

์ƒ์ˆ˜ ๋ช…๋ช… ๊ทœ์น™์˜ ์ผ๊ด€์„ฑ ๊ฐœ์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ฝ”๋“œ์—์„œ ์ƒ์ˆ˜ ์ด๋ฆ„์ด ๋‹ค์–‘ํ•œ ๋ช…๋ช… ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  • SCREAMING_SNAKE_CASE: MAIN, DARKGARY, WHITE ๋“ฑ
  • camelCase: silver
  • PascalCase: Black, Gold, Broze, CardShadow

Kotlin์—์„œ ์ƒ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ SCREAMING_SNAKE_CASE๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๋ชจ๋“  ์ƒ์ˆ˜ ์ด๋ฆ„์„ ์ด ๊ทœ์น™์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 object DoMaColor : ColorTheme(){
     override val MAIN = Color(0xFF252525)
-    override val DARKGARY = Color(0xFFBEBEBE)
-    override val SMAlLDARKGARY = Color(0xFF4C4C4C)
-    override val Black = Color(0xFF000000)
+    override val DARK_GRAY = Color(0xFFBEBEBE)
+    override val SMALL_DARK_GRAY = Color(0xFF4C4C4C)
+    override val BLACK = Color(0xFF000000)
     override val WHITE = Color(0xFFFFFFFF)
     override val BACKGROUND = Color(0xFF1E1E1E)

-    override val LIGHTGRAY = Color(0xFF555555)
+    override val LIGHT_GRAY = Color(0xFF555555)
     override val GRAY = Color(0xFF9AD54A)
-    override val Gold = Color(0xFFFFD651)
-    override val silver = Color(0xFFBEBEBE)
-    override val Broze = Color(0xFFF7A080)
+    override val GOLD = Color(0xFFFFD651)
+    override val SILVER = Color(0xFFBEBEBE)
+    override val BRONZE = Color(0xFFF7A080)

     override val SYSTEM = Color(0xFF14C38E) // ์‹œ์Šคํ…œ ์ƒ‰์ƒ (๊ฐ•์กฐ ์ƒ‰์œผ๋กœ ์„ค์ •)

-    override val CardShadow = Color(0xFF1A1A1A) // ์นด๋“œ ๊ทธ๋ฆผ์ž ์ƒ‰์ƒ
-    override val StatusShadow = Color(0xFF141414) //
+    override val CARD_SHADOW = Color(0xFF1A1A1A) // ์นด๋“œ ๊ทธ๋ฆผ์ž ์ƒ‰์ƒ
+    override val STATUS_SHADOW = Color(0xFF141414) //
}
โ™ป๏ธ Duplicate comments (2)
presentation/src/main/java/view/mypage/component/DemeritList.kt (2)

49-49: โš ๏ธ Potential issue

MyPageEmptyText ์ปดํฌ๋„ŒํŠธ ์ž„ํฌํŠธ๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

MyPageEmptyText ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์ž„ํฌํŠธ ๊ตฌ๋ฌธ์ด ๋ˆ„๋ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

+ import view.mypage.component.MyPageEmptyText // ๋˜๋Š” ์‹ค์ œ ๊ฒฝ๋กœ์— ๋งž๊ฒŒ ์ˆ˜์ •

85-85: ๐Ÿ› ๏ธ Refactor suggestion

์•„์ด์ฝ˜ ๋กœ์ง์ด ๋ฐ˜๋Œ€๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋กœ์ง์€ ํ™•์žฅ๋˜์—ˆ์„ ๋•Œ ์•„๋ž˜ ๋ฐฉํ–ฅ ์•„์ด์ฝ˜์„, ์ ‘ํ˜”์„ ๋•Œ ์œ„ ๋ฐฉํ–ฅ ์•„์ด์ฝ˜์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ UI/UX ํŒจํ„ด์— ๋”ฐ๋ฅด๋ฉด, ์ ‘ํ˜”์„ ๋•Œ๋Š” ํ™•์žฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์•„๋ž˜ ๋ฐฉํ–ฅ ์•„์ด์ฝ˜์„, ํ™•์žฅ๋˜์—ˆ์„ ๋•Œ๋Š” ์ ‘๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์œ„ ๋ฐฉํ–ฅ ์•„์ด์ฝ˜์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ๋” ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

- painter = painterResource(id = if (isExpanded) R.drawable.down else R.drawable.up),
+ painter = painterResource(id = if (isExpanded) R.drawable.up else R.drawable.down),
๐Ÿงน Nitpick comments (21)
presentation/src/main/java/view/mypage/component/DemeritList.kt (3)

62-63: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” 'typography' ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

'typography' ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฐ‘์ค„(_)๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ค„ 63์— ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

- DoMaAndroidTheme {
-     colors, typography ->
+ DoMaAndroidTheme { colors, _ ->
๐Ÿงฐ Tools
๐Ÿช› GitHub Actions: Android CI

[warning] 62-62: Parameter 'typography' is never used, could be renamed to _


75-75: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์„ strings.xml๋กœ ์ด๋™ํ•˜์„ธ์š”.

"๋ฒŒ์  ๋ฆฌ์ŠคํŠธ"๋ผ๋Š” ๋ฌธ์ž์—ด์ด ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๊ตญ์–ด ์ง€์› ๋ฐ ์ผ๊ด€์„ฑ ์žˆ๋Š” ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด strings.xml ๋ฆฌ์†Œ์Šค ํŒŒ์ผ๋กœ ์ด๋™ํ•˜๊ณ  stringResource๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

- text = "๋ฒŒ์  ๋ฆฌ์ŠคํŠธ",
+ text = stringResource(R.string.demerit_list),

101-103: String ํฌ๋งท ์‚ฌ์šฉ๋ฒ• ๊ฐœ์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ฝ”๋“œ๋Š” ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๋ช…ํ™•ํ•œ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ์—†์–ด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. R.string.stringResource ๋Œ€์‹  ๋” ๋ช…ํ™•ํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ณ , ๋ฌธ์ž์—ด ํฌ๋งท ๋ฐฉ์‹๋„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

- text = stringResource(
-     R.string.stringResource, data.myBecause, data.penaltyPoint
- ),
+ text = stringResource(
+     R.string.demerit_description_format, 
+     data.myBecause, 
+     data.penaltyPoint
+ ),
data/src/main/java/remote/dto/auth/response/DoMaLoginResponse.kt (1)

21-22: ๋ชจ๋ธ ๋ณ€ํ™˜ ํ•จ์ˆ˜ ๋กœ์ง์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋ธ ๋ณ€ํ™˜ ํ•จ์ˆ˜์˜ ๋ชฉ์ ์ด DTO์—์„œ ๋„๋ฉ”์ธ ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด, ํ•จ์ˆ˜๋ช…๋„ ๊ทธ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ๋ฐ˜์˜ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ์ผ๊ด€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

-    refreshTokenExpiresIn=refreshTokenExpiresIn,
-    authority=authority
+    refreshTokenExpiresIn = refreshTokenExpiresIn,
+    authority = authority
presentation/src/main/java/component/modifier/DoMaIcon.kt (1)

15-23: contentDescription์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”

DoMaIcon์˜ contentDescription์ด "๋ฒ„ํŠผ"์œผ๋กœ ์ง€์ •๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ์ ‘๊ทผ์„ฑ์„ ์œ„ํ•ด ์•„์ด์ฝ˜์˜ ์—ญํ• ์ด๋‚˜ ๊ธฐ๋Šฅ์„ ์ •ํ™•ํžˆ ์„ค๋ช…ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

fun DoMaIcon(
    modifier: Modifier = Modifier,
) {
    Image(
        painter = painterResource(id = R.drawable.left),
-        contentDescription = "๋ฒ„ํŠผ",
+        contentDescription = "๋’ค๋กœ๊ฐ€๊ธฐ",
        modifier = modifier
    )
}
presentation/src/main/java/view/theme/color/DoMaColor.kt (4)

7-7: ์ƒ์ˆ˜๋ช… ์˜คํƒ€ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

'DARKGARY'์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ฒ ์ž๋Š” 'DARKGRAY'์ž…๋‹ˆ๋‹ค.

-    override val DARKGARY = Color(0xFFBEBEBE)
+    override val DARKGRAY = Color(0xFFBEBEBE)

13-13: ์ƒ์ˆ˜๋ช… ๋ช…๋ช… ๊ทœ์น™ ๊ฐœ์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋‹จ์–ด๋กœ ๊ตฌ์„ฑ๋œ ์ƒ์ˆ˜๋ช…์€ ์–ธ๋”์Šค์ฝ”์–ด(_)๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ๊ด€๋ก€์ž…๋‹ˆ๋‹ค.

-    override val LIGHTGRAY = Color(0xFF555555)
+    override val LIGHT_GRAY = Color(0xFF555555)

17-17: Bronze ๋‹จ์–ด ์˜คํƒ€ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

'Broze'๋Š” 'Bronze'์˜ ์˜คํƒ€์ž…๋‹ˆ๋‹ค.

-    override val Broze = Color(0xFFF7A080)
+    override val Bronze = Color(0xFFF7A080)

25-27: ๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„ ์ œ๊ฑฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ๋์— ๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๋์—๋Š” ์ตœ๋Œ€ ํ•œ ๊ฐœ์˜ ๋นˆ ์ค„๋งŒ ์žˆ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/view/main/screen/MainScreen.kt (2)

100-100: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

navigateToBack ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์„ ์–ธ๋˜์—ˆ์ง€๋งŒ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” CI ํŒŒ์ดํ”„๋ผ์ธ์—์„œ๋„ ๊ฒฝ๊ณ ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”:

  1. ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌํ˜„
  2. ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•„์š”์—†๋‹ค๋ฉด ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์–ธ๋”์Šค์ฝ”์–ด(_)๋กœ ๋ณ€๊ฒฝ
- onStudentPatchClick: () -> Unit
+ onStudentPatchClick: () -> Unit,
+ // navigateToBack ์‚ฌ์šฉ ์˜ˆ์‹œ: ๋ฐฑ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋กœ์ง ์ถ”๊ฐ€

๋˜๋Š”

- navigateToBack: () -> Unit,
+ _: () -> Unit, // ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ
๐Ÿงฐ Tools
๐Ÿช› GitHub Actions: Android CI

[warning] 100-100: Parameter 'navigateToBack' is never used


118-122: ์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ์ตœ์ ํ™”ํ•ด์ฃผ์„ธ์š”.

ํ˜„์žฌ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 1์ดˆ๋งˆ๋‹ค ์‹œ๊ฐ„์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ๊ฐ€ ๋งŽ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ๋‹ค์Œ ์ดˆ/๋ถ„๊นŒ์ง€์˜ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜์—ฌ ํ•„์š”ํ•œ ์‹œ์ ์—๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”:

- LaunchedEffect("Time") {
-     while (true) {
-         delay(1_000L)
-         currentTime = System.currentTimeMillis()
-     }
- }
+ LaunchedEffect("Time") {
+     while (true) {
+         val currentMillis = System.currentTimeMillis()
+         val millisUntilNextSecond = 1000 - (currentMillis % 1000)
+         delay(millisUntilNextSecond)
+         currentTime = System.currentTimeMillis()
+     }
+ }
presentation/src/main/java/view/main/component/SearchList.kt (10)

43-43: ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด "๋กœ๋”ฉ์ค‘"์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๊ตญ์–ด ์ง€์› ๋ฐ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

strings.xml์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”:

- Text(text = "๋กœ๋”ฉ์ค‘")
+ Text(text = stringResource(R.string.loading))

59-59: ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด "๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๊ตญ์–ด ์ง€์› ๋ฐ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

strings.xml์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”:

- Text(text = "๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.")
+ Text(text = stringResource(R.string.search_no_results))

65-65: ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด "๋กœ๋”ฉ์ค‘"์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๊ตญ์–ด ์ง€์› ๋ฐ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

strings.xml์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”:

- Text(text = "๋กœ๋”ฉ์ค‘")
+ Text(text = stringResource(R.string.loading))

98-98: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์ œ๊ฑฐ ๋˜๋Š” ์ˆ˜์ •ํ•˜์„ธ์š”.

typography ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์„ ์–ธ๋˜์—ˆ์ง€๋งŒ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” CI ํŒŒ์ดํ”„๋ผ์ธ์—์„œ๋„ ๊ฒฝ๊ณ ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”:

- DoMaAndroidTheme { colors, typography ->
+ DoMaAndroidTheme { colors, _ ->
๐Ÿงฐ Tools
๐Ÿช› GitHub Actions: Android CI

[warning] 98-98: Parameter 'typography' is never used, could be renamed to _


103-103: ํ…Œ๋งˆ ์‹œ์Šคํ…œ์—์„œ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ๊ฐ’(Color(0xFF252525))์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ํ…Œ๋งˆ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”:

- .background(color = Color(0xFF252525), shape = RoundedCornerShape(size = 10.dp)),
+ .background(color = colors.surfaceVariant, shape = RoundedCornerShape(size = 10.dp)),

121-125: typography ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

์ง์ ‘ TextStyle์„ ์ •์˜ํ•˜๋Š” ๋Œ€์‹  ํ…Œ๋งˆ์˜ typography ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด ๋ณด์„ธ์š”:

- text = "${data.roomNum}ํ˜ธ",
- style = TextStyle(
-     fontSize = 16.sp,
-     fontWeight = FontWeight(700),
-     color = colors.WHITE,
- )
+ text = "${data.roomNum}ํ˜ธ",
+ style = typography.titleMedium.copy(
+     color = colors.WHITE
+ )

130-134: typography ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

์ง์ ‘ TextStyle์„ ์ •์˜ํ•˜๋Š” ๋Œ€์‹  ํ…Œ๋งˆ์˜ typography ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด ๋ณด์„ธ์š”:

- text = data.name,
- style = TextStyle(
-     fontSize = 16.sp,
-     fontWeight = FontWeight(600),
-     color = colors.WHITE,
- )
+ text = data.name,
+ style = typography.titleMedium.copy(
+     color = colors.WHITE
+ )

139-143: typography ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

์ง์ ‘ TextStyle์„ ์ •์˜ํ•˜๋Š” ๋Œ€์‹  ํ…Œ๋งˆ์˜ typography ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด ๋ณด์„ธ์š”:

- text = "${data.penaltyPoint}์ ",
- style = TextStyle(
-     fontSize = 14.sp,
-     fontWeight = FontWeight(600),
-     color = colors.WHITE,
- )
+ text = "${data.penaltyPoint}์ ",
+ style = typography.bodyMedium.copy(
+     color = colors.WHITE
+ )

137-137: ๊ณ ์ • ๋„ˆ๋น„ ๋Œ€์‹  weight๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

Spacer์˜ ๊ณ ์ • ๋„ˆ๋น„(152.dp)๋Š” ๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์—์„œ ์ผ๊ด€๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Row์— weight๋ฅผ ์ ์šฉํ•˜์—ฌ ๋” ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค:

- Spacer(modifier = Modifier.width(152.dp))
+ Spacer(modifier = Modifier.weight(1f))

๋˜๋Š” ์ „์ฒด Row ๊ตฌ์กฐ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์„ธ์š”:

Row(
    modifier = Modifier
        .fillMaxWidth()
        .height(57.dp)
        .border(
            width = 1.dp,
            color = colors.GRAY,
            shape = RoundedCornerShape(size = 10.dp)
        ),
    horizontalArrangement = Arrangement.Center,
    verticalAlignment = Alignment.CenterVertically,
) {
-   Text(
-       text = "${data.roomNum}ํ˜ธ",
-       style = TextStyle(
-           fontSize = 16.sp,
-           fontWeight = FontWeight(700),
-           color = colors.WHITE,
-       )
-   )
-   Spacer(modifier = Modifier.width(20.dp))
-   Text(
-       text = data.name,
-       style = TextStyle(
-           fontSize = 16.sp,
-           fontWeight = FontWeight(600),
-           color = colors.WHITE,
-       )
-   )
-   Spacer(modifier = Modifier.width(152.dp))
-   Text(
-       text = "${data.penaltyPoint}์ ",
-       style = TextStyle(
-           fontSize = 14.sp,
-           fontWeight = FontWeight(600),
-           color = colors.WHITE,
-       )
-   )
+   Text(
+       modifier = Modifier.weight(0.2f),
+       text = "${data.roomNum}ํ˜ธ",
+       style = typography.titleMedium.copy(color = colors.WHITE)
+   )
+   Text(
+       modifier = Modifier.weight(0.6f),
+       text = data.name,
+       style = typography.titleMedium.copy(color = colors.WHITE)
+   )
+   Text(
+       modifier = Modifier.weight(0.2f),
+       text = "${data.penaltyPoint}์ ",
+       style = typography.bodyMedium.copy(color = colors.WHITE)
+   )
}

160-160: ๋„ˆ๋ฌด ํฐ ์ตœ๋Œ€ ๋†’์ด๊ฐ’์ด ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

heightIn(max = 10_000.dp)๋Š” ๊ณผ๋„ํ•˜๊ฒŒ ํฐ ๊ฐ’์ž…๋‹ˆ๋‹ค. LazyColumn์ด ๋‚ด์šฉ์— ๋งž๊ฒŒ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์œผ๋กœ ๋ณด์ด์ง€๋งŒ, ๋” ํ•ฉ๋ฆฌ์ ์ธ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ heightIn ์ž์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”:

- .heightIn(max = 10_000.dp)
+ // heightIn ์ œ๊ฑฐ ๋˜๋Š” ๋” ํ•ฉ๋ฆฌ์ ์ธ ๊ฐ’ ์‚ฌ์šฉ

๋˜๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ตœ๋Œ€ ํ‘œ์‹œํ•  ํ™”๋ฉด ๋†’์ด์— ๋งž๊ฒŒ ์กฐ์ •:

- .heightIn(max = 10_000.dp)
+ .heightIn(max = 500.dp) // ๋” ํ•ฉ๋ฆฌ์ ์ธ ์ตœ๋Œ€๊ฐ’
๐Ÿ“œ Review details

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

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between c826c1e and 82ee5bb.

๐Ÿ“’ Files selected for processing (15)
  • .idea/other.xml (7 hunks)
  • data/src/main/java/remote/dto/admin/request/AdminPenaltyRequest.kt (1 hunks)
  • data/src/main/java/remote/dto/admin/request/AuthorityRequest.kt (1 hunks)
  • data/src/main/java/remote/dto/auth/response/DoMaLoginResponse.kt (1 hunks)
  • presentation/src/main/java/component/designsystem/DomaSearchTextField.kt (1 hunks)
  • presentation/src/main/java/component/modifier/DoMaIcon.kt (1 hunks)
  • presentation/src/main/java/component/navigationbar/DomaNavBar.kt (1 hunks)
  • presentation/src/main/java/view/main/component/PostDemeritComponent.kt (1 hunks)
  • presentation/src/main/java/view/main/component/SearchEmptyText.kt (1 hunks)
  • presentation/src/main/java/view/main/component/SearchList.kt (1 hunks)
  • presentation/src/main/java/view/main/component/StudentPatch.kt (1 hunks)
  • presentation/src/main/java/view/main/navigation/MainNavigation.kt (1 hunks)
  • presentation/src/main/java/view/main/screen/MainScreen.kt (1 hunks)
  • presentation/src/main/java/view/mypage/component/DemeritList.kt (1 hunks)
  • presentation/src/main/java/view/theme/color/DoMaColor.kt (2 hunks)
๐Ÿšง Files skipped from review as they are similar to previous changes (7)
  • presentation/src/main/java/view/main/component/SearchEmptyText.kt
  • data/src/main/java/remote/dto/admin/request/AuthorityRequest.kt
  • data/src/main/java/remote/dto/admin/request/AdminPenaltyRequest.kt
  • presentation/src/main/java/view/main/navigation/MainNavigation.kt
  • presentation/src/main/java/view/main/component/PostDemeritComponent.kt
  • presentation/src/main/java/component/designsystem/DomaSearchTextField.kt
  • presentation/src/main/java/view/main/component/StudentPatch.kt
๐Ÿงฐ Additional context used
๐Ÿช› GitHub Actions: Android CI
presentation/src/main/java/component/navigationbar/DomaNavBar.kt

[warning] 24-24: Parameter 'typography' is never used, could be renamed to _

presentation/src/main/java/view/mypage/component/DemeritList.kt

[warning] 62-62: Parameter 'typography' is never used, could be renamed to _

data/src/main/java/remote/dto/auth/response/DoMaLoginResponse.kt

[error] 3-17: Unresolved reference: DoMaLoginResponseModel


[error] 3-17: Unresolved reference: DoMaLoginResponseModel


[error] 3-17: Unresolved reference: DoMaLoginResponseModel

presentation/src/main/java/view/main/component/SearchList.kt

[warning] 98-98: Parameter 'typography' is never used, could be renamed to _

presentation/src/main/java/view/main/screen/MainScreen.kt

[warning] 100-100: Parameter 'navigateToBack' is never used

๐Ÿ”‡ Additional comments (19)
.idea/other.xml (8)

17-27: OnePlus ๋””๋ฐ”์ด์Šค ์ถ”๊ฐ€ ํ™•์ธ
์ƒˆ๋กœ์šด OnePlus ๋””๋ฐ”์ด์Šค (CPH2415)๊ฐ€ API 34 ๋ฐ ์ง€์ •๋œ ํ™”๋ฉด ์ •๋ณด์™€ ํ•จ๊ป˜ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋œ ์˜ต์…˜๋“ค์ด ํ”„๋กœ์ ํŠธ์˜ ๋‹ค๋ฅธ ๋””๋ฐ”์ด์Šค ๋ฐ์ดํ„ฐ์™€ ์ผ๊ด€์„ฑ์„ ์ด๋ฃจ๋Š”์ง€ ์ตœ์ข… ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.


72-82: Samsung A35 ๋””๋ฐ”์ด์Šค ์ถ”๊ฐ€ ํ™•์ธ
์ƒˆ๋กœ์šด Samsung ๋””๋ฐ”์ด์Šค A35๊ฐ€ codename "a35x"๋กœ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ ํฌ๊ธฐ์™€ ๋ฐ€๋„ ์ •๋ณด๊ฐ€ ์‹ค์ œ ๋””๋ฐ”์ด์Šค ์ŠคํŽ™๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€ํ† ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.


116-126: Motorola moto g 5G (2022) ๋””๋ฐ”์ด์Šค ์ถ”๊ฐ€ ํ™•์ธ
์ƒˆ๋กœ์šด Motorola ๋””๋ฐ”์ด์Šค๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. API, ๋ธŒ๋žœ๋“œ, codename ๋ฐ ์Šคํฌ๋ฆฐ ์‚ฌ์–‘์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง€์ •๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‹ค์ œ ๋””๋ฐ”์ด์Šค ์ŠคํŽ™๊ณผ ๋น„๊ตํ•˜์—ฌ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.


293-302: ๊ธฐ์กด Samsung ๋””๋ฐ”์ด์Šค ์ •๋ณด ์—…๋ฐ์ดํŠธ ๊ฒ€ํ† 
๊ธฐ์กด Samsung ๋””๋ฐ”์ด์Šค์˜ codename๊ณผ id๊ฐ€ "gta7lite"์—์„œ "gts7xllite"๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฉฐ, ์ด๋ฆ„ ๋ฐ ์Šคํฌ๋ฆฐ ์‚ฌ์–‘๋„ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ •๋œ ๋‚ด์šฉ์ด ์‹ค์ œ ๋””๋ฐ”์ด์Šค ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜์˜ํ•˜๋Š”์ง€ ์žฌ๊ฒ€ํ† ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.


314-324: Samsung Galaxy Tab S8 Ultra ๋””๋ฐ”์ด์Šค ์ถ”๊ฐ€ ํ™•์ธ
์ƒˆ๋กœ์šด Galaxy Tab S8 Ultra ๋””๋ฐ”์ด์Šค๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ณต๋œ API ๋ฒ„์ „, ์Šคํฌ๋ฆฐ ํ•ด์ƒ๋„ ๋ฐ ๋ฐ€๋„ ์ •๋ณด๊ฐ€ ์ •ํ™•ํ•œ์ง€ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.


325-335: Samsung Galaxy Tab S9 FE 5G ๋””๋ฐ”์ด์Šค ์ถ”๊ฐ€ ํ™•์ธ
์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ Galaxy Tab S9 FE 5G ๋””๋ฐ”์ด์Šค์˜ ์ •๋ณด๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ์ž…๋ ฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ ์‚ฌ์–‘๊ณผ API ๋ ˆ๋ฒจ ๋“ฑ ๋ชจ๋“  ์˜ต์…˜์ด ๊ธฐ๋Œ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ์ถ”๊ฐ€ ๊ฒ€์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


391-401: Samsung Galaxy S21 ๋””๋ฐ”์ด์Šค ์ถ”๊ฐ€ ๊ฒ€ํ† 
์ƒˆ๋กœ์šด Galaxy S21 ๋””๋ฐ”์ด์Šค๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ, API ๋ฐ ์Šคํฌ๋ฆฐ ์ •๋ณด๊ฐ€ ์ œ๊ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ screenDensity ๊ฐ’์ด 421๋กœ ์„ค์ •๋œ ์ ์ด ์ผ๋ฐ˜์ ์ธ ๊ฐ’(์˜ˆ: 420)๊ณผ ์•ฝ๊ฐ„ ์ฐจ์ด๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ ์ŠคํŽ™๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.


491-501: Samsung Galaxy S21 Plus ๋””๋ฐ”์ด์Šค ์ถ”๊ฐ€ ๊ฒ€ํ† 
Galaxy S21 Plus ๋””๋ฐ”์ด์Šค๊ฐ€ ์ƒˆ๋กœ์šด ์˜ต์…˜์œผ๋กœ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. screenDensity ๊ฐ’์ด 394๋กœ ์„ค์ •๋œ ์ ์„ ํฌํ•จํ•˜์—ฌ, ์ž…๋ ฅ๋œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์‹ค์ œ ๋””๋ฐ”์ด์Šค ์ŠคํŽ™๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€ํ† ํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

data/src/main/java/remote/dto/auth/response/DoMaLoginResponse.kt (1)

14-14: JSON ํ•„๋“œ ์ด๋ฆ„์ด ์นด๋ฉœ์ผ€์ด์Šค ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ JSON ํ•„๋“œ๋“ค์€ ๋ชจ๋‘ ์นด๋ฉœ์ผ€์ด์Šค(accessToken, refreshToken ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ, Authority๋Š” ํŒŒ์Šค์นผ์ผ€์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ API๊ฐ€ ์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ ์‘๋‹ตํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ฐ€๋Šฅํ•˜๋ฉด ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/component/navigationbar/DomaNavBar.kt (1)

1-70: DomaNavBar ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž˜ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ๊ตฌํ˜„์ด ์ปดํฌ์ฆˆ ํŒจํ„ด์„ ์ž˜ ๋”ฐ๋ฅด๊ณ  ์žˆ์œผ๋ฉฐ, ๊น”๋”ํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์•„์ดํ…œ์˜ ํด๋ฆญ ์ƒํƒœ์™€ ์„ ํƒ ์ƒํƒœ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงฐ Tools
๐Ÿช› GitHub Actions: Android CI

[warning] 24-24: Parameter 'typography' is never used, could be renamed to _

presentation/src/main/java/component/modifier/DoMaIcon.kt (4)

24-35: ํ•จ์ˆ˜๋ช…๊ณผ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

SerchIcon๊ณผ R.drawable.serach์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ์˜์–ด ์ฒ ์ž๋Š” 'Search'์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์„ธ์š”:

-fun SerchIcon(
+fun SearchIcon(
    modifier: Modifier = Modifier,
    tint: Color = Color.Unspecified
){
    Image(
-        painter = painterResource(id = R.drawable.serach),
+        painter = painterResource(id = R.drawable.search),
        contentDescription = "๊ฒ€์ƒ‰",
        modifier = modifier,
        colorFilter = if (tint != Color.Unspecified) ColorFilter.tint(tint) else null
    )
}

๋ฆฌ์†Œ์Šค ์ด๋ฆ„๋„ drawable ํด๋”์—์„œ serach.xml์„ search.xml๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


60-71: contentDescription์ด ๋ถ€์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

NoticeIcon์˜ contentDescription์ด "mypageIcon"์œผ๋กœ ์ž˜๋ชป ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ ‘๊ทผ์„ฑ ์ธก๋ฉด์—์„œ ์ •ํ™•ํ•œ ์„ค๋ช…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์„ธ์š”:

fun NoticeIcon(
    modifier: Modifier = Modifier,
    isSelected: Boolean = false,
){
    Icon(
        painter = painterResource(id = R.drawable.notice),
-        contentDescription = "mypageIcon",
+        contentDescription = "noticeIcon",
        modifier = modifier,
        tint = if (isSelected) DoMaColor.MAIN else DoMaColor.WHITE
    )
}

73-82: ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์— ์˜คํƒ€๊ฐ€ ์žˆ๊ณ  contentDescription์ด ๋ถ€์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

R.drawable.notserach์— ์˜คํƒ€๊ฐ€ ์žˆ๊ณ , contentDescription์ด "mypageIcon"์œผ๋กœ ์ž˜๋ชป ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜์„ธ์š”:

fun NotSearchIcon(
    modifier: Modifier = Modifier,
){
    Icon(
-        painter = painterResource(id = R.drawable.notserach),
-        contentDescription = "mypageIcon",
+        painter = painterResource(id = R.drawable.notsearch),
+        contentDescription = "notSearchIcon",
        modifier = modifier,
    )
}

๋ฆฌ์†Œ์Šค ์ด๋ฆ„๋„ drawable ํด๋”์—์„œ notserach.xml์„ notsearch.xml๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


37-47: HomeIcon์˜ ์ปฌ๋Ÿฌ ๋กœ์ง์ด ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

์„ ํƒ ์ƒํƒœ์— ๋”ฐ๋ผ ์•„์ด์ฝ˜ ์ƒ‰์ƒ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๋กœ์ง์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/view/theme/color/DoMaColor.kt (2)

12-12: ๊ณต๋ฐฑ ํ•œ์นธ ์‚ญ์ œํ•ด์ฃผ์„ธ์š”


14-14: GRAY ์ƒ‰์ƒ๊ฐ’์ด ๊ทธ๋ ˆ์ด ์ƒ‰์ƒ๊ณผ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ GRAY ์ƒ‰์ƒ์˜ ๊ฐ’์€ Color(0xFF9AD54A)๋กœ ์—ฐ๋‘์ƒ‰/๋ผ์ž„์ƒ‰์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ƒ‰์ƒ ์ด๋ฆ„๊ณผ ์‹ค์ œ ์ƒ‰์ƒ๊ฐ’์ด ์ผ์น˜ํ•˜์ง€ ์•Š์•„ ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ˆ์ด ์ƒ‰์ƒ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ƒ‰์ƒ ์ด๋ฆ„์„ ์‹ค์ œ ์ƒ‰์ƒ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

presentation/src/main/java/view/main/screen/MainScreen.kt (3)

142-142: ํ…Œ๋งˆ ์‹œ์Šคํ…œ์—์„œ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ๊ฐ’(Color(0xFF1E1E1E))์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ง€์ ๋œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ํ…Œ๋งˆ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”:

- .background(color = Color(0xFF1E1E1E)),
+ .background(color = colors.background),

153-155: ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•ด์ฃผ์„ธ์š”.

๋‘ ์ค„์˜ ๊ณต๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ด๋ฏธ ์ง€์ ๋œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.


182-182: ํ…Œ๋งˆ ์‹œ์Šคํ…œ์—์„œ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ‰์ƒ๊ฐ’(Color(0xFF252525))์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ง€์ ๋œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ํ…Œ๋งˆ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”:

- color = Color(0xFF252525), shape = RoundedCornerShape(size = 10.dp)
+ color = colors.surfaceVariant, shape = RoundedCornerShape(size = 10.dp)

package remote.dto.auth.response

import model.auth.response.GAuthLoginResponseModel
import model.auth.response.DoMaLoginResponseModel
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue

๋ชจ๋ธ ์ฐธ์กฐ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”.

ํŒŒ์ดํ”„๋ผ์ธ ์˜ค๋ฅ˜์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด DoMaLoginResponseModel ํด๋ž˜์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ๋กœ ์ž„ํฌํŠธ๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ํ•ด๋‹น ๋ชจ๋ธ ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”.

๐Ÿงฐ Tools
๐Ÿช› GitHub Actions: Android CI

[error] 3-17: Unresolved reference: DoMaLoginResponseModel


[error] 3-17: Unresolved reference: DoMaLoginResponseModel


[error] 3-17: Unresolved reference: DoMaLoginResponseModel

)
fun GAuthLoginResponse.toLogin()= GAuthLoginResponseModel(

fun DoMaLoginResponseModel.toLogin()= DoMaLoginResponseModel(
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue

ํ™•์žฅ ํ•จ์ˆ˜ ๋ฐฉํ–ฅ์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ฝ”๋“œ๋Š” DoMaLoginResponseModel์— ๋Œ€ํ•œ ํ™•์žฅ ํ•จ์ˆ˜๋กœ ์ •์˜๋˜์–ด ์žˆ์œผ๋‚˜, DTO์—์„œ ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š”:

-fun DoMaLoginResponseModel.toLogin()= DoMaLoginResponseModel(
+fun DoMaLoginResponse.toModel() = DoMaLoginResponseModel(
๐Ÿ“ 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
fun DoMaLoginResponseModel.toLogin()= DoMaLoginResponseModel(
fun DoMaLoginResponse.toModel() = DoMaLoginResponseModel(
๐Ÿงฐ Tools
๐Ÿช› GitHub Actions: Android CI

[error] 3-17: Unresolved reference: DoMaLoginResponseModel


[error] 3-17: Unresolved reference: DoMaLoginResponseModel


[error] 3-17: Unresolved reference: DoMaLoginResponseModel

import model.auth.response.DoMaLoginResponseModel
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import emumtype.Authority
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue

ํŒจํ‚ค์ง€ ์ด๋ฆ„์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

emumtype ๋Œ€์‹  enumtype์œผ๋กœ ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”.

-import emumtype.Authority
+import enumtype.Authority
๐Ÿ“ 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
import emumtype.Authority
import enumtype.Authority

currentDestination: DomaNavBarItemType,
setCurrentDestination: (DomaNavBarItemType) -> Unit,
) {
DoMaAndroidTheme { colors, typography ->
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ์ฒ˜๋ฆฌ ํ•„์š”

DoMaAndroidTheme์—์„œ typography ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์–ธ๋”์Šค์ฝ”์–ด(_)๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

-    DoMaAndroidTheme { colors, typography ->
+    DoMaAndroidTheme { colors, _ ->
๐Ÿ“ 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
DoMaAndroidTheme { colors, typography ->
DoMaAndroidTheme { colors, _ ->
๐Ÿงฐ Tools
๐Ÿช› GitHub Actions: Android CI

[warning] 24-24: Parameter 'typography' is never used, could be renamed to _

object DoMaColor : ColorTheme(){
override val MAIN = Color(0xFF252525)
override val DARKGARY = Color(0xFFBEBEBE)
override val SMAlLDARKGARY = Color(0xFF4C4C4C)
Copy link

Choose a reason for hiding this comment

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

๐Ÿ› ๏ธ Refactor suggestion

์ƒ์ˆ˜๋ช…์˜ ์ฒ ์ž์™€ ์ผ๊ด€์„ฑ ๊ฐœ์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

'SMAlLDARKGARY'์—๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ๋Œ€์†Œ๋ฌธ์ž ํ˜ผ์šฉ: 'SMAlL'์ด ์•„๋‹Œ 'SMALL'๋กœ ํ†ต์ผ
  2. ์˜คํƒ€: 'GARY'๊ฐ€ ์•„๋‹Œ 'GRAY'๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ฒ ์ž
  3. ์—ฌ๋Ÿฌ ๋‹จ์–ด๋กœ ๊ตฌ์„ฑ๋œ ์ƒ์ˆ˜๋ช…์€ ์–ธ๋”์Šค์ฝ”์–ด(_)๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ๊ด€๋ก€์ž…๋‹ˆ๋‹ค
-    override val SMAlLDARKGARY = Color(0xFF4C4C4C)
+    override val SMALL_DARK_GRAY = Color(0xFF4C4C4C)
๐Ÿ“ 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
override val SMAlLDARKGARY = Color(0xFF4C4C4C)
override val SMALL_DARK_GRAY = Color(0xFF4C4C4C)

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

๐Ÿงน Nitpick comments (1)
presentation/src/main/java/viewModel/admin/AdminViewModel.kt (1)

111-111: ๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

getPenaltyList ํ•จ์ˆ˜์™€ postClean ํ•จ์ˆ˜ ์‚ฌ์ด์— ๋ถˆํ•„์š”ํ•œ ๋นˆ ์ค„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๐Ÿ“œ Review details

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

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between 82ee5bb and bd0535b.

๐Ÿ“’ Files selected for processing (4)
  • data/src/main/java/remote/dto/auth/response/GAuthLoginResponse.kt (1 hunks)
  • data/src/main/java/repoistory/UsersRepositoryImpl.kt (1 hunks)
  • presentation/src/main/java/component/navigationbar/DomaNavBar.kt (1 hunks)
  • presentation/src/main/java/viewModel/admin/AdminViewModel.kt (3 hunks)
โœ… Files skipped from review due to trivial changes (1)
  • data/src/main/java/repoistory/UsersRepositoryImpl.kt
๐Ÿšง Files skipped from review as they are similar to previous changes (1)
  • presentation/src/main/java/component/navigationbar/DomaNavBar.kt
โฐ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build
๐Ÿ”‡ Additional comments (8)
presentation/src/main/java/viewModel/admin/AdminViewModel.kt (5)

3-3: import ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Untill ํด๋ž˜์Šค ์ด๋ฆ„์ด until๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๊ณ , ์ด์— ๋”ฐ๋ผ import ๋ฌธ์ด ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์€ ์ฝ”ํ‹€๋ฆฐ ํŒจํ‚ค์ง€ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์— ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.


52-52: Result ํƒ€์ž… ์ฐธ์กฐ๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Untill.Result ์ฐธ์กฐ๊ฐ€ ๋ชจ๋“  ์œ„์น˜์—์„œ until.Result๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” import ๋ณ€๊ฒฝ๊ณผ ์ผ์น˜ํ•˜๋ฉฐ ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Also applies to: 56-56, 60-60, 74-74, 78-78, 82-82, 95-95, 99-99, 103-103, 120-120, 124-124, 128-128


67-88: postPenalty ํ•จ์ˆ˜์˜ ํ˜•์‹์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์˜ ํฌ๋งทํŒ…์ด ์ผ๊ด€๋˜๊ฒŒ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋“ค์—ฌ์“ฐ๊ธฐ์™€ ์ค„๋ฐ”๊ฟˆ์ด ๋” ๋ช…ํ™•ํ•ด์ ธ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


113-116: ํŒŒ๋ผ๋ฏธํ„ฐ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ๋งˆ๋‹ค ํ•œ ์ค„์”ฉ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋ฆฌ๋ทฐ์—์„œ "ํ•œ ์นธ์”ฉ ๋„์šด ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”?"๋ผ๋Š” ์งˆ๋ฌธ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ด ๋ณ€๊ฒฝ์œผ๋กœ ๊ทธ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ์ด๋ฃจ์–ด์ง„ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.


40-42: getUsersName ๊ธฐ๋Šฅ์ด ์ œ๊ฑฐ๋˜์—ˆ๋Š”๋ฐ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ๋‚˜์š”?

getUsersName ํ•จ์ˆ˜๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์ง€๋งŒ, ๊ด€๋ จ ์ƒํƒœ์ธ _getUserNameUiState์™€ ๊ทธ getter๋Š” ์—ฌ์ „ํžˆ ์ฝ”๋“œ์— ๋‚จ์•„์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ƒํƒœ๊ฐ€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ•จ๊ป˜ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

data/src/main/java/remote/dto/auth/response/GAuthLoginResponse.kt (3)

6-6: ํ•„์š”ํ•œ import ์ถ”๊ฐ€๋จ.

Authority enum ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ import๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


21-22: toLogin() ํ•จ์ˆ˜ ์—…๋ฐ์ดํŠธ.

toLogin() ํ•จ์ˆ˜์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ authority ํ•„๋“œ๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๋ณ€ํ™˜ ์‹œ ํ•„์š”ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ž˜ ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค.


14-14:

Details

โ“ Verification inconclusive

Authority ํ•„๋“œ ์ถ”๊ฐ€.

authority ์†์„ฑ์ด ์ ์ ˆํ•˜๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ JSON ์ด๋ฆ„์ด "Authority"๋กœ PascalCase๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋‹ค๋ฅธ ํ•„๋“œ๋“ค์€ camelCase๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. API ์„ค๊ณ„์— ๋”ฐ๋ฅธ ๊ฒƒ์ด๋ผ๋ฉด ๋ฌธ์ œ์—†์œผ๋‚˜, ์ผ๊ด€์„ฑ ์ธก๋ฉด์—์„œ ํ™•์ธํ•ด๋ณด์„ธ์š”.


๐Ÿ Script executed:

#!/bin/bash
# JSON ์ด๋ฆ„ ์ปจ๋ฒค์…˜ ๊ฒ€์‚ฌ
rg -A 1 '@Json\(name = "([A-Z][a-zA-Z0-9]*)"' data/src/main/java/remote/dto --glob "*.kt"

Length of output: 952


๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ์žฌ๊ฒ€ํ†  ์š”์ฒญ: "Authority" JSON ํ•„๋“œ ๋ช… ์ผ๊ด€์„ฑ ํ™•์ธ

  • ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ authority ํ•„๋“œ๋Š” ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋ฌธ์ œ ์—†์ด ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋งŒ, ํ˜„์žฌ @Json(name = "Authority")์™€ ๊ฐ™์ด PascalCase๋ฅผ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.
  • ์ปค๋ฐ‹ ๋‚ด ๋‹ค๋ฅธ DTO ํŒŒ์ผ(์˜ˆ: AdminPenaltyResponse.kt)์—์„œ๋Š” PascalCase์™€ camelCase๊ฐ€ ํ˜ผ์šฉ๋˜์–ด ์žˆ๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.
  • API ์„ค๊ณ„๋‚˜ ํšŒ์‚ฌ ๊ฐ€์ด๋“œ์— ๋”ฐ๋ฅธ ๊ฒฐ์ •์ด๋ผ๋ฉด ์ƒ๊ด€์—†์œผ๋‚˜, ์ „์ฒด ๋„ค์ด๋ฐ ์ •์ฑ…์˜ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๋‹ค์‹œ ํ•œ ๋ฒˆ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.

@kimjeakwan kimjeakwan merged commit 181d567 into develop Mar 8, 2025
2 checks passed
@kimjeakwan kimjeakwan deleted the feature/64-admin-PostSerchScreen branch March 8, 2025 00:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants