-
Notifications
You must be signed in to change notification settings - Fork 0
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
๐ :: (#448) ์ทจ์ ๋ฅ ์์ธ ์กฐํ ํ์ด์ง ์ ์ #449
base: develop
Are you sure you want to change the base?
The head ref may contain hidden characters: "feature/448-\uCDE8\uC5C5\uB960-\uC0C1\uC138-\uC870\uD68C-\uD398\uC774\uC9C0-\uC81C\uC791"
๐ :: (#448) ์ทจ์ ๋ฅ ์์ธ ์กฐํ ํ์ด์ง ์ ์ #449
Conversation
ksp ๋ฒ์ ํธํ
Walkthrough์ด๋ฒ PR์์๋ ๊ณ ์ฉ(employment) ๊ธฐ๋ฅ์ ๋์ ๊ณผ ๊ด๋ จ๋ ์ฌ๋ฌ ๋ณ๊ฒฝ ์ฌํญ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ฑ ๋ชจ๋์์ ๊ณ ์ฉ ๊ด๋ จ ๋ค๋น๊ฒ์ด์ ๊ธฐ๋ฅ ๋ฐ ์์กด์ฑ์ด ์ถ๊ฐ๋์์ผ๋ฉฐ, Core ๊ณ์ธต์์๋ ๊ณ ์ฉ ์ํ๋ฅผ ๊ฐ์ ธ์ค๋ API์ ๋ฐ์ดํฐ ๋ชจ๋ธ, ๋ฆฌํฌ์งํ ๋ฆฌ, ์ ์ฆ์ผ์ด์ค ์ธํฐํ์ด์ค๊ฐ ํ์ฅ๋์์ต๋๋ค. ๋ํ, ๊ณ ์ฉ ๊ธฐ๋ฅ ์ ์ฉ ๋ชจ๋์ด ์๋กญ๊ฒ ์ถ๊ฐ๋์ด UI, ๋ค๋น๊ฒ์ด์ , ๋ทฐ๋ชจ๋ธ ๋ฐ ๋ฆฌ์์ค ๋ฑ์ด ์ ์๋์๊ณ , Gradle ๊ตฌ์ฑ ํ์ผ๊ณผ ๋น๋ ์คํฌ๋ฆฝํธ์์๋ ์ ๋ฐ์ดํธ๊ฐ ์ด๋ฃจ์ด์ก์ต๋๋ค. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant HomeScreen
participant JobisNavigator
participant NavController
participant EmploymentScreen
User->>HomeScreen: ๊ณ ์ฉ ๋ฒํผ ํด๋ฆญ
HomeScreen->>JobisNavigator: onEmploymentClick ์ฝ๋ฐฑ ํธ์ถ
JobisNavigator->>NavController: navigateToEmployment() ํธ์ถ
NavController->>EmploymentScreen: ๊ณ ์ฉ ํ๋ฉด์ผ๋ก ์ด๋
sequenceDiagram
participant EmploymentViewModel
participant FetchEmploymentStatusUseCase
participant ApplicationRepository
participant NetworkLayer
EmploymentViewModel->>FetchEmploymentStatusUseCase: invoke() ํธ์ถ
FetchEmploymentStatusUseCase->>ApplicationRepository: fetchEmploymentStatus() ์์ฒญ
ApplicationRepository->>NetworkLayer: ๊ณ ์ฉ ์ํ ์์ฒญ
NetworkLayer-->>ApplicationRepository: FetchEmploymentStatusResponse ๋ฐํ
ApplicationRepository-->>FetchEmploymentStatusUseCase: ์๋ต ์ ๋ฌ
FetchEmploymentStatusUseCase-->>EmploymentViewModel: ์ํฐํฐ ๋ณํ ํ ๋ฐํ
Suggested reviewers
Poem
โจ Finishing Touches
๐ชง TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration 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.
Actionable comments posted: 15
๐งน Nitpick comments (17)
app/build.gradle.kts (1)
56-59
: ์ฃผ์ ์ฒ๋ฆฌ๋ ๋๋ฒ๊ทธ ๊ตฌ์ฑ์ ์ ๋ฆฌํ์ธ์.์ฃผ์ ์ฒ๋ฆฌ๋ ๊ตฌ์ฑ ์ค์ (ABI ๋ถํ , AAPT ํฌ๋ฐ์น, ๋ฐ๋ ๋ถํ )์ด ์์ต๋๋ค. ์ด๋ฌํ ์ฃผ์์ ์ ์งํ๋ ์ด์ ๊ฐ ์๋ค๋ฉด ์ฃผ์์ผ๋ก ์ค๋ช ์ ์ถ๊ฐํ๊ฑฐ๋, ๋ถํ์ํ๋ค๋ฉด ์์ ํ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
-// splits.abi.isEnable = false -// aaptOptions.cruncherEnabled = false -// splits.density.isEnable = false -// aaptOptions.cruncherEnabled = falsecore/network/src/main/java/team/retum/network/api/ApplicationApi.kt (1)
39-40
: API ํจ์์ ๋ฌธ์ ์ฃผ์์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.๊ณ ์ฉ ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ API ํจ์๊ฐ ์ถ๊ฐ๋์์ง๋ง, ์ด ํจ์์ ๋ชฉ์ ๊ณผ ๋ฐํ๊ฐ์ ๋ํ ์ค๋ช ์ด ์์ต๋๋ค. ์ฝ๋ ์ ์ง๋ณด์์ ์ดํด๋ฅผ ์ํด KDoc ํ์์ ์ฃผ์์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
+ /** + * ์ทจ์ ํํฉ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค. + * + * @return ์ทจ์ ์ํ ์ ๋ณด๊ฐ ํฌํจ๋ ์๋ต ๊ฐ์ฒด + */ @GET(RequestUrls.Applications.employment) suspend fun fetchEmploymentStatus(): FetchEmploymentStatusResponsecore/network/src/main/java/team/retum/network/datasource/application/RemoteApplicationDataSource.kt (1)
26-26
: ๋ฐ์ดํฐ ์์ค ํจ์์ ๋ฌธ์ ์ฃผ์์ ์ถ๊ฐํ์ธ์.๊ณ ์ฉ ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์๊ฐ ์ธํฐํ์ด์ค์ ์ถ๊ฐ๋์์ง๋ง, ์ด ํจ์์ ๋ชฉ์ ๊ณผ ๋ฐํ๊ฐ์ ๋ํ ์ค๋ช ์ด ์์ต๋๋ค. ์ฝ๋ ์ ์ง๋ณด์์ ์ดํด๋ฅผ ์ํด KDoc ํ์์ ์ฃผ์์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
+ /** + * ์ทจ์ ํํฉ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค. + * + * @return ์ทจ์ ์ํ ์ ๋ณด๊ฐ ํฌํจ๋ ์๋ต ๊ฐ์ฒด + */ suspend fun fetchEmploymentStatus(): FetchEmploymentStatusResponsecore/network/src/main/java/team/retum/network/datasource/application/RemoteApplicationDataSourceImpl.kt (1)
21-25
: ์ฝ๋ ์ค๋ณต์ด ๋ฐ์ํ๊ณ ์์ต๋๋ค.ํ์ฌ ๊ฐ fetch ๋ฉ์๋๋ง๋ค RequestHandler ํธ์ถ ํจํด์ด ๋ฐ๋ณต๋๊ณ ์์ต๋๋ค. ์ด๋ฌํ ๋ฐ๋ณต ํจํด์ ์ฝ๋ ์ค๋ณต์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์ค๋ณต ์ฝ๋๋ฅผ ์ค์ด๊ธฐ ์ํด ๊ณตํต fetch ๋ก์ง์ ์ถ์ถํ๋ ๊ฒ์ ๊ณ ๋ คํด๋ณด์ธ์:
+ private suspend fun <T> fetch(request: suspend () -> T): T { + return RequestHandler<T>().request { + request() + } + } override suspend fun fetchEmploymentCount(): FetchEmploymentCountResponse { - return RequestHandler<FetchEmploymentCountResponse>().request { - applicationApi.fetchEmploymentCount() - } + return fetch { applicationApi.fetchEmploymentCount() } } override suspend fun fetchEmploymentStatus(): FetchEmploymentStatusResponse { - return RequestHandler<FetchEmploymentStatusResponse>().request { - applicationApi.fetchEmploymentStatus() - } + return fetch { applicationApi.fetchEmploymentStatus() } }์ด๋ฌํ ํจํด์ ๋ชจ๋ fetch ๋ฉ์๋์ ์ ์ฉํ๋ฉด ์ฝ๋์ ์ค๋ณต์ ์ค์ด๊ณ ํฅํ ์ ์ง๋ณด์๋ฅผ ๋ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค.
Also applies to: 57-61
gradlew.bat (1)
28-29
: ๋ฐฐ์น ์คํฌ๋ฆฝํธ ์ฃผ์ ๊ด๋ จ ์กฐ์ธ์ฌ๊ธฐ์ ์ถ๊ฐ๋ ์ฃผ์์ด ์์ต๋๋ค. ์ด ์ฃผ์์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ด์ง๋ง, ์ฐ์ด์ง ์๋ ๋ณ์๋ผ๋ฉด ์ด ์ฃผ์์ด ์ค์ ๋ก ํ์ํ์ง ๊ฒํ ํ๋ ๊ฒ์ด ์ข๊ฒ ์ต๋๋ค.
core/network/src/main/java/team/retum/network/model/response/application/FetchEmploymentStatusResponse.kt (1)
6-24
: ์๋ต ๋ชจ๋ธ ํด๋์ค๊ฐ ์ ๊ตฌํ๋์์ต๋๋ค.๋ฐฑ์๋ API ์๋ต์ ๋ฐ๊ธฐ ์ํ ๋ฐ์ดํฐ ํด๋์ค ๊ตฌ์กฐ๊ฐ ์ ์ ํ๊ฒ ๊ตฌํ๋์์ต๋๋ค. ์ค์ฒฉ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ธต์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ํํํ๊ณ ์์ผ๋ฉฐ, JSON ์ด๋ ธํ ์ด์ ๋ ์ ์ ํ ์ ์ฉ๋์์ต๋๋ค.
๋ค๋ง, ์ถํ ํ์ฅ์ฑ์ ๊ณ ๋ คํ์ฌ ๋ด๋ถ ํด๋์ค๋ฅผ ๋ณ๋ ํ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ๋ ๊ณ ๋ คํด ๋ณผ ์ ์์ต๋๋ค.
๋ด๋ถ ํด๋์ค๋ฅผ ๋ณ๋ ํ์ผ๋ก ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ:
// GetEmploymentRateList.kt @JsonClass(generateAdapter = true) data class GetEmploymentRateList( @Json(name = "id") val id: Int, @Json(name = "company_name") val companyName: String, @Json(name = "logo_url") val logoUrl: String ) // ClassEmploymentStatusResponse.kt @JsonClass(generateAdapter = true) data class ClassEmploymentStatusResponse( @Json(name = "class_id") val classId: Int, @Json(name = "employment_rate_response_list") val employmentRateList: List<GetEmploymentRateList>, @Json(name = "total_students") val totalStudents: Int, @Json(name = "passed_students") val passedStudents: Int ) // FetchEmploymentStatusResponse.kt @JsonClass(generateAdapter = true) data class FetchEmploymentStatusResponse( @Json(name = "classes") val classes: List<ClassEmploymentStatusResponse> )feature/home/src/main/java/team/retum/home/ui/HomeScreen.kt (2)
323-331
: ๋ฌธ์์ด ๋ฆฌ์์คํ๊ฐ ํ์ํฉ๋๋ค.ํ์ฌ ๋ฒํผ์ ํ ์คํธ๊ฐ ํ๋์ฝ๋ฉ๋์ด ์์ต๋๋ค. ๋ค๊ตญ์ด ์ง์ ๋ฐ ์ผ๊ด์ฑ์ ์ํด ๋ฌธ์์ด ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- text = "ํํฉ ๋ณด๋ฌ ๊ฐ๊ธฐ ->", + text = stringResource(id = R.string.view_employment_status),strings.xml ํ์ผ์ ๋ค์ ๋ฆฌ์์ค๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์:
<string name="view_employment_status">ํํฉ ๋ณด๋ฌ ๊ฐ๊ธฐ -></string>
323-331
: ๋ฒํผ ์คํ์ผ ๋ฐ ๋ ์ด์์ ๊ฐ์ ์ด ํ์ํฉ๋๋ค.ํ์ฌ ๋ฒํผ์ ์คํ์ผ๋ง์ด ๋ค์ ๋ณต์กํฉ๋๋ค.
wrapContentSize()
์fillMaxWidth(0.4f)
๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ ์ผ๊ด๋ UI๋ฅผ ๋ณด์ฅํ์ง ์์ ์ ์์ต๋๋ค. ๋ ๊ฐ๋จํ๊ณ ๋ช ํํ ๋ฐฉ์์ผ๋ก ์คํ์ผ์ ์ ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.- JobisSmallButton( - modifier = Modifier - .wrapContentSize() - .background(Color.Transparent) - .fillMaxWidth(0.4f), - text = "ํํฉ ๋ณด๋ฌ ๊ฐ๊ธฐ ->", - color = ButtonColor.Primary, - onClick = onEmploymentClick, - ) + JobisSmallButton( + modifier = Modifier + .background(Color.Transparent), + text = stringResource(id = R.string.view_employment_status), + color = ButtonColor.Primary, + onClick = onEmploymentClick, + )core/domain/src/main/java/team/retum/usecase/entity/application/EmploymentStatusEntity.kt (2)
23-24
: TODO ์ฃผ์ ์ ๊ฑฐ ํ์์ฝ๋๋ฒ ์ด์ค์ ๊ฐ๋ ์ฑ๊ณผ ํ๋กํ์ ๋๋ฆฌ์ฆ์ ์ํด ์ด TODO ์ฃผ์์ ์ ๊ฑฐํ๊ฑฐ๋ ์ค์ ์์ ์ผ๋ก ์ฒ๋ฆฌํด์ฃผ์ธ์.
- classes = this.classes.map { it.toEntity() } // TODO :: ์ด ๊ตฌ์กฐ ์ดํด ํ์ + classes = this.classes.map { it.toEntity() }
15-19
: ๋ฐ์ดํฐ ํด๋์ค ๋ค์ด๋ฐ ๊ฐ์ ์ ์
GetEmploymentRateList
๋ผ๋ ์ด๋ฆ์๋ "Get" ์ ๋์ฌ๊ฐ ํฌํจ๋์ด ์์ด ์ผ๋ฐ์ ์ธ ์ํฐํฐ ๋ค์ด๋ฐ ์ปจ๋ฒค์ ๊ณผ ์ผ์นํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ์ํฐํฐ ํด๋์ค๋ค๊ณผ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด "Get" ์ ๋์ฌ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข๊ฒ ์ต๋๋ค.- data class GetEmploymentRateList( + data class EmploymentRateEntity( val id: Int, val companyName: String, val logoUrl: String, )์ดํ์ ์๋ ์ฝ๋์ ๊ฐ์ ๊ด๋ จ ์ฐธ์กฐ๋ค๋ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค:
- 30์ค:
employmentRateList = this.employmentRateList.map { it.toEntity() },
- 35-39์ค: ํ์ฅ ํจ์๋ฅผ ์ ๋ฐ์ดํธ
feature/employment/src/main/java/team/retum/employment/viewmodel/EmploymentViewModel.kt (2)
49-52
: ํ๊ตญ์ด ์ฃผ์์ ์์ด๋ก ๋ฒ์ญ ๋๋ ํต์ผ ํ์์ฝ๋๋ฒ ์ด์ค์ ์ผ๊ด์ฑ์ ์ํด ํ๊ตญ์ด ์ฃผ์("์ต์ ์ ์ ์งํฉ")์ ์์ด๋ก ๋ฒ์ญํ๊ฑฐ๋, ํ๋ก์ ํธ ์ ์ฒด์์ ์ฌ์ฉํ๋ ์ฃผ์ ์ธ์ด๋ฅผ ํต์ผํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
-sealed interface EmploymentSideEffect { // ์ต์ ์ ์ ์งํฉ +sealed interface EmploymentSideEffect { // Collection of exceptions/side effects
18-29
: ์์์ ํ์ ๋ก์ง ๊ฐ์ ํ์ํ์ฌ ์์์ ํ์๋ฅผ ์ํด
DecimalFormat("##.#").format(rate)
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด๋ ํ๊ธ ๋ก์ผ์ผ์์๋ ์์์ ์ด ์ผํ(,)๋ก ํ์๋ ์ ์์ต๋๋ค. ๋ก์ผ์ผ์ ๊ด๊ณ์์ด ์ผ๊ด๋ ํ์๋ฅผ ์ํด ๋ช ์์ ์ผ๋ก ๋ก์ผ์ผ์ ์ง์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.- rate = DecimalFormat("##.#").format(rate), + rate = DecimalFormat("##.#").apply { + DecimalFormatSymbols.getInstance(Locale.US).also { symbols -> + decimalFormatSymbols = symbols + } + }.format(rate),์ด๋ฅผ ์ํด ์ํฌํธ ์ถ๊ฐ๊ฐ ํ์ํฉ๋๋ค:
import java.text.DecimalFormatSymbols import java.util.Localefeature/employment/src/main/java/team/retum/employment/ui/EmploymentScreen.kt (5)
60-60
: TODO ์ฃผ์ ์ ๊ฑฐ ํ์์ฝ๋๋ฒ ์ด์ค์ ๊ฐ๋ ์ฑ๊ณผ ํ๋กํ์ ๋๋ฆฌ์ฆ์ ์ํด TODO ์ฃผ์์ ์ ๊ฑฐํ๊ฑฐ๋ ์ค์ ์์ ์ผ๋ก ์ฒ๋ฆฌํด์ฃผ์ธ์.
-) { // TODO :: ๋ค๋น๊ฒ์ด์ ์ถ๊ฐ ๋ฐ ๋ถ์ +) {
61-71
: ์ ๋๋ฉ์ด์ ๋ ผ๋ฆฌ ๊ฐ์ ํ์ํ์ฌ
animatedValue
๋animateTo
๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ ๊ฐ์ ๊ฐ(rate
)์ผ๋ก ์ ๋๋ฉ์ด์ ๋๊ณ ์์ต๋๋ค. ๋ํ, UI์ ์ด ์ ๋๋ฉ์ด์ ๊ฐ์ด ์ฌ์ฉ๋์ง ์๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ๋ถํ์ํ ์ ๋๋ฉ์ด์ ๊ณ์ฐ์ ์ด๋ํ ์ ์์ต๋๋ค.- val animatedValue = remember { Animatable(rate) } - LaunchedEffect(Unit) { - animatedValue.animateTo( - targetValue = rate, - animationSpec = tween(durationMillis = 1000, easing = LinearEasing) - ) - with(employmentViewModel) { - fetchEmploymentCount() - } - } + LaunchedEffect(Unit) { + employmentViewModel.fetchEmploymentCount() + }๋ํ
CircleProgress
์ปดํฌ๋ํธ๋ ์์ฒด ์ ๋๋ฉ์ด์ ๋ก์ง์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์ ์ ๋๋ฉ์ด์ ํ ํ์๊ฐ ์์ต๋๋ค.
89-89
: TODO ์ฃผ์ ์ ๊ฑฐ ํ์์ฝ๋๋ฒ ์ด์ค์ ๊ฐ๋ ์ฑ๊ณผ ํ๋กํ์ ๋๋ฆฌ์ฆ์ ์ํด TODO ์ฃผ์์ ์ ๊ฑฐํ๊ฑฐ๋ ์ค์ ์์ ์ผ๋ก ์ฒ๋ฆฌํด์ฃผ์ธ์.
-) { // TODO :: UI ํผ๋ธ๋ฆฌ์ฑ +) {
252-308
: CircleProgress ์ปดํฌ๋ํธ ๊ฐ์ ์ ์
CircleProgress
์ปดํฌ๋ํธ์ ๋ช ๊ฐ์ง ๊ฐ์ ์ฌํญ์ด ์์ต๋๋ค:
StrokeCap.Butt
์StrokeCap.Round
๋ถ์ผ์น: ๋ ์ํฌ ์ฌ์ด์ ์คํ์ผ ๋ถ์ผ์น๊ฐ ์์ด ์๊ฐ์ ์ผ๋ก ์ผ๊ด์ฑ์ด ์์ ์ ์์ต๋๋ค.- ์ค๋ณต ์ฝ๋: ๋ ์ํฌ๊ฐ ๋์ผํ ํฌ๊ธฐ์ ์์น๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์ด๋ฅผ ๊ณต์ ๋ณ์๋ก ์ถ์ถํ ์ ์์ต๋๋ค.
scaleX = -1f
๋ ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฉฐ, ์ด๋ณด๋ค๋ startAngle๊ณผ sweepAngle์ ์กฐ์ ํ๋ ๊ฒ์ด ๋ ๋ช ํํฉ๋๋ค.Canvas( modifier = Modifier .size(radius) - .scale(scaleX = -1f, scaleY = 1f) ) { val canvasSize = size.minDimension val arcRadius = canvasSize / 2 - strokeWidth.toPx() / 2 + val arcSize = Size(arcRadius * 2, arcRadius * 2) + val arcOffset = Offset( + (size.width - arcRadius * 2) / 2, + (size.height - arcRadius * 2) / 2 + ) drawArc( color = primaryColor, - startAngle = 270f, - sweepAngle = 360f, + startAngle = 90f, + sweepAngle = 360f, useCenter = false, style = Stroke(width = strokeWidth.toPx(), cap = StrokeCap.Round), - size = Size(arcRadius * 2, arcRadius * 2), - topLeft = Offset( - (size.width - arcRadius * 2) / 2, - (size.height - arcRadius * 2) / 2 - ) + size = arcSize, + topLeft = arcOffset ) drawArc( color = secondaryColor, - startAngle = 270f, - sweepAngle = animatedValue.value * 3.6f, + startAngle = 90f, + sweepAngle = animatedValue.value * 3.6f, useCenter = false, - style = Stroke(width = strokeWidth.toPx(), cap = StrokeCap.Butt), - size = Size(arcRadius * 2, arcRadius * 2), - topLeft = Offset( - (size.width - arcRadius * 2) / 2, - (size.height - arcRadius * 2) / 2 - ) + style = Stroke(width = strokeWidth.toPx(), cap = StrokeCap.Round), + size = arcSize, + topLeft = arcOffset ) }
310-363
: ClassEmploymentButton UI ๊ตฌ์กฐ ๊ฐ์ ์ ์
ClassEmploymentButton
์ปดํฌ๋ํธ์๋ ์ค์ฒฉ๋ Surface์ Column์ด ๋ง์ด ์์ด ๋ถํ์ํ ๋ณต์ก์ฑ์ ์ด๋ํฉ๋๋ค. ๋ํ, ์ฌ๋ฌ ์ค์ฒฉ๋ ํจ๋ฉ ๊ตฌ์ฑ์ด ์์ผ๋ฉฐ ์ผ๋ถ๋ ์ค๋ณต๋ฉ๋๋ค.
- ์ค์ฒฉ๋ Surface ๋ฐ Column ๊ตฌ์กฐ๋ฅผ ๋จ์ํํ๊ณ
- ํจ๋ฉ ๊ฐ์ ํตํฉ/์ ๋ฆฌํ๋ฉฐ
contentAlignment
๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ด์์์ ๋ ๋ช ํํ๊ฒ ํํํ๋ ๋ฐฉํฅ์ผ๋ก ๋ฆฌํฉํ ๋งํ ์ ์์ต๋๋ค.@Composable fun ClassEmploymentButton( onClassClick: () -> Unit, @DrawableRes image: Int, description: String = "", text: String, ) { Surface( - modifier = Modifier.padding(), + modifier = Modifier, onClick = onClassClick, color = JobisTheme.colors.inverseSurface, shape = RoundedCornerShape(8.dp), ) { Column( - modifier = Modifier.background(color = JobisTheme.colors.inverseSurface) + modifier = Modifier + .padding(horizontal = 34.dp, vertical = 20.dp), + horizontalAlignment = Alignment.CenterHorizontally ) { - Column( - modifier = Modifier.padding(top = 20.dp, start = 34.dp, end = 34.dp), - verticalArrangement = Arrangement.SpaceBetween, - horizontalAlignment = Alignment.CenterHorizontally - ) { - Box( - modifier = Modifier - .size(80.dp) - .clip(CircleShape) - .background(JobisTheme.colors.background), - contentAlignment = Alignment.Center - ) { - Icon( - modifier = Modifier - .size(48.dp), - painter = painterResource(image), - contentDescription = description, - tint = Color.Unspecified - ) - } + Box( + modifier = Modifier + .size(80.dp) + .clip(CircleShape) + .background(JobisTheme.colors.background), + contentAlignment = Alignment.Center + ) { + Icon( + modifier = Modifier + .size(48.dp), + painter = painterResource(image), + contentDescription = description, + tint = Color.Unspecified + ) } + Spacer(modifier = Modifier.height(16.dp)) Surface( color = JobisTheme.colors.surfaceTint, shape = RoundedCornerShape(12.dp), modifier = Modifier - .padding(top = 16.dp, start = 12.dp, bottom = 12.dp), + .padding(start = 12.dp), ) { JobisText( text = text, style = JobisTypography.SubBody, color = JobisTheme.colors.background, modifier = Modifier .padding(horizontal = 16.dp, vertical = 8.dp) ) } } } }
๐ Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
โ Files ignored due to path filters (4)
core/design-system/src/main/res/drawable/ic_computer.png
is excluded by!**/*.png
core/design-system/src/main/res/drawable/ic_robot.png
is excluded by!**/*.png
core/design-system/src/main/res/drawable/ic_spanner.png
is excluded by!**/*.png
gradle/wrapper/gradle-wrapper.jar
is excluded by!**/*.jar
๐ Files selected for processing (32)
app/build.gradle.kts
(2 hunks)app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt
(2 hunks)app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt
(3 hunks)app/src/main/java/team/retum/jobisandroidv2/root/RootNavigation.kt
(2 hunks)app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt
(4 hunks)core/common/src/main/java/team/retum/common/utils/ResourceKeys.kt
(2 hunks)core/data/src/main/java/team/retum/data/repository/application/ApplicationRepository.kt
(2 hunks)core/data/src/main/java/team/retum/data/repository/application/ApplicationRepositoryImpl.kt
(2 hunks)core/domain/src/main/java/team/retum/usecase/entity/application/EmploymentStatusEntity.kt
(1 hunks)core/domain/src/main/java/team/retum/usecase/usecase/application/FetchEmploymentStatusUseCase.kt
(1 hunks)core/network/src/main/java/team/retum/network/api/ApplicationApi.kt
(2 hunks)core/network/src/main/java/team/retum/network/datasource/application/RemoteApplicationDataSource.kt
(2 hunks)core/network/src/main/java/team/retum/network/datasource/application/RemoteApplicationDataSourceImpl.kt
(2 hunks)core/network/src/main/java/team/retum/network/di/RequestUrls.kt
(1 hunks)core/network/src/main/java/team/retum/network/model/response/application/FetchEmploymentStatusResponse.kt
(1 hunks)feature/employment/.gitignore
(1 hunks)feature/employment/build.gradle.kts
(1 hunks)feature/employment/src/main/AndroidManifest.xml
(1 hunks)feature/employment/src/main/java/team/retum/employment/model/CompanyItem.kt
(1 hunks)feature/employment/src/main/java/team/retum/employment/navigation/EmploymentNavigation.kt
(1 hunks)feature/employment/src/main/java/team/retum/employment/ui/EmploymentDetailScreen.kt
(1 hunks)feature/employment/src/main/java/team/retum/employment/ui/EmploymentScreen.kt
(1 hunks)feature/employment/src/main/java/team/retum/employment/viewmodel/EmploymentDetailViewModel.kt
(1 hunks)feature/employment/src/main/java/team/retum/employment/viewmodel/EmploymentViewModel.kt
(1 hunks)feature/employment/src/main/res/values/strings.xml
(1 hunks)feature/home/src/main/java/team/retum/home/navigation/HomeNavigation.kt
(2 hunks)feature/home/src/main/java/team/retum/home/ui/HomeScreen.kt
(12 hunks)gradle/libs.versions.toml
(3 hunks)gradle/wrapper/gradle-wrapper.properties
(1 hunks)gradlew
(4 hunks)gradlew.bat
(4 hunks)settings.gradle.kts
(1 hunks)
โ Files skipped from review due to trivial changes (4)
- feature/employment/src/main/java/team/retum/employment/model/CompanyItem.kt
- feature/employment/.gitignore
- feature/employment/src/main/AndroidManifest.xml
- feature/employment/src/main/res/values/strings.xml
โฐ Context from checks skipped due to timeout of 90000ms (2)
- GitHub Check: lint_and_build (build)
- GitHub Check: lint_and_build (lint)
๐ Additional comments (56)
settings.gradle.kts (1)
46-46
: ๋ชจ๋ ์ถ๊ฐ ํ์ธ๋จ์ทจ์ ๋ฅ ์์ธ ์กฐํ ๊ธฐ๋ฅ์ ์ํ
:feature:employment
๋ชจ๋์ด ํ๋ก์ ํธ์ ์ถ๊ฐ๋์์ต๋๋ค. ๋ชจ๋ ์ถ๊ฐ๊ฐ ์ ๋์์ต๋๋ค.core/network/src/main/java/team/retum/network/di/RequestUrls.kt (1)
71-71
: API ์๋ํฌ์ธํธ ์ถ๊ฐ ํ์ธ๋จ์ทจ์ ๋ฅ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ API ์๋ํฌ์ธํธ
employment
๊ฐ ์ ์ ํ๊ฒ ์ถ๊ฐ๋์์ต๋๋ค. ๊ธฐ์กด ํจํด์ ๋ง๊ฒ$path/employment
ํ์์ผ๋ก ์ ์๋์ด ์์ด ์ผ๊ด์ฑ์ด ์ ์ง๋์์ต๋๋ค.app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (2)
13-13
: ์๋ก์ด ๋ค๋น๊ฒ์ด์ ์ํฌํธ ์ถ๊ฐ๋จ์ทจ์ ๋ฅ ํ๋ฉด์ผ๋ก ์ด๋ํ๊ธฐ ์ํ ๋ค๋น๊ฒ์ด์ ์ํฌํธ๊ฐ ์ ์ ํ๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.
138-140
: ์ทจ์ ๋ฅ ํ๋ฉด ๋ค๋น๊ฒ์ด์ ํจ์ ๊ตฌํ ํ์ธ์ทจ์ ๋ฅ ์์ธ ํ๋ฉด์ผ๋ก ์ด๋ํ๋
navigateToEmployment()
ํจ์๊ฐ ๊ธฐ์กด ๋ค๋น๊ฒ์ด์ ํจํด์ ๋ง๊ฒ ์ ๊ตฌํ๋์ด ์์ต๋๋ค.navController
์ ํ์ฅ ํจ์๋ฅผ ์ ์ ํ ํธ์ถํ๊ณ ์์ต๋๋ค.feature/employment/build.gradle.kts (4)
1-5
: Gradle ํ๋ฌ๊ทธ์ธ ์ค์ ํ์ธAndroid ๋ผ์ด๋ธ๋ฌ๋ฆฌ, Kotlin Android, KSP ํ๋ฌ๊ทธ์ธ์ด ์ ์ ํ๊ฒ ์ ์ฉ๋์์ต๋๋ค. ํ์ํ ํ๋ฌ๊ทธ์ธ๋ค์ด ๋ชจ๋ ํฌํจ๋์ด ์์ต๋๋ค.
7-8
: ๊ณตํต Gradle ํ๋ฌ๊ทธ์ธ ์ ์ฉ ํ์ธ
CommonGradlePlugin
๊ณผComposeGradlePlugin
์ด ์ ์ฉ๋์ด ์์ด ํ๋ก์ ํธ์ ์ผ๊ด๋ ๋น๋ ์ค์ ์ด ์ ์ง๋๊ณ ์์ต๋๋ค.
10-17
: Android ์ค์ ํ์ธ๋ค์์คํ์ด์ค๊ฐ "team.retum.employment"๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์ด ์์ต๋๋ค. Java ํธํ์ฑ๋ 21 ๋ฒ์ ์ผ๋ก ์ ์ ํ ์ค์ ๋์ด ์์ต๋๋ค.
19-22
: ์ข ์์ฑ ํ์ธUI ํด๋ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ถ๊ฐ๋์ด ์์ต๋๋ค. ํ์ง๋ง ๋ค๋ฅธ ํ์ ์ข ์์ฑ์ด ์ผ๋ถ ๋๋ฝ๋์ด ์์ ์ ์์ต๋๋ค.
์ทจ์ ๋ฅ ํ๋ฉด ๊ตฌํ์ ํ์ํ core ๋ชจ๋๋ค(์: design-system, domain ๋ฑ)์ ๋ํ ์์กด์ฑ์ด ์ถ๊ฐ๋์ด ์๋์ง ํ์ธํด ๋ณด์ธ์. ์ผ๋ฐ์ ์ผ๋ก feature ๋ชจ๋์ ๊ธฐ๋ณธ์ ์ธ core ๋ชจ๋๋ค์ ์์กด์ฑ์ผ๋ก ๊ฐ์ ธ์ผ ํฉ๋๋ค.
app/build.gradle.kts (1)
117-117
: ๊ณ ์ฉ ๊ธฐ๋ฅ ๋ชจ๋ ์ถ๊ฐ ํ์ธ๋จ.๊ณ ์ฉ๋ฅ ์์ธ ์กฐํ ํ์ด์ง ์ ์์ ์ํ
:feature:employment
๋ชจ๋ ์์กด์ฑ์ด ์ ์ ํ๊ฒ ์ถ๊ฐ๋์์ต๋๋ค. ํ๋ก์ ํธ ๊ตฌ์กฐ์ ์ ํตํฉ๋์์ต๋๋ค.core/network/src/main/java/team/retum/network/api/ApplicationApi.kt (1)
12-12
: ImportFetchEmploymentStatusResponse ์ถ๊ฐ ํ์ธ๋จ.๊ณ ์ฉ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์๋ต ๋ชจ๋ธ import๊ฐ ์ ์ ํ๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.
core/network/src/main/java/team/retum/network/datasource/application/RemoteApplicationDataSource.kt (1)
6-6
: FetchEmploymentStatusResponse ์ํฌํธ ์ถ๊ฐ ํ์ธ๋จ.๊ณ ์ฉ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์๋ต ๋ชจ๋ธ import๊ฐ ์ ์ ํ๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.
app/src/main/java/team/retum/jobisandroidv2/root/RootNavigation.kt (2)
15-15
: ๊ณ ์ฉ ํ๋ฉด ํ์ ํ๋ผ๋ฏธํฐ ์ถ๊ฐ ํ์ธ๋จ.์ทจ์ ๋ฅ ์์ธ ์กฐํ ํ์ด์ง๋ก ์ด๋ํ๊ธฐ ์ํ
onEmploymentClick
ํ๋ผ๋ฏธํฐ๊ฐ ์ ์ ํ๊ฒ ์ถ๊ฐ๋์์ต๋๋ค. ๋ค๋ฅธ ๋ค๋น๊ฒ์ด์ ์ฝ๋ฐฑ๊ณผ ์ผ๊ด์ฑ ์๊ฒ ๊ตฌํ๋์์ต๋๋ค.
39-39
: Root ์ปดํฌ์ ๋ธ์ onEmploymentClick ํ๋ผ๋ฏธํฐ ์ ๋ฌ ํ์ธ๋จ.
onEmploymentClick
์ฝ๋ฐฑ์ด Root ์ปดํฌ์ ๋ธ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋์์ต๋๋ค. ๋ค๋น๊ฒ์ด์ ํ๋ฆ์ด ์ ์ ํ๊ฒ ๊ตฌํ๋์์ต๋๋ค.core/data/src/main/java/team/retum/data/repository/application/ApplicationRepository.kt (2)
6-6
: ํ์ํ import ๋ฌธ์ด ์ ์ ํ ์ถ๊ฐ๋์์ต๋๋ค.๋คํธ์ํฌ ๋ชจ๋ธ์ ์๋ต ํด๋์ค๊ฐ ์ ์ ํ ์ํฌํธ๋์์ต๋๋ค.
26-26
: ์ ๊ท ๊ณ ์ฉ ์ํ ์กฐํ ๋ฉ์๋๊ฐ ์ ์ ์๋์์ต๋๋ค.
fetchEmploymentStatus
๋ฉ์๋๊ฐ ์ธํฐํ์ด์ค์ ์ ์ ํ ์ถ๊ฐ๋์์ผ๋ฉฐ, ๋ค๋ฅธ fetch ๋ฉ์๋๋ค๊ณผ ๋์ผํ ํจํด์ ์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค. ๋น๋๊ธฐ ์์ ์ ์ํ suspend ํค์๋๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋์์ต๋๋ค.gradle/wrapper/gradle-wrapper.properties (1)
3-5
:โ Verification inconclusive
Gradle ๋ฒ์ ์ ๋ฐ์ดํธ ๋ฐ ๋คํธ์ํฌ ์ค์ ์ถ๊ฐ์ ๋ํ ๊ฒํ ํ์
Gradle ๋ฒ์ ์ 8.2์์ 8.9๋ก ์๋นํ ํฐ ํญ์ผ๋ก ์ ๋ฐ์ดํธํ์์ต๋๋ค. ์ด๋ ํ๋ก์ ํธ์ ๋น๋ ํ๋ก์ธ์ค์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๋ํ ๋คํธ์ํฌ ํ์์์๊ณผ URL ๊ฒ์ฆ ์ค์ ์ด ์ถ๊ฐ๋์์ต๋๋ค.
์ด ๋ณ๊ฒฝ ์ฌํญ๋ค์ด ํ๋ก์ ํธ ์๊ตฌ์ฌํญ์ ๋ง๋์ง, ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ํ๊ฒฝ๊ณผ ํธํ๋๋์ง ํ์ธํด์ฃผ์ธ์.
๐ Script executed:
#!/bin/bash # Gradle ๋ฒ์ ๋ณ๊ฒฝ์ด ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋์ง ํ์ธ echo "Checking for compatibility issues with Gradle 8.9" # build.gradle ํ์ผ์์ AGP ๋ฒ์ ํ์ธ AGP_VERSION=$(grep -r "com.android.application" --include="*.gradle*" . | grep -o "version ['\"].*['\"]" | head -1 | cut -d"'" -f2 | cut -d'"' -f2) if [ -n "$AGP_VERSION" ]; then echo "Android Gradle Plugin version found: $AGP_VERSION" # AGP ๋ฒ์ ๊ณผ Gradle 8.9 ํธํ์ฑ ์ฒดํฌ (๊ฐ๋จํ ์์) # ์ค์ ๋ก๋ ๋ ๋ณต์กํ ๋ฒ์ ํธํ์ฑ ๋ก์ง์ด ํ์ํ ์ ์์ VERSION_MAJOR=$(echo $AGP_VERSION | cut -d. -f1) if [ "$VERSION_MAJOR" -lt "8" ]; then echo "WARNING: AGP version $AGP_VERSION might not be fully compatible with Gradle 8.9" else echo "AGP version appears to be compatible with Gradle 8.9" fi else echo "Could not determine Android Gradle Plugin version" fi # ํ๋ก์ ํธ ๋ด์ ๋ค๋ฅธ ํ๋ฌ๊ทธ์ธ ํ์ธ echo "Checking other plugins in the project" grep -r "apply plugin" --include="*.gradle*" .Length of output: 527
[AGP ๋ฒ์ ํ์ธ ๋ฐ Gradle 8.9 ์ ๋ฐ์ดํธ ๊ฒ์ฆ ์์ฒญ]
- Gradle ๋ฒ์ ์ 8.2์์ 8.9๋ก ์ ๋ฐ์ดํธํ๊ณ , ๋คํธ์ํฌ ํ์์์(
networkTimeout=10000
)๊ณผ URL ๊ฒ์ฆ(validateDistributionUrl=true
) ์ค์ ์ด ์ถ๊ฐ๋์์ต๋๋ค.- ์๋ํ๋ ์คํฌ๋ฆฝํธ ์คํ ๊ฒฐ๊ณผ, Android Gradle Plugin(AGP) ๋ฒ์ ์ด ๊ฐ์ง๋์ง ์์ ํด๋น ํ๋ฌ๊ทธ์ธ์ด ์ค์ ๋ก ์ฌ์ฉ ์ค์ธ์ง ํ์ธ๋์ง ์์์ต๋๋ค.
- ์ด ๋ณ๊ฒฝ ์ฌํญ์ด ํ๋ก์ ํธ์ ๋น๋ ํ๋ก์ธ์ค๋ ๋ค๋ฅธ ๊ฐ๋ฐ์ ํ๊ฒฝ์ ๋ฏธ์น ์ํฅ์ ๋ฐฉ์งํ๊ธฐ ์ํด, AGP ๋ฐ ๊ธฐํ ๊ด๋ จ ํ๋ฌ๊ทธ์ธ๋ค์ ํธํ์ฑ์ ์๋์ผ๋ก ๊ฒํ ํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
core/domain/src/main/java/team/retum/usecase/usecase/application/FetchEmploymentStatusUseCase.kt (1)
1-13
: UseCase ๊ตฌํ์ด ์ ๋์์ต๋๋ค.FetchEmploymentStatusUseCase์ ๊ตฌํ์ด ํ๋ก์ ํธ์ ๋ค๋ฅธ UseCase ํจํด์ ์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค:
- ApplicationRepository ์์กด์ฑ ์ฃผ์ ์ด ์ ์ ํ๊ฒ ์ด๋ฃจ์ด์ก์ต๋๋ค.
- suspend operator ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถ ์ ๊ฐ๊ฒฐํ ๋ฌธ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- runCatching์ ํตํด ์์ธ ์ฒ๋ฆฌ๊ฐ ์ ์ ํ ๊ตฌํ๋์์ต๋๋ค.
- ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ํฐํฐ๋ก ๋ณํํ๋ extension ํจ์ ์ฌ์ฉ์ด ์ผ๊ด์ฑ ์๊ฒ ์ ์ฉ๋์์ต๋๋ค.
core/network/src/main/java/team/retum/network/datasource/application/RemoteApplicationDataSourceImpl.kt (2)
7-7
: ํ์ํ import ๋ฌธ์ด ์ ์ ํ ์ถ๊ฐ๋์์ต๋๋ค.์๋ก์ด ๊ธฐ๋ฅ์ ํ์ํ ๋คํธ์ํฌ ์๋ต ๋ชจ๋ธ ํด๋์ค๊ฐ ์ ์ํฌํธ๋์์ต๋๋ค.
57-61
: ๊ณ ์ฉ ์ํ ์กฐํ ๋ฉ์๋๊ฐ ์ผ๊ด๋ ํจํด์ผ๋ก ๊ตฌํ๋์์ต๋๋ค.
fetchEmploymentStatus
๋ฉ์๋๊ฐ ๋ค๋ฅธ ๋ฉ์๋๋ค๊ณผ ๋์ผํ ํจํด์ ๋ฐ๋ผ ์ ๊ตฌํ๋์์ต๋๋ค:
- RequestHandler๋ฅผ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ ์ ํ API ์๋ํฌ์ธํธ(
applicationApi.fetchEmploymentStatus()
)๋ฅผ ํธ์ถํฉ๋๋ค.- ์ธํฐํ์ด์ค์ ์ ์๋ ๋ฉ์๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ค๋ฒ๋ผ์ด๋ํ์์ต๋๋ค.
gradlew.bat (4)
17-17
: Windows ๋ฐฐ์น ์คํฌ๋ฆฝํธ ์ ๋ฐ์ดํธ์ ๋ํ ๊ฒํ์ด ๋ถ๋ถ์ ๊ธฐ์กด ์ฝ๋์ ๋์ผํฉ๋๋ค. %DEBUG% ๋ณ์๊ฐ ๋น์ด์๋์ง ํ์ธํ๊ณ ๋น์ด์์ผ๋ฉด echo๋ฅผ ๊บผ๋ฒ๋ฆฝ๋๋ค.
44-44
: Windows ๋ฐฐ์น ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ ๊ฐ์์ซ์ ๋น๊ต์
==
์ฐ์ฐ์ ๋์equ
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ Windows ๋ฐฐ์น ์คํฌ๋ฆฝํธ์์ ๋ ์ ํํ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ์ด ๋ณ๊ฒฝ์ ์คํฌ๋ฆฝํธ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํฉ๋๋ค.
79-79
: Windows ๋ฐฐ์น ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ ๊ฐ์์ฌ๊ธฐ์๋ ์ซ์ ๋น๊ต๋ฅผ ์ํด
==
์ฐ์ฐ์ ๋์equ
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. ์ด๋ ๋ฐฐ์น ์คํฌ๋ฆฝํธ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ถ๋ถ์ ๊ฐ์ ํฉ๋๋ค.
84-87
: ํฅ์๋ ์ค๋ฅ ์ฒ๋ฆฌ ๋ก์ง์ด ๋ถ๋ถ์์๋ ์ค๋ฅ ์ฒ๋ฆฌ ๋ก์ง์ด ํฅ์๋์์ต๋๋ค:
- ERRORLEVEL ๊ฐ์ EXIT_CODE ๋ณ์์ ์ ์ฅ
- EXIT_CODE๊ฐ 0์ด๋ฉด 1๋ก ์ค์ (์ค๋ฅ ํ๋๊ทธ)
- GRADLE_EXIT_CONSOLE ๋ณ์ ๊ฐ์ ๋ฐ๋ผ ์ ์ ํ ์ข ๋ฃ ์ฝ๋๋ก ์คํฌ๋ฆฝํธ ์ข ๋ฃ
์ด๋ฌํ ๋ณ๊ฒฝ์ ์คํฌ๋ฆฝํธ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ๋ ๋ช ํํ๊ณ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ญ๋๋ค.
core/data/src/main/java/team/retum/data/repository/application/ApplicationRepositoryImpl.kt (2)
7-7
: ๊ณ ์ฉ ์ํ ์๋ต ๋ชจ๋ธ ์ถ๊ฐ์๋ก์ด ๊ธฐ๋ฅ์ ํ์ํ
FetchEmploymentStatusResponse
๋ชจ๋ธ์ ๊ฐ์ ธ์ค๋ import ๋ฌธ์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ ์ ๊ท ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ํ์ํ ์ ์ ํ ๋ณ๊ฒฝ์ ๋๋ค.
46-48
: ๊ณ ์ฉ ์ํ ์กฐํ ๊ธฐ๋ฅ ๊ตฌํ์๋ก์ด ๊ณ ์ฉ ์ํ ์กฐํ ๊ธฐ๋ฅ์ธ
fetchEmploymentStatus()
๋ฉ์๋๊ฐ ๊ตฌํ๋์์ต๋๋ค. ์ด ๋ฉ์๋๋ ๋ฐ์ดํฐ ์์ค๋ก๋ถํฐ ๊ณ ์ฉ ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๋จ์ ์์ ํจํด์ ๋ฐ๋ฅด๊ณ ์์ด, ๋ฆฌํฌ์งํ ๋ฆฌ ๊ณ์ธต์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ์์ต๋๋ค.์ฝ๋ ๊ตฌํ์ด ๊น๋ํ๋ฉฐ ๊ธฐ์กด ๋ฉ์๋ ๊ตฌํ ํจํด์ ์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
core/common/src/main/java/team/retum/common/utils/ResourceKeys.kt (1)
26-28
: ๊ณ ์ฉ ๊ด๋ จ ๋ฆฌ์์ค ํค ์ถ๊ฐ๊ณ ์ฉ ์ํ ๊ธฐ๋ฅ์ ์ํ ์๋ก์ด ์์๋ค์ด ์ถ๊ฐ๋์์ต๋๋ค:
RATE
: ๊ณ ์ฉ๋ฅ ์ ๋ณด๋ฅผ ์ํ ํคTOTAL_STUDENT_COUNT
: ์ ์ฒด ํ์ ์๋ฅผ ์ํ ํคPASS_COUNT
: ํฉ๊ฒฉ ํ์ ์๋ฅผ ์ํ ํค์ด ์์๋ค์ ํ๋ฉด ๊ฐ ๋ฐ์ดํฐ ์ ๋ฌ์ด๋ SharedPreferences ๋ฑ์์ ์ฌ์ฉ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ๋ช ํํ ์์๋ช ์ ์ฌ์ฉํ ์ข์ ๊ตฌํ์ ๋๋ค.
app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt (3)
9-9
: ๊ณ ์ฉ ๋ชจ๋ ๋ค๋น๊ฒ์ด์ import ์ถ๊ฐ์๋ก ์ถ๊ฐ๋ ๊ณ ์ฉ ๊ด๋ จ ๊ธฐ๋ฅ์ ๋ค๋น๊ฒ์ด์ ์ ์ํ import ๋ฌธ์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ ์ ๊ท ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ํ์ํ ์ ์ ํ ๋ณ๊ฒฝ์ ๋๋ค.
38-38
: Root ๋ค๋น๊ฒ์ด์ ์ ๊ณ ์ฉ ๊ธฐ๋ฅ ์ด๋ ์ฝ๋ฐฑ ์ถ๊ฐRoot ๋ค๋น๊ฒ์ด์ ์ ๊ณ ์ฉ ํ๋ฉด์ผ๋ก ์ด๋ํ๊ธฐ ์ํ ์ฝ๋ฐฑ ํจ์
onEmploymentClick
์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ด ์ฝ๋ฐฑ์navigator::navigateToEmployment
์ ์ฐ๊ฒฐ๋์ด ์์ด, ์ฌ์ฉ์๊ฐ ๊ณ ์ฉ ํ๋ฉด์ผ๋ก ์ด๋ํ ์ ์๋๋ก ํฉ๋๋ค.
108-111
: ๊ณ ์ฉ ๊ธฐ๋ฅ ๋ค๋น๊ฒ์ด์ ์ถ๊ฐ๊ณ ์ฉ ํ๋ฉด์ ์ํ ์๋ก์ด ๋ค๋น๊ฒ์ด์ ๊ฒฝ๋ก๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ด ๊ฒฝ๋ก๋ ๋ค์ ๋ ๊ฐ์ง ์ฝ๋ฐฑ์ ํฌํจํฉ๋๋ค:
onBackPressed
: ๋ค๋ก ๊ฐ๊ธฐ ๋ฒํผ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ฝ๋ฐฑonClassClick
: ํน์ ํ๊ธ์ ํด๋ฆญํ์ ๋ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ฝ๋ฐฑ์๋ก์ด ๊ธฐ๋ฅ์ ์ํ ๋ค๋น๊ฒ์ด์ ๊ตฌ์ฑ์ด ๊ธฐ์กด ํจํด์ ์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
feature/home/src/main/java/team/retum/home/navigation/HomeNavigation.kt (2)
15-15
: ์ฝ๋ ๊ตฌํ์ด ์ ๋์์ต๋๋ค.์๋ก์ด
onEmploymentClick
ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ถ๊ฐํ์์ต๋๋ค. ๊ธฐ์กด ์ฝ๋ ํจํด์ ๋ฐ๋ฅด๊ณ ์์ผ๋ฉฐ, ๋ค๋ฅธ ํด๋ฆญ ํธ๋ค๋ฌ์ ์ผ๊ด์ฑ ์๊ฒ ๊ตฌํ๋์์ต๋๋ค.
27-27
: Home ์ปดํฌ์ ๋ธ์ onEmploymentClick ์ ๋ฌ ๊ตฌํ์ด ์ ์ ํฉ๋๋ค.Home ์ปดํฌ์ ๋ธ์ ์๋ก ์ถ๊ฐ๋
onEmploymentClick
ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌํ๊ณ ์์ต๋๋ค.feature/home/src/main/java/team/retum/home/ui/HomeScreen.kt (9)
23-23
: ์๋ก์ด ๋ ์ด์์ ์์ฑ ์ถ๊ฐ๊ฐ ์ ์ ํ๊ฒ ์ด๋ฃจ์ด์ก์ต๋๋ค.
wrapContentSize
๋ฅผ importํ์ฌ ๋ฒํผ์ ํฌ๊ธฐ ์กฐ์ ์ ์ํด ์ฌ์ฉํ ๊ฒ์ด ์ข๋ค์.
61-63
: ๋ฒํผ ์ปดํฌ๋ํธ ๊ด๋ จ import๊ฐ ์ ํํ ์ถ๊ฐ๋์์ต๋๋ค.ํ์ํ
ButtonColor
๋ฐJobisSmallButton
import๊ฐ ์ ์ ํ๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.
83-83
: API ์ผ๊ด์ฑ์ ์ํ ๋งค๊ฐ๋ณ์ ์ถ๊ฐ๊ฐ ์ ๋์์ต๋๋ค.
Home
ํจ์์onEmploymentClick
์ฝ๋ฐฑ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ์ฌ UI์ ๋ด๋น๊ฒ์ด์ ๋ก์ง์ด ์ ์ฐ๊ฒฐ๋์์ต๋๋ค.
130-131
: HomeScreen ํจ์์ ์ฝ๋ฐฑ ํ๋ผ๋ฏธํฐ ์ ๋ฌ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์์ต๋๋ค.
HomeScreen
์onEmploymentClick
์ฝ๋ฐฑ์ ์ ๋ฌํ๋ ๋ถ๋ถ์ด ์ ๊ตฌํ๋์์ต๋๋ค.
154-154
: ์ฝ๋ฐฑ ํจ์ ๋งค๊ฐ๋ณ์๊ฐ ์ ํํ ์ถ๊ฐ๋์์ต๋๋ค.
HomeScreen
ํจ์ ์๊ทธ๋์ฒ์onEmploymentClick
์ฝ๋ฐฑ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.
186-187
: Banner ์ปดํฌ๋ํธ์ ์ฝ๋ฐฑ ํจ์๊ฐ ์ ์ ํ ์ ๋ฌ๋์์ต๋๋ค.
Banner
ํจ์ ํธ์ถ ์onEmploymentClick
์ฝ๋ฐฑ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋์์ต๋๋ค.
228-228
: Banner ํจ์ ์๊ทธ๋์ฒ์ ์ฝ๋ฐฑ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.
Banner
ํจ์์onEmploymentClick
๋งค๊ฐ๋ณ์๊ฐ ์ ์ ํ ์ถ๊ฐ๋์์ต๋๋ค.
270-271
: EmploymentRate ์ปดํฌ๋ํธ์ ์ฝ๋ฐฑ์ด ์ ์ ๋ฌ๋์์ต๋๋ค.
EmploymentRate
ํธ์ถ ์onEmploymentClick
์ฝ๋ฐฑ์ด ์ ํํ ์ ๋ฌ๋์์ต๋๋ค.
309-309
: ์ฝ๋ฐฑ ํจ์ ๋งค๊ฐ๋ณ์๊ฐ ์ ์ ํ ์ถ๊ฐ๋์์ต๋๋ค.
EmploymentRate
ํจ์ ์๊ทธ๋์ฒ์onEmploymentClick
๋งค๊ฐ๋ณ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.gradlew (7)
4-4
: ์ ์๊ถ ์ ๋ณด๊ฐ ์ ๋ฐ์ดํธ๋์์ต๋๋ค.์ ์๊ถ ์ ๋ณด๊ฐ ์ต์ ์ฐ๋๋ก ์ ๋ฐ์ดํธ๋์์ต๋๋ค.
20-62
: ์คํฌ๋ฆฝํธ ๋ฌธ์ํ ๋ฐ ์ฃผ์์ด ๊ฐ์ ๋์์ต๋๋ค.Gradle ์คํฌ๋ฆฝํธ์ ๋ํ ๋ฌธ์ํ ๋ฐ ์ค๋ช ์ด ์์ธํ๊ฒ ๊ฐ์ ๋์์ผ๋ฉฐ, ์คํ ๋ฐ ํจ์น ๊ด๋ จ ์ค์ ์ง์นจ์ด ํฌํจ๋์์ต๋๋ค.
70-81
: ์ฌ๋ณผ๋ฆญ ๋งํฌ ์ฒ๋ฆฌ ๋ก์ง์ด ๊ฐ์ ๋์์ต๋๋ค.
expr
๋์ ์ ํ๋ผ๋ฏธํฐ ํ์ฅ๊ณผcase
๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ ๊ฒฌ๊ณ ํ๊ณ ๊ฐ๋ ์ฑ ์๋ ์ฝ๋๋ก ๊ฐ์ ๋์์ต๋๋ค.
133-140
: Java ๋ช ๋ น ๊ฒ์ถ ๋ก์ง ๊ฐ์ ์ด ์ด๋ฃจ์ด์ก์ต๋๋ค.
which
๋์command -v
๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ด์์ฑ ์๋ ๋ฐฉ์์ผ๋ก Java ๋ช ๋ น์ ๊ฒ์ํ๋๋ก ๊ฐ์ ๋์์ต๋๋ค.
144-160
: ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ค์ ๋ก์ง์ด ๊ฐ์ ๋์์ต๋๋ค.ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ต๋๊ฐ ์ค์ ๋ก์ง์ด ๋ ๊ฐ๊ฒฐํ๊ณ ๋ช ํํ๊ฒ ๊ฐ์ ๋์์ต๋๋ค.
211-247
: ์ปค๋งจ๋ ๋ผ์ธ ์ธ์ ์ฒ๋ฆฌ ๋ก์ง์ด ๊ฐ์ ๋์์ต๋๋ค.JVM ์ต์ ๊ณผ ๋ช ๋ น ์ธ์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ก์ง์ด ๋ ๊ฒฌ๊ณ ํ๊ณ ์์ ํ ๋ฐฉ์์ผ๋ก ๊ฐ์ ๋์์ผ๋ฉฐ, xargs๋ฅผ ํ์ฉํ ์ธ์ ํ์ฑ์ด ์ถ๊ฐ๋์์ต๋๋ค.
1-1
:โ Verification inconclusive
์ ธ ์ธํฐํ๋ฆฌํฐ ์ง์ ๋ฐฉ์ ๋ณ๊ฒฝ ๊ฒํ ๊ฐ ํ์ํฉ๋๋ค.
#!/usr/bin/env sh
์์#!/bin/sh
๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. ์ด๋ ์์คํ ๊ฐ ํธํ์ฑ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.#!/usr/bin/env sh
๊ฐ ๋ ์ด์์ฑ์ด ๋์ง๋ง, ํ๋ก์ ํธ์ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ๊ฒฐ์ ํด์ฃผ์ธ์.
๐ Script executed:
#!/bin/bash # Check if /bin/sh is POSIX compliant /bin/sh -c 'echo $POSIX2_VERSION'Length of output: 36
๊ฒ์ฆ ํ์: ์ ธ ์ธํฐํ๋ฆฌํฐ ์ง์ ๋ฐฉ์ ๋ณ๊ฒฝ ๊ด๋ จ ์ถ๊ฐ ํ์ธ ์์ฒญ
- ํ์ผ:
gradlew
(๋ผ์ธ 1)- ๋ณ๊ฒฝ ๋ด์ญ: ๊ธฐ์กด์
#!/usr/bin/env sh
์์#!/bin/sh
๋ก ๋ณ๊ฒฝ๋จ.- ์ฐ๋ ค์ฌํญ:
/bin/sh
๊ฐ POSIX ํธํ์ฑ์ ์ถฉ์คํ ์ ๊ณตํ๋์ง์ ๋ํ ๊ฒ์ฆ ๋ช ๋ น์ด(echo $POSIX2_VERSION
) ์คํ ๊ฒฐ๊ณผ ์๋ฌด ์ถ๋ ฅ๋ ๋ฐ์ํ์ง ์์, ํด๋น ์ ธ ์ธํฐํ๋ฆฌํฐ๊ฐ ๊ธฐ๋ํ๋ ๋์์ ๋ณด์ฅํ๋์ง ๋ถ๋ถ๋ช ํฉ๋๋ค.- ๊ถ์ฅ ์กฐ์น:
ํ๋ก์ ํธ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ์ด์์ฑ์ด ๋์
/usr/bin/env sh
์ฌ์ฉ ์ฌ๋ถ๋ฅผ ์ฌ๊ฒํ ํ์๊ธฐ ๋ฐ๋๋๋ค.์ถ๊ฐ ๊ฒ์ฆ์ ์ํด ์๋์ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์์ ํ๊ฑฐ๋, ์๋์ผ๋ก POSIX ํธํ์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
#!/bin/bash # POSIX2_VERSION ๋ณ์๊ฐ ์ค์ ๋์ด ์๋์ง ๋ช ํํ ํ์ธํ๋ ์คํฌ๋ฆฝํธ ์์ output=$(/bin/sh -c 'if [ -n "$POSIX2_VERSION" ]; then echo "POSIX compliant: $POSIX2_VERSION"; else echo "POSIX2_VERSION not set"; fi') echo "POSIX check: $output"์์ ๊ฐ์ด ๊ฒฐ๊ณผ๊ฐ ๋ช ํํ๊ฒ ๋์ค์ง ์๋๋ค๋ฉด, ํด๋น ๋ณ๊ฒฝ์ด ์์คํ ๊ฐ ํธํ์ฑ์ ๋ฏธ์น๋ ์ํฅ์ ์ถฉ๋ถํ ๊ฒํ ํ ํ ๊ฒฐ์ ํ์๊ธธ ๋ฐ๋๋๋ค.
app/src/main/java/team/retum/jobisandroidv2/root/RootScreen.kt (4)
49-49
: Root ํจ์์ ๊ณ ์ฉ ํํฉ ํ์ด์ง ์ด๋ ์ฝ๋ฐฑ์ด ์ ์ ํ ์ถ๊ฐ๋์์ต๋๋ค.
onEmploymentClick
์ฝ๋ฐฑ ํ๋ผ๋ฏธํฐ๊ฐ Root ํจ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.
83-83
: RootScreen ํธ์ถ์ ์ฝ๋ฐฑ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋์์ต๋๋ค.
RootScreen
ํธ์ถ ์onEmploymentClick
์ฝ๋ฐฑ์ด ์ ์ ํ ์ ๋ฌ๋์์ต๋๋ค.
117-117
: RootScreen ํจ์ ์๊ทธ๋์ฒ์ ์ฝ๋ฐฑ์ด ์ ํํ ์ถ๊ฐ๋์์ต๋๋ค.
RootScreen
ํจ์์onEmploymentClick
๋งค๊ฐ๋ณ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.
163-163
: NavHost์ home ํจ์ ํธ์ถ์ ์ฝ๋ฐฑ์ด ์ ์ ๋ฌ๋์์ต๋๋ค.NavigationHost์ home ํจ์ ํธ์ถ ์
onEmploymentClick
์ฝ๋ฐฑ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋์์ต๋๋ค.feature/employment/src/main/java/team/retum/employment/viewmodel/EmploymentDetailViewModel.kt (1)
11-13
: ViewModel ์ด๊ธฐํ ๋ฐ ์์กด์ฑ ์ฃผ์ ์ด ์ ๊ตฌํ๋์์ต๋๋ค.ViewModel ํด๋์ค๊ฐ ์์ฑ์๋ฅผ ํตํด ์์กด์ฑ ์ฃผ์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ๊ณ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ ์ํ ์ด๊ธฐํ๋ ์ ์ ํฉ๋๋ค.
core/domain/src/main/java/team/retum/usecase/entity/application/EmploymentStatusEntity.kt (1)
35-40
:โ Verification inconclusive
URL ๊ตฌ์ฑ ๋ก์ง ํ์ธ ํ์
์ด๋ฏธ์ง URL์ ๊ตฌ์ฑํ ๋ ๋จ์ํ ๋ฌธ์์ด์ ์ฐ๊ฒฐํ๊ณ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด
logoUrl
์ ์ด๋ฏธ ์ ์ฒด URL์ด ํฌํจ๋์ด ์๊ฑฐ๋ ์ฌ๋์('/')๊ฐ ๋๋ฝ๋ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๐ Script executed:
#!/bin/bash # ResourceKeys.IMAGE_URL์ ํ์๊ณผ ์ฌ์ฉ ๋ฐฉ์ ํ์ธ cat $(fd ResourceKeys --type file) | grep -A 5 "IMAGE_URL"Length of output: 463
URL ๊ตฌ์ฑ ๋ก์ง ๊ฐ์ ํ์
ํ์ฌ
EmploymentStatusEntity.ClassEmploymentStatusEntity.GetEmploymentRateList.toEntity()
์์ ์ด๋ฏธ์ง URL์ ๊ตฌ์ฑํ ๋,ResourceKeys.IMAGE_URL
์์์this.logoUrl
๋ฅผ ๋จ์ ๋ฌธ์์ด ์ฐ๊ฒฐ ๋ฐฉ์์ผ๋ก ๊ฒฐํฉํ๊ณ ์์ต๋๋ค. ์ด ๋ฐฉ์์ ์๋์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์์ต๋๋ค:
ResourceKeys.IMAGE_URL
๋"https://dsm-s3-bucket-jobis.s3.ap-northeast-2.amazonaws.com/"
์ ๊ฐ์ด trailing slash๊ฐ ํฌํจ๋์ด ์์ผ๋,
this.logoUrl
๊ฐ ์๋๊ฒฝ๋ก์ธ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ ์์ผ๋,- ๋ฐฑ์๋ ์๋ต์์
logoUrl
์ ์ด๋ฏธ ์ ์ฒด URL์ด ํฌํจ๋ ๊ฒฝ์ฐ ์ค๋ณต๋ URL์ด ์๊ธธ ์ ์์ต๋๋ค.this.logoUrl
์ ์ฌ๋์๊ฐ ๋๋ฝ๋ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ URL ํ์์ด ๋ณด์ฅ๋์ง ์์ ์ ์์ต๋๋ค.๋ฐฑ์๋ ์๋ต ์คํ๊ณผ ์ ๋ฌ๋๋
logoUrl
๊ฐ์ ํ์์ ์ฌ๊ฒํ ํ ํ, ์กฐ๊ฑด๋ถ ๋ก์ง(์: ์ ๋ฌ๋ URL์ด ์ ๋ URL์ธ์ง ์ฒดํฌ ํ ์ ๋์ด๋ฅผ ์ ์ฉํ๋ ๋ฐฉ์)์ ์ ์ฉํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ์ ๊ฒํ ํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.gradle/libs.versions.toml (3)
51-54
:โ Verification inconclusive
์ต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ์ ํฉ์ฑ ํ์ธ
์ด PR์ ์ถ๊ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ์ด ์ต์ ์์ ๋ฒ์ ์ธ์ง ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค:
- core-ktx: 1.15.0
- appcompat: 1.7.0
- tiles-tooling-preview: 1.4.1
- ui-tooling-preview-android: 1.7.8
๐ Web query:
Android androidx.core:core-ktx ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ต์ ์์ ๋ฒ์ ์ ๋ฌด์์ธ๊ฐ์?
Error during web search
์ต์ ์์ ๋ฒ์ ํ์ธ ํ์
ํ์ฌ
gradle/libs.versions.toml
ํ์ผ(๋ผ์ธ 51-54)์ ๋์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ๋ค์ด ์ต์ ์์ ๋ฒ์ ์ธ์ง ํ์ธ์ด ํ์ํฉ๋๋ค.
- core-ktx: 1.15.0
- appcompat: 1.7.0
- tiles-tooling-preview: 1.4.1
- ui-tooling-preview-android: 1.7.8
์น ๊ฒ์ ์๋ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ต์ ๋ฒ์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์์ต๋๋ค. ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ต์ ์์ ๋ฒ์ ์ ์๋์ผ๋ก ํ์ธํ ํ, ํ์ํ ๊ฒฝ์ฐ ์ ๋ฐ์ดํธํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
20-20
:โ Verification inconclusive
์๋๋ก์ด๋ Gradle ํ๋ฌ๊ทธ์ธ ๋ฒ์ ๋ํญ ์ ๋ฐ์ดํธ ๊ฒ์ฆ ํ์
Android Gradle ํ๋ฌ๊ทธ์ธ์ 8.2.2์์ 8.7.0์ผ๋ก ๋ํญ ์ ๋ฐ์ดํธํ์ต๋๋ค. ์ด๋ ์ฃผ์ ๋ฒ์ ๋ณ๊ฒฝ์ผ๋ก, ํธํ์ฑ ๋ฌธ์ ๋ ๋น๋ ์ค์ ๋ณ๊ฒฝ์ด ํ์ํ ์ ์์ต๋๋ค.
๐ Web query:
Android Gradle Plugin 8.7.0๊ณผ 8.2.2 ์ฌ์ด์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ ๋ฐ ํธํ์ฑ ๋ฌธ์ ๋ ๋ฌด์์ธ๊ฐ์?
Error during web search
๊ฒ์ฆ ํ์: Android Gradle ํ๋ฌ๊ทธ์ธ 8.7.0 ์ ๋ฐ์ดํธ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ ํ์ธ
Android Gradle ํ๋ฌ๊ทธ์ธ์ 8.2.2์์ 8.7.0์ผ๋ก ์ ๋ฐ์ดํธํ๋ฉด์, major ๋ฒ์ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ๋ค์ ์ฌํญ๋ค์ ํ์ธํด์ฃผ์ธ์:
- ๋ฆด๋ฆฌ์ฆ ๋ ธํธ ๊ฒํ : AGP 8.7.0์ ๊ธฐ๋ฅ ์ถ๊ฐ, ์ ๊ฑฐ ๋๋ ๋ณ๊ฒฝ๋ API ๋ฐ ๊ตฌ์ฑ ์ต์ ํ์ธ
- ๋น๋ ์ค์ : ๊ธฐ์กด์ ๋น๋ ์ค์ ๋ฐ ํ๋ฌ๊ทธ์ธ ํธํ์ฑ ๋ฌธ์ ๋ฐ์ ์ฌ๋ถ ์ ๊ฒ
- ํธํ์ฑ ํ ์คํธ: ์ค์ ํ๋ก์ ํธ ๋น๋ ๋ฐ ํ ์คํธ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ๋ฌด ํ์ธ
ํ์ฌ ์น ๊ฒ์์์ ๊ด๋ จ ์ ๋ณด๋ฅผ ๋ฐ์ง ๋ชปํ์ผ๋ฏ๋ก, ์ ์ฌํญ๋ค์ ์ถ๊ฐ ๊ฒ์ฆํ ํ ์งํํด ์ฃผ์ธ์.
120-123
:โ Verification inconclusive
์๋ก ์ถ๊ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ๋ชฉ์ ๋ช ํํ ํ์
์ด PR์์ ์๋ก ์ถ๊ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค(core-ktx, appcompat, tiles-tooling-preview, ui-tooling-preview-android)์ ๊ตฌ์ฒด์ ์ธ ์ฌ์ฉ ๋ชฉ์ ๊ณผ ํ์์ฑ์ด ๋ช ํํ์ง ์์ต๋๋ค. ํนํ
tiles-tooling-preview
๋ Wear OS ๊ฐ๋ฐ๊ณผ ๊ด๋ จ์ด ์๋๋ฐ, ์ด ํ๋ก์ ํธ๊ฐ Wear OS ์ฑ์ ๊ฐ๋ฐํ๋์ง ํ์ธ์ด ํ์ํฉ๋๋ค.
๐ Script executed:
#!/bin/bash # Wear OS ๊ด๋ จ ์ฝ๋๋ ์ค์ ์ด ์๋์ง ํ์ธ fd -E "*.git*" -E "*build*" -E "*gradle*" -t f | xargs grep -l "wear" 2>/dev/null || echo "No Wear OS references found" # ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๊ฐ์ ธ์ค๋ ๋ชจ๋ ํ์ธ grep -r "androidx-tiles-tooling-preview\|androidx-core-ktx\|androidx-appcompat\|androidx-ui-tooling-preview-android" --include="*.gradle.kts" .Length of output: 280
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ๋ชฉ์ ์ฌ๊ฒํ ํ์
PR์์ ์๋ก ์ถ๊ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค(
androidx-core-ktx
,androidx-appcompat
,androidx-tiles-tooling-preview
,androidx-ui-tooling-preview-android
)์ ์ฌ์ฉ ์ฉ๋๊ฐ ์ฝ๋์์์ ๋ช ํํ์ง ์์ต๋๋ค. ํนํandroidx-tiles-tooling-preview
๋ Wear OS ๊ฐ๋ฐ์ ํ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ณด์ด๋, ํ์ฌ ์ฝ๋๋ฒ ์ด์ค์์๋ Wear OS์ ๊ด๋ จ๋ ์ฐธ์กฐ๊ฐ ๋ฐ๊ฒฌ๋์ง ์์์ต๋๋ค.
- ํ์ผ:
gradle/libs.versions.toml
(๋ผ์ธ: 120-123)- ํ์ธ ์์ฒญ: ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์ค์ ๋ก ์ฌ์ฉ๋๋์ง, ํน์ ์์ผ๋ก ์ฌ์ฉ๋ ์ง๋ฅผ ๋ช ํํ ์ค๋ช ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ๋ง์ฝ ๋ถํ์ํ๋ค๋ฉด ์ ๋ฆฌํ๋ ๊ฒ๋ ๊ณ ๋ คํด ์ฃผ์ธ์.
@@ -1,5 +1,7 @@ | |||
package team.retum.common.utils | |||
|
|||
import android.provider.Telephony.Mms.Rate |
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
๋ถํ์ํ import ํ์ธ ํ์
android.provider.Telephony.Mms.Rate
import๊ฐ ์ถ๊ฐ๋์์ง๋ง, ์ฝ๋ ๋ด์์ ์ฌ์ฉ๋๋ ๊ณณ์ด ์๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ์ฌ์ฉ๋์ง ์๋ import๋ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
-import android.provider.Telephony.Mms.Rate
๐ 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 android.provider.Telephony.Mms.Rate |
route = "$NAVIGATION_EMPLOYMENT/${ResourceKeys}", | ||
arguments = listOf( |
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.
ResourceKeys ์ฌ์ฉ ๋ฐฉ์์ ์ค๋ฅ๊ฐ ์์ต๋๋ค.
ํ์ฌ ์ฝ๋์์๋ "$NAVIGATION_EMPLOYMENT/${ResourceKeys}"
์ ๊ฐ์ด ResourceKeys ๊ฐ์ฒด๋ฅผ ์ง์ ๋ฌธ์์ด์ ์ฝ์
ํ๋ ค๊ณ ์๋ํ๊ณ ์์ต๋๋ค. ResourceKeys๋ ํด๋์ค๋ ๊ฐ์ฒด์ด๋ฏ๋ก ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ์ ๋ฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์์ ํด์ผ ํฉ๋๋ค:
- route = "$NAVIGATION_EMPLOYMENT/${ResourceKeys}",
+ route = "$NAVIGATION_EMPLOYMENT/{${ResourceKeys.RATE}}/{${ResourceKeys.TOTAL_STUDENT_COUNT}}/{${ResourceKeys.PASS_COUNT}}",
๐ 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.
route = "$NAVIGATION_EMPLOYMENT/${ResourceKeys}", | |
arguments = listOf( | |
route = "$NAVIGATION_EMPLOYMENT/{${ResourceKeys.RATE}}/{${ResourceKeys.TOTAL_STUDENT_COUNT}}/{${ResourceKeys.PASS_COUNT}}", | |
arguments = listOf( |
fun NavController.navigateToEmployment() { | ||
navigate(NAVIGATION_EMPLOYMENT) | ||
} |
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.
navigateToEmployment ํจ์์ ํ์ํ ์ธ์๊ฐ ๋๋ฝ๋์์ต๋๋ค.
navigateToEmployment
ํจ์๋ ํ์ํ ๋ชจ๋ ์ธ์(rate, totalStudentCount, passCount)๋ฅผ ํฌํจํ์ฌ ๋ค๋น๊ฒ์ด์
๋ฃจํธ๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์์ ํ์ธ์:
- fun NavController.navigateToEmployment() {
- navigate(NAVIGATION_EMPLOYMENT)
- }
+ fun NavController.navigateToEmployment(rate: Float, totalStudentCount: Long, passCount: Long) {
+ navigate("$NAVIGATION_EMPLOYMENT/$rate/$totalStudentCount/$passCount")
+ }
๐ 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.navigateToEmployment() { | |
navigate(NAVIGATION_EMPLOYMENT) | |
} | |
fun NavController.navigateToEmployment(rate: Float, totalStudentCount: Long, passCount: Long) { | |
navigate("$NAVIGATION_EMPLOYMENT/$rate/$totalStudentCount/$passCount") | |
} |
val rate = it.arguments?.getFloat(ResourceKeys.RATE) ?: 0f | ||
val totalStudentCount = it.arguments?.getLong(ResourceKeys.RATE) ?: 0 | ||
val passCount = it.arguments?.getLong(ResourceKeys.RATE) ?: 0 |
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.
์ธ์ ํค ์ฐธ์กฐ์ ์ค๋ฅ๊ฐ ์์ต๋๋ค.
์ธ ๊ฐ์ ๋ค๋ฅธ ์ธ์๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ๋ชจ๋ ๋์ผํ ํค(ResourceKeys.RATE)๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ฐ ์ธ์์ ๋ง๋ ํค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์์ ํ์ธ์:
- val rate = it.arguments?.getFloat(ResourceKeys.RATE) ?: 0f
- val totalStudentCount = it.arguments?.getLong(ResourceKeys.RATE) ?: 0
- val passCount = it.arguments?.getLong(ResourceKeys.RATE) ?: 0
+ val rate = it.arguments?.getFloat(ResourceKeys.RATE) ?: 0f
+ val totalStudentCount = it.arguments?.getLong(ResourceKeys.TOTAL_STUDENT_COUNT) ?: 0
+ val passCount = it.arguments?.getLong(ResourceKeys.PASS_COUNT) ?: 0
๐ 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.
val rate = it.arguments?.getFloat(ResourceKeys.RATE) ?: 0f | |
val totalStudentCount = it.arguments?.getLong(ResourceKeys.RATE) ?: 0 | |
val passCount = it.arguments?.getLong(ResourceKeys.RATE) ?: 0 | |
val rate = it.arguments?.getFloat(ResourceKeys.RATE) ?: 0f | |
val totalStudentCount = it.arguments?.getLong(ResourceKeys.TOTAL_STUDENT_COUNT) ?: 0 | |
val passCount = it.arguments?.getLong(ResourceKeys.PASS_COUNT) ?: 0 |
navArgument(ResourceKeys.RATE) { NavType.FloatType}, | ||
navArgument(ResourceKeys.TOTAL_STUDENT_COUNT) { NavType.LongType}, | ||
navArgument(ResourceKeys.PASS_COUNT) { NavType.LongType } | ||
) |
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
๋ค๋น๊ฒ์ด์ ์ธ์ ์ ํ ์ง์ ์ด ๋ถ์์ ํฉ๋๋ค.
๋ค๋น๊ฒ์ด์ ์ธ์์ ์ ํ์ ์ง์ ๋์์ง๋ง, ๊ฐ ์ธ์์ ์ด๋ฆ์ ๋ํ ์ค๊ดํธ๊ฐ ๋๋ฝ๋์ด ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์์ ํ์ธ์:
- navArgument(ResourceKeys.RATE) { NavType.FloatType},
- navArgument(ResourceKeys.TOTAL_STUDENT_COUNT) { NavType.LongType},
- navArgument(ResourceKeys.PASS_COUNT) { NavType.LongType }
+ navArgument(ResourceKeys.RATE) { type = NavType.FloatType },
+ navArgument(ResourceKeys.TOTAL_STUDENT_COUNT) { type = NavType.LongType },
+ navArgument(ResourceKeys.PASS_COUNT) { type = NavType.LongType }
๐ 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.
navArgument(ResourceKeys.RATE) { NavType.FloatType}, | |
navArgument(ResourceKeys.TOTAL_STUDENT_COUNT) { NavType.LongType}, | |
navArgument(ResourceKeys.PASS_COUNT) { NavType.LongType } | |
) | |
navArgument(ResourceKeys.RATE) { type = NavType.FloatType }, | |
navArgument(ResourceKeys.TOTAL_STUDENT_COUNT) { type = NavType.LongType }, | |
navArgument(ResourceKeys.PASS_COUNT) { type = NavType.LongType } | |
) |
data class EmploymentDetailState( | ||
val classId: Long, | ||
val totalStudent: Long, | ||
val passStudent: Long, | ||
val companyInfo: List<CompanyItem> | ||
) { | ||
companion object { | ||
fun getDefaultState() = EmploymentDetailState( | ||
classId = 0, | ||
totalStudent = 0, | ||
passStudent = 0, | ||
companyInfo = emptyList(), | ||
) | ||
} | ||
|
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
ํด๋์ค ๊ตฌ์กฐ ์ ๋ณด๊ฐ ์์ค๋๊ณ ์์ต๋๋ค.
ํ์ฌ ๊ตฌํ์ ๋ชจ๋ ํด๋์ค์ ํ์ฌ ์ ๋ณด๋ฅผ ํ๋์ ๋ฆฌ์คํธ๋ก ํ๋ฉดํ(flatMap)ํ๊ณ ์์ด ์๋ณธ ๋ฐ์ดํฐ์ ํด๋์ค๋ณ ๊ตฌ์กฐ ์ ๋ณด๊ฐ ์์ค๋ฉ๋๋ค. ํด๋์ค ๊ตฌ์กฐ๋ฅผ ๋ณด์กดํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
data class EmploymentDetailState(
val classId: Long,
val totalStudent: Long,
val passStudent: Long,
- val companyInfo: List<CompanyItem>
+ val classCompanyInfo: List<ClassCompanyInfo>
) {
companion object {
fun getDefaultState() = EmploymentDetailState(
classId = 0,
totalStudent = 0,
passStudent = 0,
- companyInfo = emptyList(),
+ classCompanyInfo = emptyList(),
)
}
}
+data class ClassCompanyInfo(
+ val classId: Long,
+ val className: String,
+ val companies: List<CompanyItem>
+)
๊ทธ๋ฆฌ๊ณ fetchEmploymentStatus() ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ ํด์ผ ํฉ๋๋ค:
internal fun fetchEmploymentStatus() {
viewModelScope.launch(Dispatchers.IO) {
fetchEmploymentStatusUseCase().onSuccess {
setState {
state.value.copy(
- companyInfo = it.classes.flatMap { classInfo ->
- classInfo.employmentRateList.map { employmentRate ->
- CompanyItem(
- companyName = employmentRate.companyName,
- logoUrl = employmentRate.logoUrl
- )
- }
- }
+ classCompanyInfo = it.classes.map { classInfo ->
+ ClassCompanyInfo(
+ classId = classInfo.classId,
+ className = classInfo.className,
+ companies = classInfo.employmentRateList.map { employmentRate ->
+ CompanyItem(
+ companyName = employmentRate.companyName,
+ logoUrl = employmentRate.logoUrl
+ )
+ }
+ )
+ }
)
}
๐ 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.
data class EmploymentDetailState( | |
val classId: Long, | |
val totalStudent: Long, | |
val passStudent: Long, | |
val companyInfo: List<CompanyItem> | |
) { | |
companion object { | |
fun getDefaultState() = EmploymentDetailState( | |
classId = 0, | |
totalStudent = 0, | |
passStudent = 0, | |
companyInfo = emptyList(), | |
) | |
} | |
data class EmploymentDetailState( | |
val classId: Long, | |
val totalStudent: Long, | |
val passStudent: Long, | |
val classCompanyInfo: List<ClassCompanyInfo> | |
) { | |
companion object { | |
fun getDefaultState() = EmploymentDetailState( | |
classId = 0, | |
totalStudent = 0, | |
passStudent = 0, | |
classCompanyInfo = emptyList(), | |
) | |
} | |
} | |
data class ClassCompanyInfo( | |
val classId: Long, | |
val className: String, | |
val companies: List<CompanyItem> | |
) | |
internal fun fetchEmploymentStatus() { | |
viewModelScope.launch(Dispatchers.IO) { | |
fetchEmploymentStatusUseCase().onSuccess { | |
setState { | |
state.value.copy( | |
classCompanyInfo = it.classes.map { classInfo -> | |
ClassCompanyInfo( | |
classId = classInfo.classId, | |
className = classInfo.className, | |
companies = classInfo.employmentRateList.map { employmentRate -> | |
CompanyItem( | |
companyName = employmentRate.companyName, | |
logoUrl = employmentRate.logoUrl | |
) | |
} | |
) | |
} | |
) | |
} | |
} | |
} | |
} |
sealed interface EmploymentDetailSideEffect { | ||
data object BadRequest : EmploymentDetailSideEffect | ||
data object Success : EmploymentDetailSideEffect | ||
} |
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
SideEffect ๊ตฌํ์ด ์์ฑ๋์ง ์์์ต๋๋ค.
ํ์ฌ EmploymentDetailSideEffect
๋ ์ ์๋์ด ์์ง๋ง ์ค์ ๋ก๋ ์ฌ์ฉ๋์ง ์๊ณ ์์ต๋๋ค. ViewModel์์ ์ ์ ํ ์์ ์ side effect๋ฅผ ๋ฐํํ๋๋ก ๊ตฌํํด์ผ ํฉ๋๋ค.
SideEffect๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ก๋ฉ ์ํ๋ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค:
sealed interface EmploymentDetailSideEffect {
data object BadRequest : EmploymentDetailSideEffect
data object Success : EmploymentDetailSideEffect
+ data object Loading : EmploymentDetailSideEffect
}
๊ทธ๋ฆฌ๊ณ fetchEmploymentStatus() ํจ์ ์์ ์ Loading ์ํ๋ฅผ ๋ฐํํ๋๋ก ์์ :
internal fun fetchEmploymentStatus() {
+ postSideEffect(EmploymentDetailSideEffect.Loading)
viewModelScope.launch(Dispatchers.IO) {
fetchEmploymentStatusUseCase().onSuccess {
// ...
postSideEffect(EmploymentDetailSideEffect.Success)
}.onFailure {
postSideEffect(EmploymentDetailSideEffect.BadRequest)
}
}
}
๐ 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.
sealed interface EmploymentDetailSideEffect { | |
data object BadRequest : EmploymentDetailSideEffect | |
data object Success : EmploymentDetailSideEffect | |
} | |
sealed interface EmploymentDetailSideEffect { | |
data object BadRequest : EmploymentDetailSideEffect | |
data object Success : EmploymentDetailSideEffect | |
data object Loading : EmploymentDetailSideEffect | |
} |
sealed interface EmploymentDetailSideEffect { | |
data object BadRequest : EmploymentDetailSideEffect | |
data object Success : EmploymentDetailSideEffect | |
} | |
internal fun fetchEmploymentStatus() { | |
postSideEffect(EmploymentDetailSideEffect.Loading) | |
viewModelScope.launch(Dispatchers.IO) { | |
fetchEmploymentStatusUseCase().onSuccess { | |
// ... | |
postSideEffect(EmploymentDetailSideEffect.Success) | |
}.onFailure { | |
postSideEffect(EmploymentDetailSideEffect.BadRequest) | |
} | |
} | |
} |
internal fun fetchEmploymentCount() { | ||
viewModelScope.launch(Dispatchers.IO) { | ||
fetchEmploymentCountUseCase().onSuccess { | ||
setState { | ||
val rate = if (it.passCount == 0L || it.totalStudentCount == 0L) { | ||
0f | ||
} else { | ||
it.passCount.toFloat() / it.totalStudentCount.toFloat() * 100f | ||
} | ||
state.value.copy( | ||
rate = DecimalFormat("##.#").format(rate), | ||
totalStudentCount = it.totalStudentCount, | ||
passCount = it.passCount, | ||
) | ||
} | ||
} | ||
} | ||
} |
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
์๋ฌ ์ฒ๋ฆฌ ๋ก์ง ์ถ๊ฐ ํ์
fetchEmploymentCount
๋ฉ์๋์์ API ํธ์ถ์ ์ฑ๊ณต ์ผ์ด์ค๋ง ์ฒ๋ฆฌํ๊ณ ์์ผ๋ฉฐ, ์คํจ ์ผ์ด์ค์ ๋ํ ์ฒ๋ฆฌ๊ฐ ์์ต๋๋ค. ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ UI์ ์ ์ ํ ์ํ๋ฅผ ์
๋ฐ์ดํธํ๊ณ ์ฌ์ด๋ ์ดํํธ๋ฅผ ๋ฐ์์์ผ์ผ ํฉ๋๋ค.
fetchEmploymentCountUseCase().onSuccess {
setState {
val rate = if (it.passCount == 0L || it.totalStudentCount == 0L) {
0f
} else {
it.passCount.toFloat() / it.totalStudentCount.toFloat() * 100f
}
state.value.copy(
rate = DecimalFormat("##.#").format(rate),
totalStudentCount = it.totalStudentCount,
passCount = it.passCount,
)
}
+ }.onFailure {
+ postSideEffect(EmploymentSideEffect.BadRequest)
}
๐ 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 fun fetchEmploymentCount() { | |
viewModelScope.launch(Dispatchers.IO) { | |
fetchEmploymentCountUseCase().onSuccess { | |
setState { | |
val rate = if (it.passCount == 0L || it.totalStudentCount == 0L) { | |
0f | |
} else { | |
it.passCount.toFloat() / it.totalStudentCount.toFloat() * 100f | |
} | |
state.value.copy( | |
rate = DecimalFormat("##.#").format(rate), | |
totalStudentCount = it.totalStudentCount, | |
passCount = it.passCount, | |
) | |
} | |
} | |
} | |
} | |
internal fun fetchEmploymentCount() { | |
viewModelScope.launch(Dispatchers.IO) { | |
fetchEmploymentCountUseCase().onSuccess { | |
setState { | |
val rate = if (it.passCount == 0L || it.totalStudentCount == 0L) { | |
0f | |
} else { | |
it.passCount.toFloat() / it.totalStudentCount.toFloat() * 100f | |
} | |
state.value.copy( | |
rate = DecimalFormat("##.#").format(rate), | |
totalStudentCount = it.totalStudentCount, | |
passCount = it.passCount, | |
) | |
} | |
}.onFailure { | |
postSideEffect(EmploymentSideEffect.BadRequest) | |
} | |
} | |
} |
text = "์ ์ฒด ํต๊ณ", | ||
style = JobisTypography.Body, |
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
ํ๋์ฝ๋ฉ๋ ๋ฌธ์์ด์ ๋ฌธ์์ด ๋ฆฌ์์ค๋ก ๋์ฒด ํ์
"์ ์ฒด ํต๊ณ"๋ผ๋ ๋ฌธ์์ด์ด ํ๋์ฝ๋ฉ๋์ด ์์ต๋๋ค. ๋ค๊ตญ์ด ์ง์๊ณผ ์ผ๊ด์ฑ์ ์ํด ์ด๋ฅผ ๋ฌธ์์ด ๋ฆฌ์์ค๋ก ์ถ์ถํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- text = "์ ์ฒด ํต๊ณ",
+ text = stringResource(id = R.string.total_statistics),
R.string.total_statistics
์ ํด๋นํ๋ ๋ฌธ์์ด ๋ฆฌ์์ค๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
๐ 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.
text = "์ ์ฒด ํต๊ณ", | |
style = JobisTypography.Body, | |
text = stringResource(id = R.string.total_statistics), | |
style = JobisTypography.Body, |
Row( | ||
modifier = Modifier.fillMaxWidth(), | ||
horizontalArrangement = Arrangement.SpaceBetween | ||
) { | ||
ClassEmploymentButton( | ||
onClassClick = onClassClick, | ||
image = team.retum.design_system.R.drawable.ic_computer, | ||
text = "1๋ฐ", | ||
) | ||
ClassEmploymentButton( | ||
onClassClick = onClassClick, | ||
image = team.retum.design_system.R.drawable.ic_computer, | ||
text = "2๋ฐ", | ||
) | ||
} | ||
Row( | ||
modifier = Modifier.fillMaxWidth(), | ||
horizontalArrangement = Arrangement.SpaceBetween | ||
) { | ||
ClassEmploymentButton( | ||
onClassClick = onClassClick, | ||
image = team.retum.design_system.R.drawable.ic_spanner, | ||
text = "3๋ฐ", | ||
) | ||
ClassEmploymentButton( | ||
onClassClick = onClassClick, | ||
image = team.retum.design_system.R.drawable.ic_robot, | ||
text = "4๋ฐ", | ||
) | ||
} |
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
ํด๋์ค ๋ฒํผ ๋ก์ง ๊ฐ์ ํ์
ํ์ฌ ๊ฐ ๋ฐ(1๋ฐ, 2๋ฐ, 3๋ฐ, 4๋ฐ)์ ๋ํ ๋ฒํผ์ด ํ๋์ฝ๋ฉ๋์ด ์์ต๋๋ค. ์ด๋ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ด๋ ต๊ณ ํ์ฅ์ฑ์ด ๋จ์ด์ง๋๋ค. ๋ฆฌ์คํธ์ forEach
๋๋ forEachIndexed
๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
- Row(
- modifier = Modifier.fillMaxWidth(),
- horizontalArrangement = Arrangement.SpaceBetween
- ) {
- ClassEmploymentButton(
- onClassClick = onClassClick,
- image = team.retum.design_system.R.drawable.ic_computer,
- text = "1๋ฐ",
- )
- ClassEmploymentButton(
- onClassClick = onClassClick,
- image = team.retum.design_system.R.drawable.ic_computer,
- text = "2๋ฐ",
- )
- }
- Row(
- modifier = Modifier.fillMaxWidth(),
- horizontalArrangement = Arrangement.SpaceBetween
- ) {
- ClassEmploymentButton(
- onClassClick = onClassClick,
- image = team.retum.design_system.R.drawable.ic_spanner,
- text = "3๋ฐ",
- )
- ClassEmploymentButton(
- onClassClick = onClassClick,
- image = team.retum.design_system.R.drawable.ic_robot,
- text = "4๋ฐ",
- )
- }
+ val classImages = listOf(
+ team.retum.design_system.R.drawable.ic_computer,
+ team.retum.design_system.R.drawable.ic_computer,
+ team.retum.design_system.R.drawable.ic_spanner,
+ team.retum.design_system.R.drawable.ic_robot
+ )
+
+ for (rowIndex in 0..1) {
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ horizontalArrangement = Arrangement.SpaceBetween
+ ) {
+ for (colIndex in 0..1) {
+ val classIndex = rowIndex * 2 + colIndex
+ ClassEmploymentButton(
+ onClassClick = onClassClick,
+ image = classImages[classIndex],
+ text = "${classIndex + 1}๋ฐ",
+ )
+ }
+ }
+ }
๐ 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.
Row( | |
modifier = Modifier.fillMaxWidth(), | |
horizontalArrangement = Arrangement.SpaceBetween | |
) { | |
ClassEmploymentButton( | |
onClassClick = onClassClick, | |
image = team.retum.design_system.R.drawable.ic_computer, | |
text = "1๋ฐ", | |
) | |
ClassEmploymentButton( | |
onClassClick = onClassClick, | |
image = team.retum.design_system.R.drawable.ic_computer, | |
text = "2๋ฐ", | |
) | |
} | |
Row( | |
modifier = Modifier.fillMaxWidth(), | |
horizontalArrangement = Arrangement.SpaceBetween | |
) { | |
ClassEmploymentButton( | |
onClassClick = onClassClick, | |
image = team.retum.design_system.R.drawable.ic_spanner, | |
text = "3๋ฐ", | |
) | |
ClassEmploymentButton( | |
onClassClick = onClassClick, | |
image = team.retum.design_system.R.drawable.ic_robot, | |
text = "4๋ฐ", | |
) | |
} | |
val classImages = listOf( | |
team.retum.design_system.R.drawable.ic_computer, | |
team.retum.design_system.R.drawable.ic_computer, | |
team.retum.design_system.R.drawable.ic_spanner, | |
team.retum.design_system.R.drawable.ic_robot | |
) | |
for (rowIndex in 0..1) { | |
Row( | |
modifier = Modifier.fillMaxWidth(), | |
horizontalArrangement = Arrangement.SpaceBetween | |
) { | |
for (colIndex in 0..1) { | |
val classIndex = rowIndex * 2 + colIndex | |
ClassEmploymentButton( | |
onClassClick = onClassClick, | |
image = classImages[classIndex], | |
text = "${classIndex + 1}๋ฐ", | |
) | |
} | |
} | |
} |
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 (3)
feature/employment/src/main/java/team/retum/employment/ui/EmploymentScreen.kt (3)
60-60
: ์์ง ๊ตฌํ๋์ง ์์ ๋ค๋น๊ฒ์ด์ ๋ก์ง
Employment
ํจ์ ๋ด๋ถ์// TODO :: ๋ค๋น๊ฒ์ด์ ์ถ๊ฐ ๋ฐ ๋ถ์
๋ผ๊ณ ๋ง ๋จ๊ฒจ๋๊ณ ์ค์ ๊ตฌํ์ ๋น์ด ์์ต๋๋ค. ํ์ ์์ ์์ ํด๋น ๋ก์ง์ ๊ตฌํํ๊ฑฐ๋ ์ฐ๋ํ๋ ๊ณผ์ ์ ์งํํด์ผ ํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.ํ์ํ์๋ค๋ฉด ๋ค๋น๊ฒ์ด์ ๋ก์ง ๊ตฌํ ์์๋ ์ถ๊ฐ ์ค์ ์ ๊ดํ ์๋ด๋ฅผ ๋๋ฆด ์ ์์ผ๋ ๋ง์ํด ์ฃผ์ธ์.
62-71
: ์ ๋๋ฉ์ด์ ๊ฐ์ด ํ์ ์ปดํฌ์ ๋ธ์ ๋ฐ์๋์ง ์์
๋ถ๋ชจ ์ปดํฌ์ ๋ธ(Employment
)์์Animatable
์ ํตํด ์ ๋๋ฉ์ด์ ์ ์งํํ์ง๋ง, ์ค์ ๋กEmploymentScreen
์ ๋๊ธฐ๋ ์ธ์๋ ๋จ์ํrate
๊ฐ๋ง ์ ๋ฌํ๊ณ ์์ต๋๋ค. ์ด๋ก ์ธํดanimatedValue.value
๊ฐ UI์ ๋ฐ์๋์ง ์์ ์ ๋๋ฉ์ด์ ํจ๊ณผ๊ฐ ์ ์ฉ๋์ง ์์ต๋๋ค.
EmploymentScreen
์ผ๋กanimatedValue.value
๋ฅผ ๋๊ธฐ๊ฑฐ๋,CircleProgress
๋ด๋ถ ๋ก์ง์์ ์ง์ ์ ๋๋ฉ์ด์ ์ ์ฒ๋ฆฌํ๋๋ก ๋ณ๊ฒฝํด ์ฃผ์๋ฉด ์๋ํ ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
261-308
: CircleProgress ๋ด๋ถ ์ ๋๋ฉ์ด์ ๋ก์ง์ด ๋๋ฝ๋จ
CircleProgress
์์Animatable(percentage)
๋ก ์ด๊ธฐํ๋ง ์งํํ๊ณ , ์ค์ ๋ก ๊ฐ์ ๋ณํ์ํค๋animateTo
๋ฑ์ด ํธ์ถ๋์ง ์์ต๋๋ค. ์ด ์ํ๋ก๋ ์ํ ๊ทธ๋ํ๊ฐ ์ ๋๋ฉ์ด์ ์์ด ๊ณ ์ ๋ ์ํ๋ก ํ์๋ฉ๋๋ค.
LaunchedEffect(percentage)
๋ ๋ค๋ฅธ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ฌ์ฉํด ์ค์ ๋กanimateTo(percentage)
๋ฅผ ํธ์ถํ๊ฑฐ๋, ์์์์ ์ด๋ฏธ ์ ๋๋ฉ์ด์ ์ ์ฒ๋ฆฌํด ์ ๋ฌํ๋ ๊ตฌ์กฐ๋ก ๊ฐ์ ํด์ฃผ์ธ์.
๐ Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
๐ Files selected for processing (4)
core/common/src/main/java/team/retum/common/utils/ResourceKeys.kt
(1 hunks)feature/employment/build.gradle.kts
(1 hunks)feature/employment/src/main/java/team/retum/employment/ui/EmploymentScreen.kt
(1 hunks)feature/employment/src/main/java/team/retum/employment/viewmodel/EmploymentViewModel.kt
(1 hunks)
๐ง Files skipped from review as they are similar to previous changes (2)
- feature/employment/src/main/java/team/retum/employment/viewmodel/EmploymentViewModel.kt
- core/common/src/main/java/team/retum/common/utils/ResourceKeys.kt
โฐ Context from checks skipped due to timeout of 90000ms (2)
- GitHub Check: lint_and_build (build)
- GitHub Check: lint_and_build (lint)
๐ Additional comments (6)
feature/employment/build.gradle.kts (4)
1-7
: ํ๋ฌ๊ทธ์ธ ์ค์ ํ์ธ
ํ๋ฌ๊ทธ์ธ ๋ธ๋ก์์ Android ๋ผ์ด๋ธ๋ฌ๋ฆฌ, Kotlin Android, Hilt, KSP, ๊ทธ๋ฆฌ๊ณ ktlint ํ๋ฌ๊ทธ์ธ์ด ๋ช ํํ๊ฒ ์ ์ฉ๋์ด ์์ด ๋ชจ๋์ ์๊ตฌ์ฌํญ์ ์ ๋ฐ์ํ๊ณ ์์ต๋๋ค.
9-10
: ์ปค์คํ ํ๋ฌ๊ทธ์ธ ์ ์ฉ ์ ์
apply<CommonGradlePlugin>()
์apply<ComposeGradlePlugin>()
๋ฅผ ํตํด ๊ณตํต ์ค์ ๊ณผ Compose ๊ด๋ จ ๊ตฌ์ฑ ์์๋ฅผ ๋ชจ๋์ ์์ฝ๊ฒ ์ ์ฉํ ์ ์ด ์ข์ต๋๋ค.
12-18
: Android ๊ตฌ์ฑ ์ค์ ๊ฒํ
android
๋ธ๋ก ๋ด์์namespace
๋ฅผ ๋ช ์ํ๊ณ ,kotlinOptions
๋ฅผ ํตํด JVM ํ๊ฒ์ProjectProperties.JVM_TARGET
์ผ๋ก ์ค์ ํ ๋ถ๋ถ์ด ๋ชจ๋์ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
20-23
: ์์กด์ฑ ์ถ๊ฐ ๊ฒํ
implementation(libs.androidx.ui.tooling.preview.android)
์์กด์ฑ์ ์ถ๊ฐํ์ฌ AndroidX UI ํด๋ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ธฐ๋ฅ์ ํ์ฑํํ ์ ์ด ์ ์ ํฉ๋๋ค. ํฅํ ํด๋ง ๊ด๋ จ ๋ฒ์ ์ ๋ฐ์ดํธ๋ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๊ฒํ๋ฉด ์ข๊ฒ ์ต๋๋ค.feature/employment/src/main/java/team/retum/employment/ui/EmploymentScreen.kt (2)
185-187
: ํ๋์ฝ๋ฉ๋ ๋ฌธ์์ด์ ๋ฌธ์์ด ๋ฆฌ์์ค๋ก ๋์ฒด ํ์
๊ณผ๊ฑฐ ๋ฆฌ๋ทฐ์์๋ ์ง์ ๋ ๋ด์ฉ๊ณผ ๋์ผํฉ๋๋ค. ๋ค๊ตญ์ด ์ง์ ๋ฐ ์ ์ง๋ณด์๋ฅผ ์ํด ํ๋์ฝ๋ฉ๋"์ ์ฒด ํต๊ณ"
๋ฌธ์์ด์ ๋ฆฌ์์ค๋ก ์ถ์ถํ๋ ๊ฒ์ ๊ถ์ฅ๋๋ฆฝ๋๋ค.- text = "์ ์ฒด ํต๊ณ", + text = stringResource(id = R.string.total_statistics),
218-247
: ํด๋์ค ๋ฒํผ ๋ก์ง ๊ฐ์ ํ์
์ด์ ๋ฆฌ๋ทฐ์์ ์ง์ ๋ ๊ฒ์ฒ๋ผ โ1๋ฐ, 2๋ฐ, 3๋ฐ, 4๋ฐโ๊ณผ ๊ด๋ จ๋ ๋ฒํผ์ ๋ฐ๋ณต ์์ฑํ๊ณ ์์ต๋๋ค. ์ถํ ํด๋์ค ์๊ฐ ๋์ด๋๊ฑฐ๋ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ํ์ฅ์ฑ์ด ๋จ์ด์ง๋ฏ๋ก,List
์forEachIndexed
๋ฑ์ ํ์ฉํด ๋์ ์ผ๋ก ์์ฑํ๋ ๋ฐฉ์์ ๊ถ์ฅํฉ๋๋ค.- Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween - ) { - ClassEmploymentButton( - onClassClick = onClassClick, - image = team.retum.design_system.R.drawable.ic_computer, - text = "1๋ฐ", - ) - ClassEmploymentButton( - onClassClick = onClassClick, - image = team.retum.design_system.R.drawable.ic_computer, - text = "2๋ฐ", - ) - } - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween - ) { - ClassEmploymentButton( - onClassClick = onClassClick, - image = team.retum.design_system.R.drawable.ic_spanner, - text = "3๋ฐ", - ) - ClassEmploymentButton( - onClassClick = onClassClick, - image = team.retum.design_system.R.drawable.ic_robot, - text = "4๋ฐ", - ) - } + val classImages = listOf( + team.retum.design_system.R.drawable.ic_computer, + team.retum.design_system.R.drawable.ic_computer, + team.retum.design_system.R.drawable.ic_spanner, + team.retum.design_system.R.drawable.ic_robot + ) + + for (rowIndex in 0..1) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + for (colIndex in 0..1) { + val classIndex = rowIndex * 2 + colIndex + ClassEmploymentButton( + onClassClick = onClassClick, + image = classImages[classIndex], + text = "${classIndex + 1}๋ฐ", + ) + } + } + }
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: 2
โป๏ธ Duplicate comments (4)
feature/employment/src/main/java/team/retum/employment/ui/EmploymentDetailScreen.kt (3)
14-21
:โ ๏ธ Potential issueViewModel ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ง ์๊ณ ์์ต๋๋ค.
ViewModel์ ์ด๊ธฐํํ์ง๋ง ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ํ๋ฅผ ๊ด์ฐฐํ๊ณ ์์ง ์์ต๋๋ค. ๋์ ๋น ๋ฆฌ์คํธ๋ฅผ
EmploymentDetailScreen
์ ์ ๋ฌํ๊ณ ์์ต๋๋ค.๋ค์๊ณผ ๊ฐ์ด ViewModel ์ํ๋ฅผ ๊ด์ฐฐํ๋๋ก ์์ ํ์ธ์:
@Composable fun EmploymentDetail( employmentDetailViewModel: EmploymentDetailViewModel = hiltViewModel(), ) { + val state by employmentDetailViewModel.state.collectAsState() + + LaunchedEffect(Unit) { + employmentDetailViewModel.fetchEmploymentStatus() + } + EmploymentDetailScreen( - companyItem = emptyList(), + companyItem = state.companyItems, ) }
27-42
:โ ๏ธ Potential issueํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์ต๋๋ค.
companyItem
ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌ๋ฐ์์ง๋ง, ์ด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํ๋์ฝ๋ฉ๋ ๋น ํญ๋ชฉ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.๋ค์๊ณผ ๊ฐ์ด ์ ๋ฌ๋ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋๋ก ์์ ํ์ธ์:
Column( modifier = Modifier .fillMaxSize(), ) { - val arr: List<CompanyItem> = listOf( - CompanyItem( - companyName = "", - logoUrl = "", - ), - ) LazyHorizontalGrid( + modifier = Modifier.fillMaxWidth(), rows = GridCells.Fixed(4), ) { - items(items = arr) { person -> + items(items = companyItem) { company -> + CompanyIcon( + companyName = company.companyName, + logoUrl = company.logoUrl + ) } } }
40-41
:โ ๏ธ Potential issueitems ๋ธ๋ก์ด ๋น์ด ์์ต๋๋ค.
LazyHorizontalGrid์ items ๋ธ๋ก ๋ด๋ถ๊ฐ ๋น์ด์์ด ์๋ฌด ๋ด์ฉ๋ ํ์๋์ง ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด CompanyIcon์ ํธ์ถํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ธ์:
items(items = arr) { person -> + CompanyIcon( + companyName = person.companyName, + logoUrl = person.logoUrl + ) }์ฐธ๊ณ :
CompanyIcon
ํจ์๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.feature/employment/src/main/java/team/retum/employment/ui/EmploymentScreen.kt (1)
186-187
: ๐ ๏ธ Refactor suggestionํ๋์ฝ๋ฉ๋ ๋ฌธ์์ด์ ๋ฌธ์์ด ๋ฆฌ์์ค๋ก ๋์ฒด ํ์
"์ ์ฒด ํต๊ณ"๋ผ๋ ๋ฌธ์์ด์ด ํ๋์ฝ๋ฉ๋์ด ์์ต๋๋ค. ๋ค๊ตญ์ด ์ง์๊ณผ ์ผ๊ด์ฑ์ ์ํด ์ด๋ฅผ ๋ฌธ์์ด ๋ฆฌ์์ค๋ก ์ถ์ถํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- text = "์ ์ฒด ํต๊ณ", + text = stringResource(id = R.string.total_statistics),
R.string.total_statistics
์ ํด๋นํ๋ ๋ฌธ์์ด ๋ฆฌ์์ค๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
๐งน Nitpick comments (3)
feature/home/src/main/java/team/retum/home/ui/HomeScreen.kt (1)
323-331
: ๊ณ ์ฉ ํํฉ ์์ธ ํ์ด์ง ์ด๋ ๋ฒํผ์ด ์ ๊ตฌํ๋์์ต๋๋ค.๊ธฐ์กด ํ ์คํธ ํ์ ๋ฐฉ์์์ ๋ฒํผ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ด ๊ฐ์ ๋์์ต๋๋ค. ๋ฒํผ ํ ์คํธ "ํํฉ ๋ณด๋ฌ ๊ฐ๊ธฐ ->"๊ฐ ๋ชฉ์ ์ ๋ช ํํ ํํํ๊ณ ์์ต๋๋ค.
ํ ๊ฐ์ง ์ ์ํ ์ ์ ๋ฒํผ ํ ์คํธ๋ฅผ ๊ตญ์ ํ(i18n)ํ๋ ๊ฒ์ ๋๋ค. ํ์ฌ ํ๋์ฝ๋ฉ๋ ๋ฌธ์์ด์ strings.xml ๋ฆฌ์์ค๋ก ์ด๋์ํค๋ฉด ๋ค๊ตญ์ด ์ง์์ด ์ฉ์ดํด์ง๋๋ค.
ํ ์คํธ ๋ฌธ์์ด์ ๋ฆฌ์์ค๋ก ์ด๋ํ๋ ๊ฒ์ด ์ข์ต๋๋ค:
- text = "ํํฉ ๋ณด๋ฌ ๊ฐ๊ธฐ ->", + text = stringResource(id = R.string.view_employment_status),strings.xml์ ๋ค์์ ์ถ๊ฐํ์ธ์:
<string name="view_employment_status">ํํฉ ๋ณด๋ฌ ๊ฐ๊ธฐ -></string>feature/employment/src/main/java/team/retum/employment/ui/EmploymentScreen.kt (2)
66-68
: ViewModel ํจ์ ํธ์ถ ๋ฐฉ์ ๊ฐ์ ํ์
with(employmentViewModel)
๋ธ๋ก์ ์ฌ์ฉํ๋ ๋์ ์ง์ ํธ์ถํ๋ ๊ฒ์ด ๋ ๊ฐ๊ฒฐํฉ๋๋ค.๋ค์๊ณผ ๊ฐ์ด ๋ฆฌํฉํ ๋งํ์ธ์:
LaunchedEffect(Unit) { animatedValue.animateTo( targetValue = rate, animationSpec = tween(durationMillis = 1000, easing = LinearEasing), ) - with(employmentViewModel) { - fetchEmploymentCount() - } + employmentViewModel.fetchEmploymentCount() }
318-319
: Surface์ modifier์ onClick ๋งค๊ฐ๋ณ์ ๊ฐ์ ํ์Surface์ modifier์ padding์ด ๋น์ด ์๊ณ , onClick ํจ์๊ฐ ์ง์ ์ ๋ฌ๋๊ณ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ํ์ธ์:
Surface( - modifier = Modifier.padding(), + modifier = Modifier, - onClick = onClassClick, + onClick = { onClassClick() }, color = JobisTheme.colors.inverseSurface, shape = RoundedCornerShape(8.dp), )
๐ Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
๐ Files selected for processing (8)
core/domain/src/main/java/team/retum/usecase/entity/application/EmploymentStatusEntity.kt
(1 hunks)core/network/src/main/java/team/retum/network/model/response/application/FetchEmploymentStatusResponse.kt
(1 hunks)feature/employment/build.gradle.kts
(1 hunks)feature/employment/src/main/java/team/retum/employment/navigation/EmploymentNavigation.kt
(1 hunks)feature/employment/src/main/java/team/retum/employment/ui/EmploymentDetailScreen.kt
(1 hunks)feature/employment/src/main/java/team/retum/employment/ui/EmploymentScreen.kt
(1 hunks)feature/employment/src/main/java/team/retum/employment/viewmodel/EmploymentDetailViewModel.kt
(1 hunks)feature/home/src/main/java/team/retum/home/ui/HomeScreen.kt
(11 hunks)
๐ง Files skipped from review as they are similar to previous changes (5)
- feature/employment/src/main/java/team/retum/employment/navigation/EmploymentNavigation.kt
- feature/employment/build.gradle.kts
- core/domain/src/main/java/team/retum/usecase/entity/application/EmploymentStatusEntity.kt
- core/network/src/main/java/team/retum/network/model/response/application/FetchEmploymentStatusResponse.kt
- feature/employment/src/main/java/team/retum/employment/viewmodel/EmploymentDetailViewModel.kt
โฐ Context from checks skipped due to timeout of 90000ms (2)
- GitHub Check: lint_and_build (build)
- GitHub Check: lint_and_build (lint)
๐ Additional comments (5)
feature/home/src/main/java/team/retum/home/ui/HomeScreen.kt (2)
23-23
: ํ์ํ import ๋ฌธ์ด ์ ์ ํ๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.์๋ก์ด ๋ฒํผ ์ปดํฌ๋ํธ์ ๊ด๋ จ ์คํ์ผ๋ง์ ์ํ import๊ฐ ์ ์ถ๊ฐ๋์์ต๋๋ค.
Also applies to: 39-39, 61-61, 63-63
83-83
: ์ปดํฌ๋ํธ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ํตํ ์ด๋ฒคํธ ์ ๋ฌ์ด ์ ๊ตฌํ๋์์ต๋๋ค.์์ ์ปดํฌ๋ํธ์์ ํ์ ์ปดํฌ๋ํธ๋ก
onEmploymentClick
์ฝ๋ฐฑ์ ์ ๋ฌํ๋ ํจํด์ด ์ผ๊ด๋๊ฒ ์ ์ฉ๋์์ต๋๋ค. ์ด๋ Compose์ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ ํจํด์ ์ ๋ฐ๋ฅด๊ณ ์์ผ๋ฉฐ, ์ฌ์ฉ์๊ฐ ๊ณ ์ฉ ํํฉ ์์ธ ํ์ด์ง๋ก ์ด๋ํ ์ ์๋ ๊ธฐ๋ฅ์ ํจ๊ณผ์ ์ผ๋ก ์ ๊ณตํฉ๋๋ค.Also applies to: 130-130, 154-154, 186-186, 228-228, 270-270, 309-309
feature/employment/src/main/java/team/retum/employment/ui/EmploymentScreen.kt (3)
58-58
: ์๋ฃ๋์ง ์์ TODO ์ฃผ์์ด ์์ต๋๋ค.๋ค๋น๊ฒ์ด์ ๊ด๋ จ TODO ์ฃผ์์ด ์๋ฃ๋์ง ์์์ต๋๋ค.
๋ค๋น๊ฒ์ด์ ๊ด๋ จ ์์ ์ด ์๋ฃ๋์๋์ง ํ์ธํ๊ณ , ํ์ํ ๊ฒฝ์ฐ TODO ์ฃผ์์ ์ ๊ฑฐํ์ธ์.
87-87
: ์๋ฃ๋์ง ์์ TODO ์ฃผ์์ด ์์ต๋๋ค.UI ํผ๋ธ๋ฆฌ์ฑ ๊ด๋ จ TODO ์ฃผ์์ด ์๋ฃ๋์ง ์์์ต๋๋ค.
UI ํผ๋ธ๋ฆฌ์ฑ ์์ ์ด ์๋ฃ๋์๋์ง ํ์ธํ๊ณ , ํ์ํ ๊ฒฝ์ฐ TODO ์ฃผ์์ ์ ๊ฑฐํ์ธ์.
218-247
: ํด๋์ค ๋ฒํผ ๋ก์ง ๊ฐ์ ํ์ํ์ฌ ๊ฐ ๋ฐ(1๋ฐ, 2๋ฐ, 3๋ฐ, 4๋ฐ)์ ๋ํ ๋ฒํผ์ด ํ๋์ฝ๋ฉ๋์ด ์์ต๋๋ค. ์ด๋ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ด๋ ต๊ณ ํ์ฅ์ฑ์ด ๋จ์ด์ง๋๋ค.
๋ฆฌ์คํธ์
forEach
๋๋forEachIndexed
๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค:- Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween, - ) { - ClassEmploymentButton( - onClassClick = onClassClick, - image = team.retum.design_system.R.drawable.ic_computer, - text = "1๋ฐ", - ) - ClassEmploymentButton( - onClassClick = onClassClick, - image = team.retum.design_system.R.drawable.ic_computer, - text = "2๋ฐ", - ) - } - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween, - ) { - ClassEmploymentButton( - onClassClick = onClassClick, - image = team.retum.design_system.R.drawable.ic_spanner, - text = "3๋ฐ", - ) - ClassEmploymentButton( - onClassClick = onClassClick, - image = team.retum.design_system.R.drawable.ic_robot, - text = "4๋ฐ", - ) - } + val classImages = listOf( + team.retum.design_system.R.drawable.ic_computer, + team.retum.design_system.R.drawable.ic_computer, + team.retum.design_system.R.drawable.ic_spanner, + team.retum.design_system.R.drawable.ic_robot + ) + + for (rowIndex in 0..1) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + for (colIndex in 0..1) { + val classIndex = rowIndex * 2 + colIndex + ClassEmploymentButton( + onClassClick = onClassClick, + image = classImages[classIndex], + text = "${classIndex + 1}๋ฐ", + ) + } + } + }
} | ||
} | ||
} | ||
} |
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.
CompanyIcon ํจ์๊ฐ ๋๋ฝ๋์์ต๋๋ค.
์ฝ๋์์ CompanyIcon ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง, ํจ์ ๊ตฌํ์ด ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด CompanyIcon ํจ์๋ฅผ ๊ตฌํํ์ธ์:
@Composable
fun CompanyIcon(
companyName: String,
logoUrl: String
) {
Column(
modifier = Modifier
.padding(8.dp)
.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
) {
AsyncImage(
model = logoUrl,
contentDescription = "$companyName ๋ก๊ณ ",
modifier = Modifier
.size(64.dp)
.clip(CircleShape),
contentScale = ContentScale.Crop,
placeholder = painterResource(id = R.drawable.ic_company_placeholder)
)
Spacer(modifier = Modifier.height(4.dp))
Text(
text = companyName,
style = MaterialTheme.typography.caption,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}
}
AsyncImage ์ฌ์ฉ์ ์ํด ๋ค์ import ๋ฌธ๋ ์ถ๊ฐํด์ผ ํฉ๋๋ค:
import coil.compose.AsyncImage
import coil.request.ImageRequest
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextOverflow
primaryColor: Color = JobisTheme.colors.secondaryContainer, | ||
secondaryColor: Color = JobisTheme.colors.onPrimary, | ||
) { | ||
val animatedValue = remember { Animatable(percentage) } |
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.
CircleProgress์์ ์ ๋๋ฉ์ด์ ๊ฐ์ด ์ฌ์ฌ์ฉ๋์ง ์์
CircleProgress
์ปดํฌ์ ๋ธ์์ percentage
ํ๋ผ๋ฏธํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ ๋๋ฉ์ด์
์ด ์์๋์ง ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด LaunchedEffect
๋ฅผ ์ถ๊ฐํ์ฌ percentage
๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ ๋๋ฉ์ด์
์ด ์์๋๋๋ก ์์ ํ์ธ์:
fun CircleProgress(
percentage: Float,
modifier: Modifier = Modifier,
radius: Dp = 120.dp,
strokeWidth: Dp = 25.dp,
primaryColor: Color = JobisTheme.colors.secondaryContainer,
secondaryColor: Color = JobisTheme.colors.onPrimary,
) {
val animatedValue = remember { Animatable(percentage) }
+
+ LaunchedEffect(percentage) {
+ animatedValue.animateTo(
+ targetValue = percentage,
+ animationSpec = tween(durationMillis = 1000, easing = LinearEasing)
+ )
+ }
๐ 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.
val animatedValue = remember { Animatable(percentage) } | |
fun CircleProgress( | |
percentage: Float, | |
modifier: Modifier = Modifier, | |
radius: Dp = 120.dp, | |
strokeWidth: Dp = 25.dp, | |
primaryColor: Color = JobisTheme.colors.secondaryContainer, | |
secondaryColor: Color = JobisTheme.colors.onPrimary, | |
) { | |
val animatedValue = remember { Animatable(percentage) } | |
LaunchedEffect(percentage) { | |
animatedValue.animateTo( | |
targetValue = percentage, | |
animationSpec = tween(durationMillis = 1000, easing = LinearEasing) | |
) | |
} | |
// ... rest of the composable code | |
} |
// splits.abi.isEnable = false | ||
// aaptOptions.cruncherEnabled = false | ||
// splits.density.isEnable = false | ||
// aaptOptions.cruncherEnabled = 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.
์ฃผ์์ ์ ๊ฑฐ ํด์ฃผ์ธ์
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.
xml ํ์์ผ๋ก ๋ฆฌ์์ค๊ฐ ๊นจ์ง์ง ์๋๋ค๋ฉด png ์ฌ์ฉ์ ์ง์ํด์ฃผ์ธ์.
png๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ผ์ ํฌ๊ธฐ๊ฐ ์ปค์ ธ ์ฑ ํฌ๊ธฐ์ ์ํฅ์ ์ค ์ ์์ด์.
} | ||
|
||
internal fun FetchEmploymentStatusResponse.toEntity() = EmploymentStatusEntity( | ||
classes = this.classes.map { it.toEntity() }, // TODO :: ์ด ๊ตฌ์กฐ ์ดํด ํ์ |
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.
todo ์ฃผ์์ ์ถํ์ ๋ฆฌํํ ๋ง์ด๋ ๋ณ๊ฒฝ๋ ์ฌํญ์ด ์๊ธธ ๊ฒฝ์ฐ์๋ง ๋ฌ์์ฃผ์ธ์ฉ
import team.retum.network.model.response.application.FetchEmploymentStatusResponse | ||
|
||
data class EmploymentStatusEntity( | ||
val classes: List<ClassEmploymentStatusEntity>, |
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.
๋ค์ด๋ฐ์ classes๋ก ํ์ ์ด์ ๊ฐ ์์๊น์?
private val applicationRepository: ApplicationRepository, | ||
) { | ||
suspend operator fun invoke() = runCatching { | ||
applicationRepository.fetchEmploymentStatus().toEntity() |
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.
์ด ๋ถ๋ถ์ ์ ์ฒด ๋ฆฌํํ ๋ง์ ํด์ผ ํ๋ ๋ถ๋ถ์ธ๋ฐ ๋๋ฉ์ธ ๋ ์ด์ด์์๋ ๋น์ค๋์ค ๋ก์ง๊ณผ ์บก์ํ์ ์ญํ ์ ๊ฐ์ง๊ณ ์์ด ๋งตํ ์์ ์ data ๋ ์ด์ด์์ ํ ์ ์๋๋ก ๋ณ๊ฒฝํ ์์ ์ ๋๋ค. ์ฐธ๊ณ ํด์ฃผ์ธ์.
modifier = Modifier | ||
.wrapContentSize() | ||
.background(Color.Transparent) | ||
.fillMaxWidth(0.4f), |
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.
0.4f๋ ์ ์ฌ์ฉํ์ ๊ฑด๊ฐ์?
@@ -17,7 +17,7 @@ firebase-messaging = "23.4.1" | |||
|
|||
hilt-android-gradle-plugin = "2.51.1" | |||
junit = "4.13.2" | |||
android-gradle = "8.2.2" | |||
android-gradle = "8.7.0" |
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.
Gradle ๋ฒ์ ์ ๊ทธ๋ ์ด๋ ํ์ ์ด์ ๊ฐ ๋ฌด์์ธ๊ฐ์?
androidx-tiles-tooling-preview = { group = "androidx.wear.tiles", name = "tiles-tooling-preview", version.ref = "tiles-tooling-preview" } | ||
androidx-ui-tooling-preview-android = { group = "androidx.compose.ui", name = "ui-tooling-preview-android", version.ref = "ui-tooling-preview-android" } |
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.
preview๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋๋ฐ ์ถ๊ฐํ์ ์ด์ ๊ฐ ๋ฌด์์ธ๊ฐ์?
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip | ||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip | ||
networkTimeout=10000 | ||
validateDistributionUrl=true |
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.
์ด๊ฑธ ์ถ๊ฐํ๋ฉด ์ด๋ค๊ฒ๋ค์ด ๋ณ๊ฒฝ์ด ๋๋์?
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.
์ด ํ์ผ์ ์์ ํ์ ์ด์ ๊ฐ ๋ฌด์์ด๊ณ ์ด๋ค๊ฒ๋ค์ด ๋ณ๊ฒฝ๋๋๊ฑด๊ฐ์?
๊ฐ์
์์ ๋ด์ฉ
ํ ๋ง
Summary by CodeRabbit
์๋ก์ด ๊ธฐ๋ฅ
Chores