-
Notifications
You must be signed in to change notification settings - Fork 0
๐(64) :: ๊ฒ์ ๊ธฐ๋ฅ์ ๊ตฌํ ๋ฐ ํ์ผ๊ตฌ์กฐ ๋ณ๊ฒฝ ๋ฑ ๋ฆฌํํ ๋ง์ ํ์ต๋๋ค. #65
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this 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 issueNavGraphBuilder ํ์ฅ ํจ์๊ฐ ๋๋ฝ๋์์ต๋๋ค.
ํ์ผ์
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 issuegetStudentSearch ๋ฉ์๋ ๋๋ฝ
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 kotlinLength 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: Colorpresentation/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์ ์ ์ฉํ์ฌ ์ผ๊ด๋ ์คํ์ผ๋ง์ ์ ์งํ๊ณ ์์ต๋๋ค.
๋ช ๊ฐ์ง ๊ฐ์ ํ ์ :
์์ด์ฝ ๋ฒํผ์ ๋ด์ฉ์ด ๋จ์ํ
DoMaIcon()์ผ๋ก ์ ์๋์ด ์์ด ์ด๋ค ์์ด์ฝ์ธ์ง ๋ช ํํ์ง ์์ต๋๋ค. ๋ ๊ตฌ์ฒด์ ์ธ ์์ด์ฝ ์ง์ ์ด ํ์ํฉ๋๋ค.
onDemeritStudentClick()์ ์ง์ ํธ์ถํ๊ธฐ๋ณด๋คonClick์ ๋ฐ๋ก ํจ์ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๊ฐ๊ฒฐํฉ๋๋ค.IconButton( - onClick = { onDemeritStudentClick() }, + onClick = onDemeritStudentClick, modifier = Modifier, ) { - DoMaIcon() + DoMaIcon(iconType = IconType.DEMERIT) // ๋๋ ์ ์ ํ ์์ด์ฝ ์ ํ }
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 ํจํด์ ์ ๋ฐ๋ฅด๊ณ ์์ง๋ง, ๋ช ๊ฐ์ง ๊ฐ์ ํ ์ ์ด ์์ต๋๋ค:
- ๋์ผํ modifier ์ธ์คํด์ค๊ฐ ์ฌ๋ฌ ์ปดํฌ์ ๋ธ์์ ์ฌ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. ์ด๋ก ์ธํด ์์์น ๋ชปํ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ผ๊ด์ฑ ์๋ ๋ช ๋ช ๊ท์น:
DomaNavBarItemType.HOME์ ๋๋ฌธ์์ธ ๋ฐ๋ฉด, ๋ค๋ฅธ ํญ๋ชฉ๋ค์ ์ฒซ ๊ธ์๋ง ๋๋ฌธ์์ ๋๋ค.- ๋ด๋น๊ฒ์ด์ ์์ดํ ๊ฐ ๊ฐ๊ฒฉ์ด ๋ช ์๋์ด ์์ง ์์ต๋๋ค.
- ์ ๊ทผ์ฑ ๊ธฐ๋ฅ(์: 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.AdminStudentListResponsepresentation/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)์ด ์์ต๋๋ค. ์ด๋ ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์์ ๋ ์ด์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ํ๋ ๊ฒ์ ๊ณ ๋ คํด๋ณด์ธ์:
- ํ๋์ฝ๋ฉ๋ ์์์ ํ ๋ง ์์์ผ๋ก ๋ณ๊ฒฝ:
- .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
- ๊ณ ์ ๋๋น ๊ฐ ๋์ ๊ฐ์ค์น ๋๋ ๋น์จ ์ฌ์ฉ:
- 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
โ Files ignored due to path filters (3)
buildSrc/build/kotlin/compileKotlin/cacheable/last-build.binis excluded by!**/*.binbuildSrc/build/kotlin/compileKotlin/local-state/build-history.binis excluded by!**/*.binbuildSrc/build/libs/buildSrc.jaris 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 doneLength 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 kotlinLength 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" | sortLength 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ํคLocalDensityDensityLocal์ด ๊ท์น๋ค์ Compose ์ปดํ์ผ๋ฌ์ ์ต์ ํ์ ํ ํ์ ํจ์จ์ฑ์ ๋์ด๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. ํนํ ๋ช ์ฌํ PascalCase๋ ์ ์ธ์ UI์ ํน์ฑ์ ๋ฐ์ํ๋ฉฐ,
remember์ ๋์ฌ๋ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ช ํํ ํฉ๋๋ค[3][5][7].Citations:
- 1: https://wonsohana.wordpress.com/2023/08/14/api-guidelines-for-jetpack-compose-%EC%A0%95%EB%A6%AC-1/
- 2: https://blog.stackademic.com/naming-conventions-for-jetpack-compose-functions-e4dc703c17c8
- 3: https://emit-steam.tistory.com/21
- 4: https://itstory1592.tistory.com/74
- 5: https://github.com/androidx/androidx/blob/androidx-main/compose/docs/compose-api-guidelines.md
- 6: https://developer88.tistory.com/entry/Android-Jetpack-Compose-%EC%B4%9D%EC%A0%95%EB%A6%AC-Composable-Functions
- 7: https://velog.io/@hogu59/API-Guidelines-for-Jetpack-Compose-%EB%B2%88%EC%97%AD%EB%B3%B8
- 8: https://nimblehq.co/compass/development/android/user-interface/jetpack-compose/
- 9: https://velog.io/@_im_ssu/Compose-Unit-1.-%EA%B8%B0%EC%B4%88
- 10: https://devel-yong.tistory.com/entry/Compose-API-GuideLine
๋ค์ด๋ฐ ์ปจ๋ฒค์ ๊ฒ์ฆ ๊ฒฐ๊ณผ:
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 kotlinLength 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 kotlinLength 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 kotlinLength 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 20Length 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 kotlinLength 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 kotlinLength 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์์๋ฅผ ๋ณ๋ ํค๋ก ๋์ด ๊ฐ๋ ์ฑ์ ๋์ด๋ ๋ฐฉ์์ด ์ ์ ์ฉ๋์์ต๋๋ค.
| fun NavController.navigationToMyPage() { | ||
| this.navigate(MyPage_loute) | ||
| } |
There was a problem hiding this comment.
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.
| fun NavController.navigationToMyPage() { | |
| this.navigate(MyPage_loute) | |
| } | |
| fun NavController.navigationToMyPage() { | |
| this.navigate(MyPage_route) | |
| } |
| } | ||
|
|
||
| is UsersUiState.Empty -> { | ||
| MyPageEmptyText() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| 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() |
| @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, | ||
| ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ํด๋์ค ์ด๋ฆ ์คํ ์์ ํ์
๋ฐ์ดํฐ ํด๋์ค์ ์ด๋ฆ์ ์คํ๊ฐ ์์ต๋๋ค. 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.
| @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, | |
| ) |
| @Composable | ||
| fun NotSearchIcon( | ||
| modifier: Modifier = Modifier, | ||
| ){ | ||
| Icon( | ||
| painter = painterResource(id = R.drawable.notserach), | ||
| contentDescription = "mypageIcon", | ||
| modifier = modifier, | ||
| ) | ||
| } No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ฆฌ์์ค ์ด๋ฆ์ ์คํ๊ฐ ์๊ณ 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.
| @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, | |
| ) | |
| } |
| package component.combinationvIew | ||
|
|
There was a problem hiding this comment.
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๋ก ์์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ด๋ จ๋ ๋ชจ๋ ์ํฌํธ๋ ํจ๊ป ์์ ํด์ผ ํฉ๋๋ค.
| internal var role = authRepository.getRole() | ||
| private var refreshToken = runBlocking { authRepository.getRefreshToken().first() } |
There was a problem hiding this comment.
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.
| 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() | |
| } | |
| } |
| 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 | ||
| } | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
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 ->
...
}
}| 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 | ||
| } | ||
| } |
There was a problem hiding this comment.
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.
| 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 | |
| } | |
| } |
DomaAndroidTheme ์ ์ฉ
data/src/main/java/remote/dto/admin/request/AdminPenaltyRequest.kt
Outdated
Show resolved
Hide resolved
data/src/main/java/remote/dto/admin/request/AdminPenaltyRequest.kt
Outdated
Show resolved
Hide resolved
data/src/main/java/remote/dto/admin/request/AuthorityRequest.kt
Outdated
Show resolved
Hide resolved
data/src/main/java/remote/dto/auth/response/GAuthLoginResponse.kt
Outdated
Show resolved
Hide resolved
| data class GAuthLoginResponseModel( | ||
| val accessToken: String, | ||
| val refreshToken: String, | ||
| val accessTokenExpiresIn: String, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๊ณต๋ฐฑ ํ์นธ ์ง์์ฃผ์ธ์
| ) | ||
| } | ||
|
|
||
| } | ||
|
|
||
| } No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
34๋ฒ ์ค๊ณผ 36๋ฒ ์ค ์ญ์ ํด์ฃผ์ธ์
There was a problem hiding this 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
๐ 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)), |
There was a problem hiding this comment.
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.
| .background(color = Color(0xFF1E1E1E)), | |
| .background(color = colors.background), |
There was a problem hiding this 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,CardShadowKotlin์์ ์์๋ ์ผ๋ฐ์ ์ผ๋ก 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 issueMyPageEmptyText ์ปดํฌ๋ํธ ์ํฌํธ๊ฐ ๋๋ฝ๋์์ต๋๋ค.
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 = authoritypresentation/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 ํ์ดํ๋ผ์ธ์์๋ ๊ฒฝ๊ณ ๋ก ํ์๋์์ต๋๋ค.์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ก ์์ ํด์ฃผ์ธ์:
- ํ๋ผ๋ฏธํฐ๊ฐ ํ์ํ๋ค๋ฉด ํจ์ ๋ด์์ ์ฌ์ฉํ๋๋ก ๊ตฌํ
- ํ๋ผ๋ฏธํฐ๊ฐ ํ์์๋ค๋ฉด ์ ๊ฑฐํ๊ฑฐ๋ ์ธ๋์ค์ฝ์ด(
_)๋ก ๋ณ๊ฒฝ- 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
๐ 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๋ชจ๋ธ ์ฐธ์กฐ ์ค๋ฅ๋ฅผ ์์ ํด์ฃผ์ธ์.
ํ์ดํ๋ผ์ธ ์ค๋ฅ์์ ์ ์ ์๋ฏ์ด 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( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ํ์ฅ ํจ์ ๋ฐฉํฅ์ด ์๋ชป๋์์ต๋๋ค.
ํ์ฌ ์ฝ๋๋ 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.
| 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ํจํค์ง ์ด๋ฆ์ ์คํ๊ฐ ์์ต๋๋ค.
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.
| import emumtype.Authority | |
| import enumtype.Authority |
| currentDestination: DomaNavBarItemType, | ||
| setCurrentDestination: (DomaNavBarItemType) -> Unit, | ||
| ) { | ||
| DoMaAndroidTheme { colors, typography -> |
There was a problem hiding this comment.
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.
| 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) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๐ ๏ธ Refactor suggestion
์์๋ช ์ ์ฒ ์์ ์ผ๊ด์ฑ ๊ฐ์ ์ด ํ์ํฉ๋๋ค.
'SMAlLDARKGARY'์๋ ์ฌ๋ฌ ๋ฌธ์ ๊ฐ ์์ต๋๋ค:
- ๋์๋ฌธ์ ํผ์ฉ: 'SMAlL'์ด ์๋ 'SMALL'๋ก ํต์ผ
- ์คํ: 'GARY'๊ฐ ์๋ 'GRAY'๊ฐ ์ฌ๋ฐ๋ฅธ ์ฒ ์
- ์ฌ๋ฌ ๋จ์ด๋ก ๊ตฌ์ฑ๋ ์์๋ช ์ ์ธ๋์ค์ฝ์ด(_)๋ก ๊ตฌ๋ถํ๋ ๊ฒ์ด ๊ด๋ก์ ๋๋ค
- 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.
| override val SMAlLDARKGARY = Color(0xFF4C4C4C) | |
| override val SMALL_DARK_GRAY = Color(0xFF4C4C4C) |
There was a problem hiding this 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
๐ 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 ์ถ๊ฐ๋จ.
Authorityenum ํ์ ์ ์ฌ์ฉํ๊ธฐ ์ํ 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 ์ค๊ณ๋ ํ์ฌ ๊ฐ์ด๋์ ๋ฐ๋ฅธ ๊ฒฐ์ ์ด๋ผ๋ฉด ์๊ด์์ผ๋, ์ ์ฒด ๋ค์ด๋ฐ ์ ์ฑ ์ ์ผ๊ด์ฑ์ ์ํด ๋ค์ ํ ๋ฒ ํ์ธํด ์ฃผ์ธ์.
๐ก ๊ฐ์
๊ฒ์ ๊ธฐ๋ฅ, ํ์ผ๊ตฌ์กฐ ๋ณ๊ฒฝ,์ฝ๋ ์ปจ๋ฒค์ ์ ๋ง๊ฒ ๋ณ๊ฒฝ, Doma Navbar๋ฅผ ๊ตฌํํ์ต๋๋ค,
๐ ์์ ๋ด์ฉ
๊ฒ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํ PostDemeritSearchScreen ๋ฅผ ๊ตฌํํ๊ณ ,
๊ถํ ๋ณ๊ฒฝ์ ์ํด AdminAPI ์ ๊ถํ๋ณ๊ฒฝ์ ์ถ๊ฐํ์ต๋๋ค. ์ ๋ฐฐ๋๋ค์ด ์ฝ๋๋ฆฌ๋ทฐํด์ฃผ์ ํ์ผ๊ตฌ์กฐ ๋ณ๊ฒฝ ๋ฐ ๋ค์ด๋ฐ์ ๋ฆฌํํ ๋ง ํ์ต๋๋ค. DomaNavbar ๋ฅผ ์ํ combinnavgation ๋ฐ combinview ๋ฅผ ๊ตฌํํ์ต๋๋ค
๐ ๋ณ๊ฒฝ์ฌํญ
Admin API ๊ถํ๋ณ๊ฒฝ API ์ถ๊ฐ, AutrityRequest ์ถ๊ฐ, ChangeAuthorityUseCase ์ถ๊ฐ, CombinationViewNavgation ์ถ๊ฐ, DoMaCombinatinView ์ถ๊ฐ, DOmaSearchTextField ์ถ๊ฐ, GetStudentSearchUseCase ์ถ๊ฐ LocalDatasource ์
ROle ์ถ๊ฐ, PostDemeirComponent ์ถ๊ฐ , ์์ธ์ฒ๋ฆฌ๋ฅผ ์ํ SearchEmptyText ์ถ๊ฐ
MainScreen์ scrollState ๋ฅผ ์ํํธ์ด์คํ
๐โโ๏ธ ์ง๋ฌธ์ฌํญ
๐ด ์ฌ์ฉ๋ฐฉ๋ฒ
๐ธ ๊ธฐํ
Summary by CodeRabbit
์ ๊ท ๊ธฐ๋ฅ
๋ฆฌํฉํ ๋ง ๋ฐ ์ ์ง ๋ณด์