-
Notifications
You must be signed in to change notification settings - Fork 0
๐ :: (#462) ๊ด์ฌ ๋ถ์ผ ์ ํ ๊ธฐ๋ฅ ๊ตฌํ #465
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
๐ :: (#462) ๊ด์ฌ ๋ถ์ผ ์ ํ ๊ธฐ๋ฅ ๊ตฌํ #465
The head ref may contain hidden characters: "feature/462-\uAD00\uC2EC-\uBD84\uC57C-\uC120\uD0DD-\uAE30\uB2A5-\uAD6C\uD604"
Conversation
โฆ feature/462-๊ด์ฌ-๋ถ์ผ-์ ํ-๊ธฐ๋ฅ-๊ตฌํ
|
""" Walkthrough์ด ๋ณ๊ฒฝ ์ฌํญ์ ๊ด์ฌ์ฌ(Interests) ๊ธฐ๋ฅ์ ์ ์ฒด์ ์ธ ๋๋ฉ์ธ, ๋ฐ์ดํฐ, ๋คํธ์ํฌ, UI ๊ณ์ธต์ ์ ๊ท๋ก ๋์ ํ๊ณ , ๊ด์ฌ์ฌ ์ค์ ์๋ฃ ํ๋ฉด ๋ฐ ๋ด๋น๊ฒ์ด์ ์ ์ถ๊ฐํฉ๋๋ค. ๊ด์ฌ์ฌ ๊ด๋ จ ์ํฐํฐ, ๋ฆฌํฌ์งํ ๋ฆฌ, ๋ฐ์ดํฐ์์ค, API, UI ์ปดํฌ์ ๋ธ, ๋ทฐ๋ชจ๋ธ, ๋ฌธ์์ด ๋ฐ ๋์์ธ ๋ฆฌ์์ค๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant MyPageScreen
participant Navigator
participant InterestsScreen
participant InterestsViewmodel
participant Repository
participant DataSource
participant API
User->>MyPageScreen: "๊ด์ฌ ๋ถ์ผ" ํด๋ฆญ
MyPageScreen->>Navigator: onSelectInterestClick()
Navigator->>InterestsScreen: navigateToInterests()
InterestsScreen->>InterestsViewmodel: ์ด๊ธฐํ
InterestsViewmodel->>Repository: fetchInterests()
Repository->>DataSource: fetchInterests()
DataSource->>API: GET /interests
API-->>DataSource: ๊ด์ฌ์ฌ ๋ฐ์ดํฐ ๋ฐํ
DataSource-->>Repository: ๋ฐ์ดํฐ ๋ฐํ
Repository-->>InterestsViewmodel: ๋ฐ์ดํฐ ๋ฐํ
InterestsViewmodel-->>InterestsScreen: ์ํ ์
๋ฐ์ดํธ
User->>InterestsScreen: ๊ด์ฌ์ฌ ์ ํ & ์๋ฃ ๋ฒํผ ํด๋ฆญ
InterestsScreen->>InterestsViewmodel: patchInterestsMajor()
InterestsViewmodel->>Repository: setInterestsToggle()
Repository->>DataSource: setInterestsToggle()
DataSource->>API: PATCH /interests
API-->>DataSource: ์ฑ๊ณต/์คํจ ์๋ต
DataSource-->>Repository: ์๋ต ๋ฐํ
Repository-->>InterestsViewmodel: ์๋ต ๋ฐํ
InterestsViewmodel-->>InterestsScreen: ์ฑ๊ณต ์ MoveToInterestsComplete SideEffect
InterestsScreen->>Navigator: navigateToInterestsComplete(studentName)
Suggested reviewers
Poem
๐ Recent review detailsConfiguration used: CodeRabbit UI ๐ Files selected for processing (1)
๐ง Files skipped from review as they are similar to previous changes (1)
โฐ Context from checks skipped due to timeout of 90000ms (2)
โจ Finishing Touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. ๐ชง TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. 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: 5
๐งน Nitpick comments (13)
core/network/src/main/java/team/retum/network/datasource/interests/InterestsDataSource.kt (1)
8-8: ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ์ข ๋ ๋ช ํํ๊ฒ ํ๋ ๊ฒ์ด ์ข๊ฒ ์ต๋๋ค.
codes๋ผ๋ ํ๋ผ๋ฏธํฐ ์ด๋ฆ๋ณด๋ค๋request๋๋toggleRequest์ ๊ฐ์ด ์ข ๋ ๋ช ํํ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ํฅ์๋ ๊ฒ์ ๋๋ค.- suspend fun setInterestsToggle(codes: InterestsToggleRequest) + suspend fun setInterestsToggle(request: InterestsToggleRequest)core/data/src/main/java/team/retum/data/repository/interests/InterestsRepository.kt (2)
9-10: Repository๊ฐ ๋คํธ์ํฌ ๋ชจ๋ธ์ ์ง์ ๋ฐํํฉ๋๋ค.์ผ๋ฐ์ ์ผ๋ก Repository๋ ๋คํธ์ํฌ ๋ชจ๋ธ์ ๋๋ฉ์ธ ์ํฐํฐ๋ก ๋ณํํ์ฌ ๋ฐํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํ์ฌ ๊ตฌํ์์๋ UseCase์์ ๋ณํ ์์ ์ ์ํํ๊ณ ์์ง๋ง, ์ด ์ฑ ์์ Repository๋ก ์ด๋ํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
- suspend fun fetchInterests(): FetchInterestsResponse - suspend fun fetchInterestsSearchRecruitments(): FetchInterestsRecruitmentsResponse + suspend fun fetchInterests(): InterestsEntity + suspend fun fetchInterestsSearchRecruitments(): InterestsRecruitmentsEntity
8-8: ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ์ข ๋ ๋ช ํํ๊ฒ ํ๋ ๊ฒ์ด ์ข๊ฒ ์ต๋๋ค.
codes๋์request๋๋toggleRequest์ ๊ฐ์ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ์ฝ๋ ๊ฐ๋ ์ฑ์ด ํฅ์๋ ๊ฒ์ ๋๋ค.- suspend fun setInterestsToggle(codes: InterestsToggleRequest) + suspend fun setInterestsToggle(request: InterestsToggleRequest)core/network/src/main/java/team/retum/network/api/InterestsApi.kt (1)
13-15: ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ์ข ๋ ๋ช ํํ๊ฒ ํ๋ ๊ฒ์ด ์ข๊ฒ ์ต๋๋ค.
codes๋์request๋๋toggleRequest์ ๊ฐ์ ์ข ๋ ๋ช ํํ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ์ฝ๋ ๊ฐ๋ ์ฑ์ด ํฅ์๋ ๊ฒ์ ๋๋ค.- suspend fun setInterestsToggle( - @Body codes: InterestsToggleRequest, - ) + suspend fun setInterestsToggle( + @Body request: InterestsToggleRequest, + )feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsCompleteScreen.kt (3)
46-49: ๋ฌธ์์ด ๋ฆฌ์์ค ์ฌ์ฉ ๊ถ์ฅTopAppBar์ ํ์ดํ์ ํ๋์ฝ๋ฉ๋ ๋ฌธ์์ด "๊ด์ฌ ๋ถ์ผ ์ค์ "์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ธ์ด ์ง์๊ณผ ์ผ๊ด์ฑ์ ์ํด strings.xml์ ๋ฆฌ์์ค(R.string.set_interests)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ ํฉํ ๊ฒ ๊ฐ์ต๋๋ค.
- title = "๊ด์ฌ ๋ถ์ผ ์ค์ ", + title = stringResource(R.string.set_interests),
51-54: ๋ ๋ช ํํ contentDescription ๊ถ์ฅ์ด๋ฏธ์ง์ contentDescription์ด "major_check_success"๋ก ๋์ด ์๋๋ฐ, ์ด๋ ์ ๊ทผ์ฑ ์ธก๋ฉด์์ ์ด๋ฏธ์ง์ ๋ชฉ์ ์ ๋ช ํํ ์ค๋ช ํ์ง ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๊ด์ฌ ๋ถ์ผ ์ ํ์ ์๋ฃํ์์ ๋ํ๋ด๋ ๋ ์ค๋ช ์ ์ธ ํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- contentDescription = "major_check_success", + contentDescription = "๊ด์ฌ ๋ถ์ผ ์ ํ ์๋ฃ ์ฑ๊ณต ์์ด์ฝ",
50-76: ํ๋์ฝ๋ฉ๋ ํจ๋ฉ ๊ฐUI ์์์ ํ๋์ฝ๋ฉ๋ dp ๊ฐ๋ค(188.dp, 20.dp ๋ฑ)์ด ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. ์ผ๊ด๋ ๋์์ธ ์์คํ ์ ์ํด ์ด๋ฌํ ๊ฐ๋ค์ dimens.xml ํ์ผ์ด๋ ๋์์ธ ์์คํ ์ ์ ์๋ ์์๋ก ์ถ์ถํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
core/network/src/main/java/team/retum/network/datasource/interests/InterestsDataSourceImpl.kt (2)
19-23: ๋ฐํ ์คํ์ผ ๊ฐ์ํ ๊ฒํ์ฝ๋๊ฐ ๊ธฐ๋ฅ์ ์ผ๋ก๋ ์๋ฒฝํ์ง๋ง, ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ํํ ์๋ ์์ต๋๋ค:
- override suspend fun fetchInterests(): FetchInterestsResponse { - return RequestHandler<FetchInterestsResponse>().request { - interestsApi.fetchInterests() - } - } + override suspend fun fetchInterests(): FetchInterestsResponse = + RequestHandler<FetchInterestsResponse>().request { + interestsApi.fetchInterests() + }
25-29: ๋ฐํ ์คํ์ผ ๊ฐ์ํ ๊ฒํ์์ ์ฝ๋ฉํธ์ ๋์ผํ๊ฒ, ์ฌ๊ธฐ๋ ๊ฐ์ํํ ์ ์์ต๋๋ค:
- override suspend fun fetchInterestsSearchRecruitments(): FetchInterestsRecruitmentsResponse { - return RequestHandler<FetchInterestsRecruitmentsResponse>().request { - interestsApi.fetchInterestsSearchRecruitments() - } - } + override suspend fun fetchInterestsSearchRecruitments(): FetchInterestsRecruitmentsResponse = + RequestHandler<FetchInterestsRecruitmentsResponse>().request { + interestsApi.fetchInterestsSearchRecruitments() + }core/domain/src/main/java/team/retum/usecase/entity/interests/InterestsEntity.kt (1)
11-16: ์ค์ฒฉ ์ํฐํฐ์๋@Immutable์ด๋ ธํ ์ด์ ์ ๋ถ์ฌํด ์ฃผ์ธ์
InterestsEntity๋ณธ์ฒด์๋@Immutable์ด ๋ฌ๋ ค ์์ง๋ง, ๋ด๋ถInterestMajorEntity์๋ ๋ฌ๋ ค ์์ง ์์ต๋๋ค.
Compose ์ํ๊ฐ ์ด ๊ฐ์ฒด๊น์ง ๊ด์ฐฐํ๊ฒ ๋ ๊ฒฝ์ฐ, ์ค์ฒฉ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ์ปดํ์ผ๋ฌ๊ฐ ์ถ์ ํ์ง ๋ชปํด ๋ถํ์ํ ์ฌ๊ตฌ์ฑ์ ์ ๋ฐํ ์ ์์ต๋๋ค. ๋์ผํ ๋ถ๋ณ์ฑ ๊ณ์ฝ์ ๋ช ํํ ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํ๋ ํธ์ด ์์ ํฉ๋๋ค.data class InterestsEntity( ... ) { - data class InterestMajorEntity( + @Immutable + data class InterestMajorEntity( val id: Int,feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsScreen.kt (1)
60-69: ๋ฒํผ ์ํ ๊ณ์ฐ ๋ก์ง์ UI โ ViewModel ๋ก ์ด๋ํ๋ TODO ์ฒ๋ฆฌ ๊ถ์ฅ
selectedMajorCount,buttonEnable,buttonText๊ณ์ฐ์ ์์ ์ํ ํ์๊ฐ์ ๋๋ค.
ํ์ฌ TODO ๋ก ๋จ๊ฒจ๋์ ๊ฒ์ฒ๋ผ ViewModel ๋๋InterestsState๋ด์์val๋ก ์ ๊ณตํ๋ฉด UI ๋จ๊ณ์ ์ฑ ์์ด ์ค์ด๋ค๊ณ , ํ ์คํธ๋ ์ฌ์์ง๋๋ค.feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsViewmodel.kt (2)
3-3: ์ฌ์ฉ๋์ง ์๋ import ์ ๊ฑฐ
android.util.Log๋ ํ์ผ ๋ด์์ ์ฐ์ด์ง ์์ ๋น๋ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ญ์ ํด ์ฃผ์ธ์.
84-99:selectedMajorId์ ์ง ๋ฐฉ์์ด ํด์ ํ์๋ ๊ฐ์ ๋จ๊น๋๋คํ ๊ธ ํด์ ์์๋
selectedMajorId = majorId๋ก ๋ฎ์ด์ฐ๋ฉด, UI ๋จ์์ โ๋ง์ง๋ง ํด๋ฆญ ์ ๊ณตโ์ด ํญ์ ์ค์ ๋์ด ์์ต๋๋ค.
์ด ๊ฐ์ด ๋ค๋ฅธ ๋ก์ง์ ํ์ฉ๋ ๊ณํ์ด ์๋ค๋ฉด ์ญ์ ํ๊ฑฐ๋, ํด์ ์0์ผ๋ก ์ด๊ธฐํํ๋ ํธ์ด ๋ช ํํฉ๋๋ค.- setState { - state.value.copy( - selectedMajorId = majorId, - selectedMajorCodes = currentSelected, - ) - } + setState { + state.value.copy( + selectedMajorId = if (currentSelected.contains(majorId)) majorId else 0, + selectedMajorCodes = currentSelected, + ) + }
๐ Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
๐ Files selected for processing (32)
app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt(2 hunks)app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt(2 hunks)core/common/src/main/java/team/retum/common/utils/ResourceKeys.kt(1 hunks)core/data/src/main/java/team/retum/data/di/RepositoryModule.kt(2 hunks)core/data/src/main/java/team/retum/data/repository/interests/InterestsRepository.kt(1 hunks)core/data/src/main/java/team/retum/data/repository/interests/InterestsRepositoryImpl.kt(1 hunks)core/design-system/src/main/res/drawable/success.xml(1 hunks)core/domain/src/main/java/team/retum/usecase/entity/interests/InterestsEntity.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/entity/interests/InterestsRecruitmentEntity.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/usecase/interests/FetchInterestsSearchRecruitmentsUseCase.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/usecase/interests/FetchInterestsUseCase.kt(1 hunks)core/domain/src/main/java/team/retum/usecase/usecase/interests/SetInterestsToggleUseCase.kt(1 hunks)core/network/build.gradle.kts(1 hunks)core/network/src/main/java/team/retum/network/api/InterestsApi.kt(1 hunks)core/network/src/main/java/team/retum/network/datasource/interests/InterestsDataSource.kt(1 hunks)core/network/src/main/java/team/retum/network/datasource/interests/InterestsDataSourceImpl.kt(1 hunks)core/network/src/main/java/team/retum/network/di/NetworkModule.kt(2 hunks)core/network/src/main/java/team/retum/network/di/RemoteDataSourceModule.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/request/interests/InterestsToggleRequest.kt(1 hunks)core/network/src/main/java/team/retum/network/model/response/interests/FetchInterestsRecruitmentsResponse.kt(1 hunks)core/network/src/main/java/team/retum/network/model/response/interests/FetchInterestsResponse.kt(1 hunks)feature/interests/build.gradle.kts(1 hunks)feature/interests/src/main/java/team/retum/jobis/interests/navigation/InterestsCompleteNavigation.kt(1 hunks)feature/interests/src/main/java/team/retum/jobis/interests/navigation/InterestsNavigation.kt(1 hunks)feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsCompleteScreen.kt(1 hunks)feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsScreen.kt(2 hunks)feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsCompleteViewModel.kt(1 hunks)feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsViewmodel.kt(1 hunks)feature/interests/src/main/res/values/strings.xml(1 hunks)feature/mypage/src/main/java/team/retum/jobis/navigation/MyPageNavigation.kt(1 hunks)feature/mypage/src/main/java/team/retum/jobis/ui/MyPageScreen.kt(1 hunks)
๐งฐ Additional context used
๐งฌ Code Graph Analysis (5)
feature/interests/build.gradle.kts (1)
buildSrc/src/main/kotlin/GradlePluginExtensions.kt (1)
implementation(15-17)
app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt (2)
feature/interests/src/main/java/team/retum/jobis/interests/navigation/InterestsNavigation.kt (1)
interests(9-19)feature/interests/src/main/java/team/retum/jobis/interests/navigation/InterestsCompleteNavigation.kt (1)
interestsComplete(12-28)
feature/interests/src/main/java/team/retum/jobis/interests/navigation/InterestsNavigation.kt (1)
feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsScreen.kt (1)
Interests(35-50)
feature/interests/src/main/java/team/retum/jobis/interests/navigation/InterestsCompleteNavigation.kt (1)
feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsCompleteScreen.kt (1)
InterestsComplete(26-35)
feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsCompleteScreen.kt (1)
core/design-system/src/main/java/team/retum/jobisdesignsystemv2/appbar/JobisTopAppBar.kt (1)
JobisSmallTopAppBar(124-144)
โฐ Context from checks skipped due to timeout of 90000ms (2)
- GitHub Check: lint_and_build (build)
- GitHub Check: lint_and_build (lint)
๐ Additional comments (37)
feature/interests/build.gradle.kts (1)
24-24: ๋คํธ์ํฌ ๋ชจ๋ ์์กด์ฑ ์ถ๊ฐ๊ฐ ์ ์ ํฉ๋๋ค.๊ด์ฌ ๋ถ์ผ ๊ธฐ๋ฅ ๊ตฌํ์ ์ํด core:network ๋ชจ๋์ ๋ํ ์์กด์ฑ์ ์ถ๊ฐํ ๊ฒ์ด ์ ์ ํฉ๋๋ค. ์ด๋ ๊ด์ฌ ๋ถ์ผ ๊ด๋ จ API ํธ์ถ ๊ธฐ๋ฅ์ ํ์ฉํ๊ธฐ ์ํด ํ์ํ ์ค์ ์ ๋๋ค.
core/common/src/main/java/team/retum/common/utils/ResourceKeys.kt (1)
25-25: ๋ค๋น๊ฒ์ด์ ํค ์ถ๊ฐ๊ฐ ์ ์ ํฉ๋๋ค.
STUDENT_NAME์์๋ฅผ ์ถ๊ฐํ์ฌ ๊ด์ฌ ๋ถ์ผ ์ค์ ์๋ฃ ํ๋ฉด์ผ๋ก ํ์ ์ด๋ฆ์ ์ ๋ฌํ๊ธฐ ์ํ ๋ค๋น๊ฒ์ด์ ์ธ์๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์์๋ก ๊ด๋ฆฌํ๋ฉด ์คํ ๋ฐฉ์ง์ ์ ์ง๋ณด์์ ๋์์ด ๋ฉ๋๋ค.core/network/build.gradle.kts (1)
35-35: ๊ฐ๋ฐ ์๋ฒ URL ์ ๋ฐ์ดํธ๊ฐ ์ ์ ํฉ๋๋ค.๊ฐ๋ฐ ์๋ฒ URL์ ๋ช ์์ ์ผ๋ก ์ค์ ํ์ฌ ๊ด์ฌ ๋ถ์ผ ๊ด๋ จ API๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํธ์ถํ ์ ์๋๋ก ํ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ก์ปฌ ์์ฑ ํ์ผ์์ ๊ฐ์ ์ง์ ํ์ง ์์๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
core/design-system/src/main/res/drawable/success.xml (1)
1-9: ์ฑ๊ณต ์ํ๋ฅผ ๋ํ๋ด๋ ์์ด์ฝ ๋ฆฌ์์ค ์ถ๊ฐ๊ฐ ์ ์ ํฉ๋๋ค.๊ด์ฌ ๋ถ์ผ ์ค์ ์๋ฃ ํ๋ฉด์์ ์ฌ์ฉํ ์ฒดํฌ๋งํฌ ์์ด์ฝ์ ๋ฒกํฐ ๋๋ก์ด๋ธ๋ก ์ถ๊ฐํ ๊ฒ์ด ์ข์ต๋๋ค. ์ฒดํฌ๋งํฌ์ ์ํ์ ์กฐํฉ์ ์์ ์๋ฃ๋ฅผ ์๊ฐ์ ์ผ๋ก ์ ๋ํ๋ ๋๋ค.
๋ค๋ง, ์์ด์ฝ์ ์์(#2F53FF)์ด ์ฑ์ ๋์์ธ ์์คํ ๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋์์ธ ์์คํ ์์ ์ ์๋ ๊ธฐ๋ณธ ์์ ๊ฐ๊ณผ ์ผ์นํ๋์ง ํ์ธํด๋ณด์ธ์.
core/network/src/main/java/team/retum/network/di/NetworkModule.kt (2)
25-25: InterestsApi ์ํฌํธ ์ถ๊ฐ๊ฐ ์ ์ ํฉ๋๋ค.๊ด์ฌ ๋ถ์ผ ๊ธฐ๋ฅ ๊ตฌํ์ ์ํด ์๋ก ์์ฑ๋ InterestsApi ์ธํฐํ์ด์ค๋ฅผ ์ํฌํธํ๋ ๊ฒ์ด ์ ์ ํฉ๋๋ค.
193-197: InterestsApi ์ ๊ณต ๋ฉ์๋ ์ถ๊ฐ๊ฐ ์ ์ ํฉ๋๋ค.Retrofit์ ํตํด InterestsApi ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ ๊ณตํ๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ๊ฒ์ด ์ ์ ํฉ๋๋ค. ์ด๋ Hilt ์์กด์ฑ ์ฃผ์ ์์คํ ์ ํตํด ๊ด์ฌ ๋ถ์ผ ๊ด๋ จ API๋ฅผ ์ฑ ์ ์ฒด์์ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
๊ธฐ์กด API ์ ๊ณต ๋ฉ์๋๋ค๊ณผ ๋์ผํ ํจํด์ ๋ฐ๋ฅด๊ณ ์์ด ์ผ๊ด์ฑ์ด ์ ์ง๋์์ต๋๋ค.
app/src/main/java/team/retum/jobisandroidv2/JobisNavigator.kt (2)
19-20: ์๋ก์ด ๊ด์ฌ ๋ถ์ผ ์๋ฃ ํ๋ฉด ๋ค๋น๊ฒ์ด์ ์ํฌํธ ์ถ๊ฐ๋จ๊ด์ฌ ๋ถ์ผ ์๋ฃ ํ๋ฉด์ผ๋ก ์ด๋ํ๊ธฐ ์ํ ๋ค๋น๊ฒ์ด์ ๊ธฐ๋ฅ ์ํฌํธ๊ฐ ์ ์ ํ ์ถ๊ฐ๋์์ต๋๋ค.
109-111: ์๋ก์ด ๊ด์ฌ ๋ถ์ผ ์๋ฃ ํ๋ฉด ๋ค๋น๊ฒ์ด์ ํจ์ ๊ตฌํ
navigateToInterestsCompleteํจ์๊ฐ ์ ์ ํ ๊ตฌํ๋์์ต๋๋ค. ํ์ ์ด๋ฆ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ์๋ฃ ํ๋ฉด์ ์ ๋ฌํ๋ ๋ฐฉ์์ด ๊ธฐ์กด ๋ค๋น๊ฒ์ด์ ํจํด์ ์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.feature/mypage/src/main/java/team/retum/jobis/ui/MyPageScreen.kt (1)
238-238: ๊ด์ฌ ๋ถ์ผ ๊ธฐ๋ฅ ํ์ฑํ๊ธฐ์กด์ "์ ๋ฐ์ดํธ ์์ " ํ ์คํธ ๋ฉ์์ง๋ฅผ ํ์ํ๋ ๊ฒ์์ ์ค์ ๊ด์ฌ ๋ถ์ผ ์ ํ ํ๋ฉด์ผ๋ก ์ด๋ํ๋ ๊ธฐ๋ฅ์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. ์ด์ ์ฌ์ฉ์๊ฐ ๊ด์ฌ ๋ถ์ผ๋ฅผ ์ ํํ ์ ์๊ฒ ๋์์ต๋๋ค.
core/network/src/main/java/team/retum/network/di/RequestUrls.kt (1)
137-142: ๊ด์ฌ ๋ถ์ผ API ์๋ํฌ์ธํธ ์ถ๊ฐ์๋ก์ด ๊ด์ฌ ๋ถ์ผ ๊ธฐ๋ฅ์ ์ํ API ์๋ํฌ์ธํธ๊ฐ ์ ์ ํ ์ถ๊ฐ๋์์ต๋๋ค. ๊ธฐ์กด์ URL ๊ตฌ์กฐ ํจํด์ ์ ๋ฐ๋ฅด๊ณ ์์ผ๋ฉฐ, ๊ด์ฌ ๋ถ์ผ API(
interests)์ ๊ด์ฌ ๋ถ์ผ ๊ด๋ จ ์ฑ์ฉ ์ ๋ณด API(interestsRecruitments)์ ๋ํ ์๋ํฌ์ธํธ๊ฐ ์ ์๋์์ต๋๋ค.core/data/src/main/java/team/retum/data/di/RepositoryModule.kt (2)
25-26: ๊ด์ฌ ๋ถ์ผ ๋ฆฌํฌ์งํ ๋ฆฌ ์ธํฐํ์ด์ค ๋ฐ ๊ตฌํ์ฒด ์ํฌํธ๊ด์ฌ ๋ถ์ผ ๊ธฐ๋ฅ์ ์ํ ๋ฆฌํฌ์งํ ๋ฆฌ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๊ฐ ์ ์ ํ ์ํฌํธ๋์์ต๋๋ค.
110-112: ๊ด์ฌ ๋ถ์ผ ๋ฆฌํฌ์งํ ๋ฆฌ ์์กด์ฑ ์ฃผ์ ์ค์ Dagger Hilt๋ฅผ ์ฌ์ฉํ์ฌ
InterestsRepository์ธํฐํ์ด์ค์InterestsRepositoryImpl๊ตฌํ์ฒด๋ฅผ ๋ฐ์ธ๋ฉํ๋ ์ฝ๋๊ฐ ์ ์ ํ ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฑ ์ ์ฒด์์InterestsRepository๋ฅผ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ต๋๋ค.core/network/src/main/java/team/retum/network/di/RemoteDataSourceModule.kt (1)
25-26: ์๋ก์ด ๊ด์ฌ ๋ถ์ผ ๊ธฐ๋ฅ์ ๋ํ ๋ฐ์ดํฐ ์์ค ์ถ๊ฐ๊ฐ ์ ์ํ๋์์ต๋๋ค.
InterestsDataSource์ธํฐํ์ด์ค์ ๊ทธ ๊ตฌํ์ฒด์ธInterestsDataSourceImpl์ ๋ํ ๋ฐ์ธ๋ฉ์ด ๋ค๋ฅธ ๋ฐ์ดํฐ ์์ค๋ค๊ณผ ๋์ผํ ํจํด์ผ๋ก ์ ์ ํ๊ฒ ์ถ๊ฐ๋์์ต๋๋ค. ์์กด์ฑ ์ฃผ์ ์ค์ ์ด ์ผ๊ด์ฑ ์๊ฒ ๊ตฌํ๋์ด ์์ต๋๋ค.Also applies to: 110-112
feature/interests/src/main/java/team/retum/jobis/interests/navigation/InterestsNavigation.kt (1)
9-12: ๋ค๋น๊ฒ์ด์ ์ฝ๋ฐฑ ํ๋ผ๋ฏธํฐ ์ถ๊ฐ๊ฐ ์ ์ ํ ์ด๋ฃจ์ด์ก์ต๋๋ค.๊ด์ฌ ๋ถ์ผ ์๋ฃ ํ๋ฉด์ผ๋ก ์ด๋ํ๊ธฐ ์ํ
navigateToInterestsComplete์ฝ๋ฐฑ ํ๋ผ๋ฏธํฐ๊ฐ ์ ์ถ๊ฐ๋์์ต๋๋ค.Interests์ปดํฌ์ ๋ธ์ ํด๋น ์ฝ๋ฐฑ์ ์ ๋ฌํ์ฌ ํ์ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ์๋ฃ ํ๋ฉด์ผ๋ก ๋ค๋น๊ฒ์ด์ ํ๋ ํ๋ฆ์ด ๋ช ํํ๊ฒ ๊ตฌํ๋์์ต๋๋ค.Also applies to: 14-17
core/network/src/main/java/team/retum/network/model/request/interests/InterestsToggleRequest.kt (1)
6-9: ๊ด์ฌ ๋ถ์ผ ํ ๊ธ์ ์ํ ์์ฒญ ๋ชจ๋ธ์ด ์ ์ ํ ๊ตฌํ๋์์ต๋๋ค.
InterestsToggleRequest๋ฐ์ดํฐ ํด๋์ค๋ ์ฌ์ฉ์ ๊ด์ฌ ๋ถ์ผ ์ฝ๋ ID ๋ชฉ๋ก์ JSON์ผ๋ก ์ง๋ ฌํํ๊ธฐ ์ํ Moshi ์ด๋ ธํ ์ด์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋์ด ์์ต๋๋ค. JSON ํ๋๋ช ๋งคํ์ ์ํ@Json(name = "code_ids")์ด๋ ธํ ์ด์ ๋ ์ ์ ํ๊ฒ ์ฌ์ฉ๋์์ต๋๋ค.core/domain/src/main/java/team/retum/usecase/usecase/interests/FetchInterestsSearchRecruitmentsUseCase.kt (1)
7-12: ๊ด์ฌ ๋ถ์ผ ๊ธฐ๋ฐ ์ฑ์ฉ ์ ๋ณด ์กฐํ ์ ์ค์ผ์ด์ค๊ฐ ํด๋ฆฐ ์ํคํ ์ฒ ์์น์ ๋ง๊ฒ ๊ตฌํ๋์์ต๋๋ค.์ด ์ ์ค์ผ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค:
- ์์กด์ฑ ์ฃผ์ ์ ํตํด
InterestsRepository์ ๋ํ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ท์ต๋๋ค.runCatching์ ์ฌ์ฉํ์ฌ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ ์ ํ ๊ตฌํํ์ต๋๋ค.toEntity()ํ์ฅ ํจ์๋ฅผ ํตํด ๋คํธ์ํฌ ์๋ต ๋ชจ๋ธ์ ๋๋ฉ์ธ ์ํฐํฐ๋ก ๋ณํํ๋ ์ฑ ์์ ๋ช ํํ ๋ถ๋ฆฌํ์ต๋๋ค.์ด๋ฌํ ๊ตฌํ์ ์ฑ์ ๋ค๋ฅธ ์ ์ค์ผ์ด์ค๋ค๊ณผ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉฐ, ๋จ์ผ ์ฑ ์ ์์น์ ์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
feature/mypage/src/main/java/team/retum/jobis/navigation/MyPageNavigation.kt (1)
33-39: ๋ง์ดํ์ด์ง ๋ค๋น๊ฒ์ด์ ๊ฐ์ ํ์ธ๋ค๋น๊ฒ์ด์ ์ต์ ์ ์ถ๊ฐํ์ฌ ์ํ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํ ๊ฒ์ ์ข์ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
saveState,launchSingleTop,restoreState์ต์ ์ ํตํด ์ฌ์ฉ์๊ฐ ๋ง์ดํ์ด์ง๋ก ์ด๋ํ ๋ ์ํ๋ฅผ ๋ณด์กดํ๊ณ ์ค๋ณต ์ธ์คํด์ค ์์ฑ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.core/domain/src/main/java/team/retum/usecase/usecase/interests/SetInterestsToggleUseCase.kt (1)
1-13: ๊ด์ฌ ๋ถ์ผ ํ ๊ธ ์ ์ค์ผ์ด์ค ๊ตฌํ ํ์ธํด๋ฆฐ ์ํคํ ์ฒ ์์น์ ์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค. ๋จ์ผ ์ฑ ์์ ๊ฐ์ง ์ ์ค์ผ์ด์ค๋ก ์ ์ ํ ๊ตฌํ๋์์ผ๋ฉฐ, ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ํ
runCatching๋ธ๋ก ์ฌ์ฉ์ ์ข์ ๋ฐฉ์์ ๋๋ค.app/src/main/java/team/retum/jobisandroidv2/navigation/MainNavigation.kt (2)
13-13: ๊ด์ฌ ๋ถ์ผ ์๋ฃ ํ๋ฉด ์ํฌํธ ์ถ๊ฐ ํ์ธ๊ด์ฌ ๋ถ์ผ ์๋ฃ ํ๋ฉด์ ๋ค๋น๊ฒ์ด์ ์ ์ํ ์ํฌํธ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
79-85: ๊ด์ฌ ๋ถ์ผ ๊ด๋ จ ๋ค๋น๊ฒ์ด์ ์ถ๊ฐ ํ์ธ๊ด์ฌ ๋ถ์ผ ์ค์ ํ๋ฉด๊ณผ ์๋ฃ ํ๋ฉด์ ๋ํ ๋ค๋น๊ฒ์ด์ ์ด ์ ์ ํ๊ฒ ์ถ๊ฐ๋์์ต๋๋ค. ์ฝ๋๊ฐ ์ ๊ตฌ์กฐํ๋์ด ์๊ณ ํ์ํ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌํ๊ณ ์์ต๋๋ค.
core/network/src/main/java/team/retum/network/model/response/interests/FetchInterestsResponse.kt (1)
1-17: ๊ด์ฌ ๋ถ์ผ ์๋ต ๋ชจ๋ธ ๊ตฌํ ํ์ธAPI ์๋ต์ ์ํ ๋ฐ์ดํฐ ํด๋์ค๊ฐ ์ ์ ํ๊ฒ ๊ตฌํ๋์์ต๋๋ค. Moshi ์ด๋ ธํ ์ด์ ์ ํตํ JSON ์ง๋ ฌํ/์ญ์ง๋ ฌํ ์ค์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ด ์์ผ๋ฉฐ, ํ์ํ ๋ชจ๋ ํ๋๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
core/network/src/main/java/team/retum/network/datasource/interests/InterestsDataSource.kt (1)
1-11: ์ ์ค๊ณ๋ ์ธํฐํ์ด์ค์ ๋๋ค.๊ด์ฌ ๋ถ์ผ ๊ด๋ จ ๋ฐ์ดํฐ ์์ค ์ธํฐํ์ด์ค๊ฐ ์ ์ ํ ๊ตฌํ๋์์ต๋๋ค. suspend ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๊ณ ์์ผ๋ฉฐ, ๋ช ํํ ๊ธฐ๋ฅ ๋ถ๋ฆฌ๋ฅผ ํ์์ต๋๋ค.
core/domain/src/main/java/team/retum/usecase/usecase/interests/FetchInterestsUseCase.kt (2)
1-13: ๊น๋ํ๊ฒ ๊ตฌํ๋ UseCase์ ๋๋ค.UseCase ํจํด์ ์ ํ์ฉํ์์ผ๋ฉฐ, ๋จ์ผ ์ฑ ์ ์์น(SRP)์ ์ค์ํ๊ณ ์์ต๋๋ค.
์์กด์ฑ ์ฃผ์ ์ ํตํด Repository๋ฅผ ์ฃผ์ ๋ฐ๊ณ ,runCatching์ ์ฌ์ฉํ์ฌ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ ์ ํ ์ํํ๊ณ ์์ต๋๋ค.
10-12: extension ํจ์๋ฅผ ํ์ฉํ ์ข์ ๊ตฌํ์ ๋๋ค.
toEntity()ํ์ฅ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ์๋ต์ ๋๋ฉ์ธ ์ํฐํฐ๋ก ๋ณํํ๋ ๋ก์ง์ ๋ถ๋ฆฌํจ์ผ๋ก์จ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๋์์ต๋๋ค.core/data/src/main/java/team/retum/data/repository/interests/InterestsRepository.kt (1)
1-11: Repository ์ธํฐํ์ด์ค๊ฐ ์ ์ ์๋์์ต๋๋ค.Repository ํจํด ๊ตฌํ์ด ์ ์ ํ ์ด๋ฃจ์ด์ก์ต๋๋ค. ๊ด์ฌ ๋ถ์ผ์ ๊ด๋ จ๋ ๋ฐ์ดํฐ ์กฐ์ ์์ ์ด ๋ช ํํ๊ฒ ์ ์๋์ด ์์ต๋๋ค.
core/network/src/main/java/team/retum/network/api/InterestsApi.kt (2)
11-22: API ์ธํฐํ์ด์ค ๊ตฌํ์ด ์ ๋์์ต๋๋ค.Retrofit์ ์ฌ์ฉํ API ์ ์๊ฐ ์ ์ ํ ์ด๋ฃจ์ด์ก์ต๋๋ค. ์ ๋ ธํ ์ด์ ์ ํตํ HTTP ๋ฉ์๋ ๋ฐ ์๋ํฌ์ธํธ ์ค์ ์ด ๋ช ํํ๊ฒ ๋์ด ์์ต๋๋ค.
20-21: ํจ์ ์ด๋ฆ๊ณผ ์๋ํฌ์ธํธ ๋ช ๋ช ์ด ์ผ์นํ๋์ง ํ์ธํด์ฃผ์ธ์.ํจ์ ์ด๋ฆ์
fetchInterestsSearchRecruitments์ด๊ณ ์๋ํฌ์ธํธ๋interestsRecruitments์ ๋๋ค. ์ด๋ฆ์ด ์ฝ๊ฐ ๋ค๋ฅธ๋ฐ, ์๋์ ์ธ ๊ฒ์ธ์ง ํ์ธํด์ฃผ์ธ์. ๊ฐ๋ฅํ๋ค๋ฉด ์ผ๊ด์ฑ ์๊ฒ ํต์ผํ๋ ๊ฒ์ด ์ข์ต๋๋ค.feature/interests/src/main/res/values/strings.xml (1)
3-8: ์ ์ ํ๊ฒ ์ ์๋ ๋ฌธ์์ด ๋ฆฌ์์ค๋ฌธ์์ด ๋ฆฌ์์ค๊ฐ ๊ด์ฌ ๋ถ์ผ ์ ํ ๊ธฐ๋ฅ์ ๋ง๊ฒ ์ ์ ์๋์์ต๋๋ค. ์ฌ์ฉ์ ์ด๋ฆ์ ๋์ ์ผ๋ก ํ์ํ๊ธฐ ์ํ %s ํ๋ ์ด์คํ๋์ ์ ํ๋ ํญ๋ชฉ ๊ฐ์๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ํฌ๋งท ๋ฌธ์์ด๋ ์ ์ ํ ์ฌ์ฉ๋์์ต๋๋ค.
core/domain/src/main/java/team/retum/usecase/entity/interests/InterestsRecruitmentEntity.kt (2)
6-19: ์ ๊ตฌ์กฐํ๋ ์ํฐํฐ ํด๋์ค์ํฐํฐ ํด๋์ค๊ฐ ๊ด์ฌ ๋ถ์ผ์ ๊ด๋ จ๋ ์ฑ์ฉ ์ ๋ณด๋ฅผ ํํํ๊ธฐ ์ํด ์ ์ ํ ์ค๊ณ๋์์ต๋๋ค.
@Immutable์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ UI์์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ์ ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ ๊ฒ์ ์ข์ ๋ฐฉ์์ ๋๋ค.
21-34: ํ์ฅ ํจ์๋ฅผ ํตํ ๊น๋ํ ๋ณํ ๋ก์ง๋คํธ์ํฌ ์๋ต ๋ชจ๋ธ์ ๋๋ฉ์ธ ์ํฐํฐ๋ก ๋ณํํ๋ ํ์ฅ ํจ์๊ฐ ๊น๋ํ๊ฒ ๊ตฌํ๋์์ต๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ ์์น์ ๋ฐ๋ฅด๋ฉฐ ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋์ฌ์ค๋๋ค.
feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsCompleteScreen.kt (1)
26-35: ๋ด๋ถ ๊ตฌํ์ ์๋ํ๋ ์ข์ Composable ํจํด์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ Composable ํจ์๊ฐ ๋ด๋ถ ๊ตฌํ์ ์ ์ ํ ์บก์ํํ๊ณ ์์ต๋๋ค. ํ์ํ ๋งค๊ฐ๋ณ์๋ง ๋ ธ์ถํ์ฌ ๊น๋ํ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
feature/interests/src/main/java/team/retum/jobis/interests/navigation/InterestsCompleteNavigation.kt (2)
11-28: ์ ์ ํ ๋ค๋น๊ฒ์ด์ ๊ตฌ์ฑNavGraphBuilder ํ์ฅ ํจ์๋ฅผ ํตํด ๋ค๋น๊ฒ์ด์ ๊ทธ๋ํ์ ๊ด์ฌ ๋ถ์ผ ์๋ฃ ํ๋ฉด์ ์ถ๊ฐํ๋ ์ ๊ทผ ๋ฐฉ์์ด ์ ๊ตฌํ๋์์ต๋๋ค. ๋ค๋น๊ฒ์ด์ ์ธ์๋ฅผ ์ ์ ํ ์ค์ ํ๊ณ ์ถ์ถํ๋ ๋ก์ง๋ ์ ์์ฑ๋์์ต๋๋ค.
30-32: ํธ๋ฆฌํ ๋ค๋น๊ฒ์ด์ ํ์ฅ ํจ์NavController์ ํ์ฅ ํจ์๋ฅผ ์ถ๊ฐํ์ฌ ๊ด์ฌ ๋ถ์ผ ์๋ฃ ํ๋ฉด์ผ๋ก ์ฝ๊ฒ ์ด๋ํ ์ ์๋๋ก ํ ์ ๊ทผ ๋ฐฉ์์ด ์ข์ต๋๋ค. ์ฝ๋ ์ฌ์ฉ์ด ๊ฐ๊ฒฐํด์ง๊ณ ๊ฐ๋ ์ฑ์ด ํฅ์๋ฉ๋๋ค.
core/data/src/main/java/team/retum/data/repository/interests/InterestsRepositoryImpl.kt (1)
1-21: ์ฝ๋๊ฐ ์ ๊ตฌํ๋์์ต๋๋ค.Repository ๊ตฌํ์ด ๊น๋ํ๊ณ ์ ์ ํ๊ฒ ์ค๊ณ๋์์ต๋๋ค. ์์กด์ฑ ์ฃผ์ ์ ์ํ
@Inject์ด๋ ธํ ์ด์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋์์ผ๋ฉฐ, ๊ฐ ๋ฉ์๋๋ DataSource์ ์์ ์ ๋ช ํํ๊ฒ ์์ํ๊ณ ์์ต๋๋ค. suspend ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ๋ ์ ์ ํ ์ฒ๋ฆฌํ๊ณ ์์ต๋๋ค.core/network/src/main/java/team/retum/network/datasource/interests/InterestsDataSourceImpl.kt (1)
13-17: ๋คํธ์ํฌ ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์ ๊ตฌํ๋์์ต๋๋ค.
RequestHandler๋ฅผ ์ฌ์ฉํ ์๋ฌ ์ฒ๋ฆฌ ํจํด์ด ์ผ๊ด๋๊ฒ ์ ์ฉ๋์์ต๋๋ค. Unit ํ์ ์ ๋ฐํ๊ฐ์ ๊ฐ์ง ์์ฒญ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ณ ์์ต๋๋ค.feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsCompleteViewModel.kt (1)
22-22: ๋น SideEffect ํด๋์ค ํ์ธ ํ์
InterestsCompleteSideEffectํด๋์ค๊ฐ ๋น์ด ์์ต๋๋ค. ์ด ํ๋ฉด์์ ์ฌ์ด๋ ์ดํํธ๊ฐ ํ์ํ์ง ์๋ค๋ฉด ๋ฌธ์ ์์ง๋ง, ํฅํ ํ์ฅ์ ์ํด ์ค๋นํ ๊ฒ์ธ์ง ํ์ธ์ด ํ์ํฉ๋๋ค.core/network/src/main/java/team/retum/network/model/response/interests/FetchInterestsRecruitmentsResponse.kt (1)
10-18: ์๋ต ๋ชจ๋ธ์ ํ์ฌ ์ด๋ฆ ํ๋ ์ถ๊ฐ ๊ฒํํ์ฌ
InterestRecruitmentsํด๋์ค์๋ ํ์ฌ ID(companyId)๋ ์์ง๋ง ํ์ฌ ์ด๋ฆ์ด ์์ต๋๋ค. UI์์ ํ์ฌ ์ด๋ฆ์ ํ์ํด์ผ ํ ๊ฒฝ์ฐ, ๋ณ๋์ API ํธ์ถ์ด ํ์ํ๊ฑฐ๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํ์ฌ ์ด๋ฆ์ ๊ฐ์ ธ์์ผ ํ ์ ์์ต๋๋ค. ํ์ํ๋ค๋ฉด ์๋ต ๋ชจ๋ธ์ ํ์ฌ ์ด๋ฆ ํ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ ์ ์์ต๋๋ค.ํ์ฌ ์ด๋ฆ์ด UI์ ํ์ํ์ง, ๊ทธ๋ฆฌ๊ณ ํ์ฌ ๊ตฌํ์์ ์ด๋ป๊ฒ ํ์ฌ ์ด๋ฆ์ ํ์ํ๊ณ ์๋์ง ํ์ธํด ๋ณด์ธ์. ํ์ฌ ์ด๋ฆ์ด ํ์ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค:
data class InterestRecruitments( @Json(name = "id") val id: Int, @Json(name = "company_id") val companyId: String, + @Json(name = "company_name") val companyName: String, @Json(name = "company_profile_url") val companyProfileUrl: String, @Json(name = "train_pay") val trainPay: Int, @Json(name = "military_support") val militarySupport: Boolean, @Json(name = "hiring_jobs") val hiringJobs: String, @Json(name = "bookmarked") val bookmarked: Boolean, )
| @HiltViewModel | ||
| internal class InterestsCompleteViewModel @Inject constructor() : BaseViewModel<InterestsCompleteState, InterestsCompleteSideEffect>(InterestsCompleteState.getInitialState()) |
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์ ํ์ ์ด๋ฆ ์ค์ ๋ฉ์๋ ์ถ๊ฐ ํ์
ํ์ฌ ViewModel์ studentName ์ํ๋ฅผ ๋น ๋ฌธ์์ด๋ก ์ด๊ธฐํํ์ง๋ง, ๋ค๋น๊ฒ์ด์
์ธ์์์ ๋ฐ์ ํ์ ์ด๋ฆ์ ์ค์ ํ๋ ๋ฉ์๋๊ฐ ์์ต๋๋ค. ๋ค๋น๊ฒ์ด์
ํ๋ฆ์ ๋ฐ๋ผ ์ด๋ฆ์ ์ค์ ํ ์ ์๋ ๋ฉ์๋๊ฐ ํ์ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ViewModel์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค:
fun setStudentName(name: String) {
setState {
copy(studentName = name)
}
}๐ค Prompt for AI Agents
In
feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsCompleteViewModel.kt
around lines 8 to 9, the ViewModel lacks a method to update the studentName
state from navigation arguments. Add a public function named setStudentName that
takes a String parameter and updates the state by copying the current state with
studentName set to the provided name using setState.
feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsScreen.kt
Outdated
Show resolved
Hide resolved
feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsScreen.kt
Outdated
Show resolved
Hide resolved
| private fun fetchInterests() { | ||
| viewModelScope.launch(Dispatchers.IO) { | ||
| fetchInterestsUseCase().onSuccess { | ||
| setState { | ||
| state.value.copy( | ||
| studentName = it.studentName, | ||
| interestsMajorList = it.interests, | ||
| ) | ||
| } | ||
| } | ||
| } |
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
์๋ฌ ์ฒ๋ฆฌ ๋๋ฝ
fetchInterestsUseCase() ์คํจ ์์๋ UI ์์๋ ๋ก๋ฉ ์ํ๊ฐ ์๊ตฌํ ์ ์ง๋๊ฑฐ๋ ์๋ชป๋ ๋ฐ์ดํฐ๊ฐ ๋
ธ์ถ๋ ์ ์์ต๋๋ค.
onFailure ๋ธ๋ก์ ์ถ๊ฐํ์ฌ ์๋ฌ๋ฅผ ๊ธฐ๋กํ๊ณ , ์ฌ์ฉ์์๊ฒ ํผ๋๋ฐฑ(์ค๋ต๋ฐ ๋ฑ)์ ์ ๊ณตํ๋๋ก ํด ์ฃผ์ธ์.
๐ค Prompt for AI Agents
In
feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsViewmodel.kt
around lines 50 to 60, the fetchInterests function lacks error handling for
fetchInterestsUseCase failure. Add an onFailure block to log the error and
update the UI state to stop loading and show an error message or snackbar to
inform the user about the failure.
feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsViewmodel.kt
Show resolved
Hide resolved
feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsCompleteScreen.kt
Outdated
Show resolved
Hide resolved
feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsScreen.kt
Outdated
Show resolved
Hide resolved
feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsScreen.kt
Outdated
Show resolved
Hide resolved
feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsViewmodel.kt
Show resolved
Hide resolved
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
โป๏ธ Duplicate comments (2)
feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsViewmodel.kt (2)
33-47: ์๋ฌ ์ฒ๋ฆฌ ๋๋ฝ
fetchCodeUseCase()์คํจ ์ UI์์๋ ๋ก๋ฉ ์ํ๊ฐ ์๊ตฌํ ์ ์ง๋๊ฑฐ๋ ์๋ชป๋ ๋ฐ์ดํฐ๊ฐ ๋ ธ์ถ๋ ์ ์์ต๋๋ค.
49-60: ์๋ฌ ์ฒ๋ฆฌ ๋๋ฝ
fetchInterestsUseCase()์คํจ ์์๋ UI์์๋ ๋ก๋ฉ ์ํ๊ฐ ์๊ตฌํ ์ ์ง๋๊ฑฐ๋ ์๋ชป๋ ๋ฐ์ดํฐ๊ฐ ๋ ธ์ถ๋ ์ ์์ต๋๋ค.
๐ Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
๐ Files selected for processing (4)
feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsCompleteScreen.kt(1 hunks)feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsScreen.kt(2 hunks)feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsViewmodel.kt(1 hunks)feature/interests/src/main/res/values/strings.xml(1 hunks)
๐ง Files skipped from review as they are similar to previous changes (3)
- feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsCompleteScreen.kt
- feature/interests/src/main/res/values/strings.xml
- feature/interests/src/main/java/team/retum/jobis/interests/ui/InterestsScreen.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 (1)
feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsViewmodel.kt (1)
74-84: ๊ฒฐ๊ณผ ์ฒ๋ฆฌ ์ ๊ตฌํ๋จ๊ณผ๊ฑฐ ๋ฆฌ๋ทฐ ํผ๋๋ฐฑ์ ๋ฐ์ํ์ฌ ์ฑ๊ณต ์ ์๋ฃ ํ๋ฉด ์ด๋, ์คํจ ์ ์๋ฌ ์ฌ์ด๋์ดํํธ ๋ฐํ์ด ์ ์ ํ ๊ตฌํ๋์์ต๋๋ค.
feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsViewmodel.kt
Show resolved
Hide resolved
feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsViewmodel.kt
Outdated
Show resolved
Hide resolved
| private fun fetchInterestsSearchRecruitments() { | ||
| viewModelScope.launch(Dispatchers.IO) { | ||
| fetchInterestsSearchRecruitmentsUseCase().onSuccess { | ||
| setState { | ||
| state.value.copy( | ||
| interestsRecruitments = it, | ||
| ) | ||
| } | ||
| } | ||
| } | ||
| } |
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.
์๋ฌ ์ฒ๋ฆฌ ๋๋ฝ
fetchInterestsSearchRecruitmentsUseCase() ์คํจ ์ ์๋ฌ ์ฒ๋ฆฌ๊ฐ ์์ด ์ฌ์ฉ์์๊ฒ ์ ์ ํ ํผ๋๋ฐฑ์ด ์ ๊ณต๋์ง ์์ต๋๋ค.
private fun fetchInterestsSearchRecruitments() {
viewModelScope.launch(Dispatchers.IO) {
- fetchInterestsSearchRecruitmentsUseCase().onSuccess {
+ fetchInterestsSearchRecruitmentsUseCase()
+ .onSuccess {
setState {
state.value.copy(
interestsRecruitments = it,
)
}
+ }.onFailure {
+ // ์๋ฌ ๋ก๊น
๋ฐ ์ฌ์ฉ์ ํผ๋๋ฐฑ ์ฒ๋ฆฌ
}
}
}๐ 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 fetchInterestsSearchRecruitments() { | |
| viewModelScope.launch(Dispatchers.IO) { | |
| fetchInterestsSearchRecruitmentsUseCase().onSuccess { | |
| setState { | |
| state.value.copy( | |
| interestsRecruitments = it, | |
| ) | |
| } | |
| } | |
| } | |
| } | |
| private fun fetchInterestsSearchRecruitments() { | |
| viewModelScope.launch(Dispatchers.IO) { | |
| fetchInterestsSearchRecruitmentsUseCase() | |
| .onSuccess { | |
| setState { | |
| state.value.copy( | |
| interestsRecruitments = it, | |
| ) | |
| } | |
| }.onFailure { | |
| // ์๋ฌ ๋ก๊น ๋ฐ ์ฌ์ฉ์ ํผ๋๋ฐฑ ์ฒ๋ฆฌ | |
| } | |
| } | |
| } |
๐ค Prompt for AI Agents
In
feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsViewmodel.kt
around lines 62 to 72, the fetchInterestsSearchRecruitments function lacks error
handling for the failure case of fetchInterestsSearchRecruitmentsUseCase(). Add
an onFailure block to handle errors by updating the state or notifying the user
appropriately, ensuring that any exceptions or failures are caught and proper
feedback is provided.
| @Immutable | ||
| internal data class InterestsState( | ||
| val studentName: String, | ||
| val majorList: List<CodesEntity.CodeEntity>, | ||
| val interestsMajorList: List<InterestsEntity.InterestMajorEntity>, | ||
| val interestsRecruitments: InterestsRecruitmentsEntity?, | ||
| val selectedMajorCodes: List<Long>, | ||
| val selectedMajorCount: Int, | ||
| var buttonEnable: Boolean, | ||
| ) { | ||
| companion object { | ||
| fun getInitialState() = InterestsState( | ||
| studentName = "", | ||
| majorList = emptyList(), | ||
| interestsMajorList = emptyList(), | ||
| interestsRecruitments = null, | ||
| selectedMajorCodes = emptyList(), | ||
| selectedMajorCount = 0, | ||
| buttonEnable = 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
buttonEnable ์ํ ์ ๋ฐ์ดํธ ๋ก์ง ๋๋ฝ
buttonEnable ํ๋กํผํฐ๊ฐ ์ ์๋์ด ์์ง๋ง ์ค์ ๋ก ์
๋ฐ์ดํธํ๋ ๋ก์ง์ด ์์ด ํญ์ false ์ํ๋ก ์ ์ง๋ฉ๋๋ค. ์ ํ๋ ๊ด์ฌ์ฌ ๊ฐ์์ ๋ฐ๋ผ ๋ฒํผ ํ์ฑํ ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ก์ง์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
setState {
state.value.copy(
selectedMajorCodes = currentSelected,
selectedMajorCount = currentSelected.size,
+ buttonEnable = currentSelected.isNotEmpty(),
)
}Committable suggestion skipped: line range outside the PR's diff.
๐ค Prompt for AI Agents
In
feature/interests/src/main/java/team/retum/jobis/interests/viewmodel/InterestsViewmodel.kt
around lines 104 to 125, the buttonEnable property in InterestsState is never
updated and remains false. Add logic to update buttonEnable based on the
selectedMajorCount or selectedMajorCodes so that the button is enabled when
there are selected interests. This update should occur whenever the selected
majors change, ensuring buttonEnable reflects the current selection state.
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: 1
๐ Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
๐ Files selected for processing (1)
feature/landing/src/main/java/team/retum/landing/LandingViewModel.kt(1 hunks)
๐งฐ Additional context used
๐ช detekt (1.23.8)
feature/landing/src/main/java/team/retum/landing/LandingViewModel.kt
[warning] 3-4: The class or object LandingViewModel is empty.
(detekt.empty-blocks.EmptyClassBlock)
โฐ Context from checks skipped due to timeout of 90000ms (2)
- GitHub Check: lint_and_build (lint)
- GitHub Check: lint_and_build (build)
| class LandingViewModel { | ||
| } |
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.
๐ก Verification agent
๐งฉ Analysis chain
ViewModel ์์ ๋ฐ DI ์ ์ ํ์
ํ์ฌ ๋น ํด๋์ค ๋ธ๋ก์ผ๋ก ์ ์๋์ด ์์ด ์ค์ ๋ก ์ฌ์ฉ๋์ง ์์ต๋๋ค. Android ViewModel์ ์์ํ๊ณ , Hilt๋ฅผ ์ฌ์ฉ ์ค์ด๋ผ๋ฉด @HiltViewModel ์ด๋
ธํ
์ด์
๊ณผ @Inject ์์ฑ์๋ฅผ ์ถ๊ฐํด ์ฃผ์ธ์.
๊ตฌ์ฒด์ ์ธ ํ ํ๋ฆฟ ์ฝ๋ ์์๋ฅผ ์์ฑํด ๋๋ฆด๊น์?
๐ Script executed:
#!/bin/bash
set -e
echo "=== Searching for HiltViewModel annotations ==="
rg "@HiltViewModel" -n || echo "No @HiltViewModel annotations found"
echo "=== Searching for Hilt AndroidApp setup ==="
rg "@HiltAndroidApp" -n || echo "No @HiltAndroidApp annotations found"
echo "=== Searching for dagger.hilt imports ==="
rg "import dagger.hilt" -n || echo "No dagger.hilt imports found"
echo "=== Searching for ViewModel imports ==="
rg "import androidx.lifecycle.ViewModel" -n || echo "No androidx.lifecycle.ViewModel imports found"
echo "=== Displaying LandingViewModel.kt snippet ==="
head -n 20 feature/landing/src/main/java/team/retum/landing/LandingViewModel.kt || echo "LandingViewModel.kt not found"Length of output: 11759
LandingViewModel์ ViewModel ์์ ๋ฐ Hilt DI ์ค์ ์ถ๊ฐ ํ์
ํ์ฌ feature/landing/src/main/java/team/retum/landing/LandingViewModel.kt ํ์ผ์ LandingViewModel ํด๋์ค๊ฐ ๋น ํด๋์ค(class LandingViewModel {})๋ก ์ ์๋์ด ์์ด ์ค์ ๋ก ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ, ๋ค๋ฅธ ViewModel๋ค๊ณผ ๋์ผํ ํจํด์ผ๋ก ๋์ํ์ง ์์ต๋๋ค. ๋ค์ ์ฌํญ์ ๋ฐ์ํด ์ฃผ์ธ์:
- Android
ViewModel๋๋ ๊ณตํตBaseViewModel์ ์์๋ฐ์ ๊ฒ - Hilt๋ฅผ ์ฌ์ฉ ์ค์ด๋ฏ๋ก
@HiltViewModel์ด๋ ธํ ์ด์ ์ถ๊ฐ - ์์กด์ฑ ์ฃผ์
์ ์ํด
@Inject constructor()์ ์
์์:
package team.retum.landing
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import team.retum.common.base.BaseViewModel // ๋๋ androidx.lifecycle.ViewModel
@HiltViewModel
class LandingViewModel @Inject constructor(
private val landingUseCase: LandingUseCase // ํ์ํ ์์กด์ฑ์ผ๋ก ๋์ฒด
) : BaseViewModel() { // ๋๋ : ViewModel()
// TODO: ๊ธฐ๋ฅ ๊ตฌํ
}- ์์กด์ฑ์ด ์์ ๊ฒฝ์ฐ
@Inject constructor()๋ง ์ฌ์ฉํ์ ๋ ๋ฌด๋ฐฉํฉ๋๋ค. - ์ถ๊ฐ ์์๊ฐ ํ์ํ๋ฉด ์๋ ค์ฃผ์ธ์.
๐งฐ Tools
๐ช detekt (1.23.8)
[warning] 3-4: The class or object LandingViewModel is empty.
(detekt.empty-blocks.EmptyClassBlock)
๐ค Prompt for AI Agents
In feature/landing/src/main/java/team/retum/landing/LandingViewModel.kt at lines
3 to 4, the LandingViewModel class is currently empty and does not extend
ViewModel or set up dependency injection. To fix this, make LandingViewModel
inherit from Android ViewModel or your BaseViewModel, add the @HiltViewModel
annotation, and define an @Inject constructor for DI. If there are no
dependencies yet, use an empty @Inject constructor; otherwise, inject required
use cases or repositories as constructor parameters.
๊ฐ์
์์ ๋ด์ฉ
ํ ๋ง
Summary by CodeRabbit
์ ๊ท ๊ธฐ๋ฅ
๊ฐ์ ์ฌํญ
๋์์ธ ๋ฐ ๋ฆฌ์์ค
๋ฒ๊ทธ ์์