-
Notifications
You must be signed in to change notification settings - Fork 0
[Feature/#74] login api #76
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Walkthroughํ์๊ฐ์ API์ ๊ด๋ จ๋ ์จ๋ณด๋ฉ ๋ฐ OAuth ์ธ์ฆ ํ๋ก์ฐ๊ฐ ๋๋์ ์ผ๋ก ๊ฐํธ๋์์ต๋๋ค. ๊ธฐ์กด์ signUp ๋ฐฉ์์ด ์ ๊ฑฐ๋๊ณ , ๋๋ค์ ์ค๋ณต ์ฒดํฌ ๋ฐ ์ฌ์ฉ์ ์ ๋ณด ์์ API๋ก ๋ถ๋ฆฌ๋์์ต๋๋ค. OAuth ์์ ๋ก๊ทธ์ธ ์ฐ๋, JWT ์ ์ฅ, ์ ๊ท ์ฌ์ฉ์ ๋ถ๊ธฐ, DTO/Entity/Repository/RemoteDataSource/Service ๋ฑ ๊ณ์ธต๋ณ๋ก ์ ๊ท ์ฝ๋๊ฐ ๋๋ ์ถ๊ฐ๋์์ต๋๋ค. Changes
Sequence Diagram(s)sequenceDiagram
actor User
participant NamingScreen
participant OnBoardingViewModel
participant OnBoardingRepository
participant OnBoardingRemoteDataSource
participant OnBoardingService
User->>NamingScreen: ๋๋ค์ ์
๋ ฅ
NamingScreen->>OnBoardingViewModel: ChangeInputNickname(intent)
OnBoardingViewModel->>OnBoardingRepository: checkNicknameDuplicate(nickname)
OnBoardingRepository->>OnBoardingRemoteDataSource: checkNicknameDuplicate(nickname)
OnBoardingRemoteDataSource->>OnBoardingService: checkNicknameDuplicate API ํธ์ถ
OnBoardingService-->>OnBoardingRemoteDataSource: isDuplicated ๋ฐํ
OnBoardingRemoteDataSource-->>OnBoardingRepository: isDuplicated ๋ฐํ
OnBoardingRepository-->>OnBoardingViewModel: isDuplicated ๋ฐํ
OnBoardingViewModel-->>NamingScreen: isNicknameDuplicate ์ํ ์
๋ฐ์ดํธ
sequenceDiagram
actor User
participant OauthScreen
participant OauthViewModel
participant OauthRepository
participant OauthRemoteDataSource
participant OauthService
User->>OauthScreen: ์์
๋ก๊ทธ์ธ ์ฑ๊ณต (Kakao ๋ฑ)
OauthScreen->>OauthViewModel: KakaoLoginSuccess(provider, accessToken)
OauthViewModel->>OauthRepository: postSocialLogin(provider, accessToken)
OauthRepository->>OauthRemoteDataSource: socialLogin(provider, accessToken)
OauthRemoteDataSource->>OauthService: postSocialLogin API ํธ์ถ
OauthService-->>OauthRemoteDataSource: accessToken, refreshToken, isNewUser ๋ฐํ
OauthRemoteDataSource-->>OauthRepository: SocialLoginResponseDto ๋ฐํ
OauthRepository-->>OauthViewModel: TokenEntity ๋ฐํ
OauthViewModel->>OauthRepository: saveJwtToken(accessToken, refreshToken)
OauthRepository-->>OauthViewModel: ์ ์ฅ ๊ฒฐ๊ณผ ๋ฐํ
OauthViewModel-->>OauthScreen: ์ ๊ท/๊ธฐ์กด ์ฌ์ฉ์ ๋ถ๊ธฐ(NavigateToOnBoarding or NavigateToPlace)
Assessment against linked issues
Assessment against linked issues: Out-of-scope changesํด๋น ๋ณ๊ฒฝ์ฌํญ ์ค ์ด์ #74์ "ํ์๊ฐ์ API" ๋ชฉ์ ๊ณผ ๋ฌด๊ดํ ๊ธฐ๋ฅ์ ์ฝ๋ ๋ณ๊ฒฝ์ ๋ฐ๊ฒฌ๋์ง ์์์ต๋๋ค. Possibly related PRs
Suggested labels
Suggested reviewers
Poem
โจ 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: 6
๐งน Nitpick comments (7)
data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/request/PatchUserInfoRequestDto.kt (1)
7-14: DTO ๊ตฌ์กฐ๊ฐ ์ ์ ํ๊ฒ ์ ๋ฐ์ดํธ๋์์ต๋๋ค.
SignUpRequestDto์์PatchUserInfoRequestDto๋ก์ ๋ฆฌ๋ค์ด๋ฐ๊ณผ ์๋ก์ด ์์ฑ๋ค(favoriteTown,persona) ์ถ๊ฐ๊ฐ ์ ์ ํฉ๋๋ค. ๋ชจ๋ ์์ฑ์ด ์ฌ๋ฐ๋ฅธ ์ง๋ ฌํ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.ํฅํ ๊ฐ์ ์ ์ํด ๋ค์์ ๊ณ ๋ คํด๋ณด์ธ์:
- ์ ๋ ฅ ๊ฐ ๊ฒ์ฆ ๋ก์ง ์ถ๊ฐ (์: nickname ๊ธธ์ด ์ ํ, persona ์ ํจ์ฑ ๊ฒ์ฌ)
- ๋ฌธ์ํ ์ฃผ์ ์ถ๊ฐ๋ก ๊ฐ ํ๋์ ์ฉ๋ ๋ช ์
app/build.gradle.kts (1)
14-14: ํค์คํ ์ด ๊ฒฝ๋ก ํ๋์ฝ๋ฉ ๊ฐ์ ์ ์ํค์คํ ์ด ํ์ผ ๊ฒฝ๋ก๊ฐ ํ๋์ฝ๋ฉ๋์ด ์์ด ์ ์ง๋ณด์์ฑ์ด ๋จ์ด์ง๋๋ค.
gradle.properties์ ํค์คํ ์ด ๊ฒฝ๋ก๋ฅผ ์ ์ํ๊ณ ์ฐธ์กฐํ๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค:
- storeFile = File("${project.rootDir.absolutePath}/keystore/debug.keystore") + storeFile = File(findProperty("DEBUG_KEYSTORE_PATH") ?: "${project.rootDir.absolutePath}/keystore/debug.keystore")core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt (1)
157-157: ์ค๋ณต ๊ฒ์ฌ ํ์ด๋ฐ ๊ฐ์ ์ ๊ณ ๋ คํด๋ณด์ธ์.ํ์ฌ
isNicknameDuplicate๋ฅผ ์ฆ์ ํ์ธํ๋๋ฐ, ์ฌ์ฉ์๊ฐ ์์ง ์ ๋ ฅ ์ค์ด๊ฑฐ๋ ๊ฒ์ฆ์ด ์งํ ์ค์ผ ๋์ ์ํ๋ฅผ ๋ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ๋ฉด ์ข๊ฒ ์ต๋๋ค.validationState = - if (isNicknameDuplicate) NickNameValidateState.Duplicate else NickNameValidateState.Valid + if (isNicknameDuplicate) NickNameValidateState.Duplicate + else if (isTyping) NickNameValidateState.Typing + else NickNameValidateState.Validfeature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt (1)
57-62: TODO ๋ฉ์๋๋ฅผ ์์ฑํ๊ฑฐ๋ ์ ๊ฑฐํด์ฃผ์ธ์.
patchUserInfo๋ฉ์๋๊ฐ TODO ์ํ๋ก ๋จ์์์ต๋๋ค. ๊ตฌํ์ด ํ์ํ๊ฑฐ๋ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข๊ฒ ์ต๋๋ค.๊ตฌํ์ด ํ์ํ์๋ฉด ํ์๊ฐ์ API ํธ์ถ ๋ก์ง์ ์์ฑํด๋๋ฆด ์ ์์ต๋๋ค.
feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt (1)
58-63: ํ๋์ฝ๋ฉ๋ provider ๋ฌธ์์ด์ ์์๋ก ๋ถ๋ฆฌํด์ฃผ์ธ์.
"KAKAO"๋ฌธ์์ด์ด ํ๋์ฝ๋ฉ๋์ด ์์ต๋๋ค. ์ ์ง๋ณด์์ฑ์ ์ํด ์์๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข๊ฒ ์ต๋๋ค.+private const val KAKAO_PROVIDER = "KAKAO" onSuccess = { accessToken, _ -> viewModel.sendIntent( OauthIntent.KakaoLoginSuccess( - provider = "KAKAO", + provider = KAKAO_PROVIDER, accessToken = accessToken ) ) }feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt (1)
62-62: ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ๊ฐ์ ํด์ผ ํฉ๋๋ค.๋๋ฒ๊ทธ ๋ก๊ทธ ๋ฉ์์ง๋ก "asdasdasd"๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ๋ฌธ์ ์ด์ง ์์ต๋๋ค. ์๋ฏธ์๋ ๋ก๊ทธ ๋ฉ์์ง๋ก ๋ณ๊ฒฝํ๊ฑฐ๋ ์ ๊ฑฐํด์ผ ํฉ๋๋ค.
- Log.d("asdasdasd", it.toString()) + Log.e("OauthViewModel", "Social login failed: ${it.message}", it)feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt (1)
43-43: ๋๋ฒ๊ทธ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ๊ฐ์ ํ๊ฑฐ๋ ์ ๊ฑฐํด์ผ ํฉ๋๋ค."asdasdasd"๋ฅผ ํ๊ทธ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ ๋ฌธ์ ์ด์ง ์์ต๋๋ค. ์๋ฏธ์๋ ํ๊ทธ๋ก ๋ณ๊ฒฝํ๊ฑฐ๋ ํ๋ก๋์ ์์๋ ์ ๊ฑฐํด์ผ ํฉ๋๋ค.
- Log.d("asdasdasd", "${state.selectedTownId} ${state.selectedPersona} ${state.userNickname}") + Log.d("OnBoardingRoute", "State: townId=${state.selectedTownId}, persona=${state.selectedPersona}, nickname=${state.userNickname}")
๐ Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
๐ Files selected for processing (42)
.gitignore(1 hunks)app/build.gradle.kts(2 hunks)core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt(4 hunks)core/network/src/main/java/com/teamsolply/solply/network/AccessTokenInterceptor.kt(1 hunks)core/network/src/main/java/com/teamsolply/solply/network/service/TokenRefreshService.kt(1 hunks)data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/request/SocialLoginRequestDto.kt(1 hunks)data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/response/SocialLoginResponseDto.kt(1 hunks)data/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepositoryImpl.kt(1 hunks)data/oauth/src/main/java/com/teamsolply/solply/oauth/source/OauthRemoteDataSource.kt(1 hunks)data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/request/PatchUserInfoRequestDto.kt(1 hunks)data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/NicknameDuplicateResponseDto.kt(1 hunks)data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/PatchUserInfoResponseDto.kt(1 hunks)data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt(1 hunks)data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/OnBoardingRemoteDataSource.kt(1 hunks)domain/oauth/src/main/java/com/teamsolply/solply/oauth/model/TokenEntity.kt(1 hunks)domain/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepository.kt(1 hunks)domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/SignUpEntity.kt(0 hunks)domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/UserInfoEntity.kt(1 hunks)domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt(1 hunks)feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt(1 hunks)feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt(1 hunks)feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthContract.kt(1 hunks)feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt(2 hunks)feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt(2 hunks)feature/oauth/src/main/java/com/teamsolply/solply/oauth/navigation/OauthNavigation.kt(1 hunks)feature/onboarding/build.gradle.kts(1 hunks)feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingContract.kt(2 hunks)feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt(8 hunks)feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt(2 hunks)feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/component/BackHeader.kt(0 hunks)feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/navigation/OnBoardingNavigation.kt(1 hunks)feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/NamingScreen.kt(3 hunks)feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/SelectPersonaScreen.kt(0 hunks)remote/oauth/.gitignore(1 hunks)remote/oauth/build.gradle.kts(1 hunks)remote/oauth/src/main/java/com/teamsolply/solply/oauth/datasource/OauthRemoteDataSourceImpl.kt(1 hunks)remote/oauth/src/main/java/com/teamsolply/solply/oauth/di/OauthRemoteDataModule.kt(1 hunks)remote/oauth/src/main/java/com/teamsolply/solply/oauth/di/OauthServiceModule.kt(1 hunks)remote/oauth/src/main/java/com/teamsolply/solply/oauth/service/OauthService.kt(1 hunks)remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt(1 hunks)remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/service/OnBoardingService.kt(1 hunks)settings.gradle.kts(1 hunks)
๐ค Files with no reviewable changes (3)
- feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/component/BackHeader.kt
- feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/SelectPersonaScreen.kt
- domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/SignUpEntity.kt
๐งฐ Additional context used
๐งฌ Code Graph Analysis (4)
feature/oauth/src/main/java/com/teamsolply/solply/oauth/navigation/OauthNavigation.kt (1)
feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt (1)
OauthRoute(43-77)
feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt (1)
core/ui/src/main/java/com/teamsolply/solply/ui/base/BaseViewModel.kt (1)
reduce(44-46)
feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt (1)
feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt (1)
navigateToPlace(79-81)
feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt (2)
core/ui/src/main/java/com/teamsolply/solply/ui/lifecycle/LaunchedEffectWithLifecycle.kt (1)
LaunchedEffectWithLifecycle(11-24)feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt (1)
navigateToPlace(79-81)
๐ Additional comments (49)
remote/oauth/.gitignore (1)
1-1: ํ์ค ๊ด๋ก์ ๋ฐ๋ฅธ ์ฌ๋ฐ๋ฅธ ์ค์ ์ ๋๋ค.์๋ก์ด
remote/oauth๋ชจ๋์ ๋ํ.gitignoreํ์ผ์ด/build๋๋ ํ ๋ฆฌ๋ฅผ ๋ฌด์ํ๋๋ก ์ ์ ํ ์ค์ ๋์์ต๋๋ค..gitignore (1)
32-33: ๋ณด์์ ์ํ ์ ์ ํ ํค์คํ ์ด ํ์ผ ์ ์ธ ์ค์ ์ ๋๋ค.์ฑ ์๋ช ์ ์ฌ์ฉ๋๋ ๋ฏผ๊ฐํ ํค์คํ ์ด ํ์ผ๋ค์ด Git ์ถ์ ์์ ์ ์ธ๋๋๋ก ๋ช ์์ ์ผ๋ก ์ค์ ๋์์ต๋๋ค. ์ด๋ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ถํฉํฉ๋๋ค.
feature/onboarding/build.gradle.kts (1)
10-10: ํด๋ฆฐ ์ํคํ ์ฒ ์์น์ ๋ฐ๋ฅธ ์ฌ๋ฐ๋ฅธ ์์กด์ฑ ์ถ๊ฐ์ ๋๋ค.ํผ์ฒ ๋ชจ๋์ด ๋๋ฉ์ธ ๊ณ์ธต์ ์จ๋ณด๋ฉ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์์กด์ฑ์ด ์ ์ ํ ์ถ๊ฐ๋์์ต๋๋ค.
settings.gradle.kts (1)
53-53: ์๋ก์ด OAuth ๋ชจ๋์ ํ์ค์ ์ธ ์ถ๊ฐ์ ๋๋ค.
remote:oauth๋ชจ๋์ด ๋ค๋ฅธ remote ๋ชจ๋๋ค๊ณผ ํจ๊ป ์ ์ ํ ์์น์ ์ถ๊ฐ๋์์ต๋๋ค. ๋ฉํฐ๋ชจ๋ ํ๋ก์ ํธ์ ํ์ค ๊ด๋ก๋ฅผ ๋ฐ๋ฆ ๋๋ค.remote/oauth/build.gradle.kts (1)
1-13: OAuth ๋ชจ๋ ๋น๋ ์ค์ ์ด ์ ์ ํฉ๋๋ค.์๋ก์ด OAuth ๋ชจ๋์ Gradle ๋น๋ ์คํฌ๋ฆฝํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ํ์ํ ์์กด์ฑ๋ค(network, model, data.oauth)์ด ํฌํจ๋์ด ์๊ณ ๋ค์์คํ์ด์ค๋ ๋ช ํํ๊ฒ ์ ์๋์ด ์์ต๋๋ค.
feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/navigation/OnBoardingNavigation.kt (1)
21-23: ์ฝ๋ ํฌ๋งทํ ๊ฐ์ ์ด ์ ๋์์ต๋๋ค.๋ถํ์ํ trailing comma๋ฅผ ์ ๊ฑฐํ๊ณ ๋ธ๋ ์ด์ค ์์น๋ฅผ ์กฐ์ ํ์ฌ ์ฝ๋ ๊ฐ๋ ์ฑ์ด ํฅ์๋์์ต๋๋ค.
domain/oauth/src/main/java/com/teamsolply/solply/oauth/model/TokenEntity.kt (1)
5-6: TokenEntity ์ฌ์ฉ์ฒ ํ์ธ ์๋ฃ
- data/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepositoryImpl.kt (22โ26)์์
isNewUser๊ฐ ์ ์์ ์ผ๋ก ๋งคํ๋๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.- ์ถ๊ฐ ๊ฒํ ๋ ์์ ์์ด ํ๋ ์ถ๊ฐ๋ฅผ ์น์ธํฉ๋๋ค.
domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/UserInfoEntity.kt (1)
3-8: ์ฌ์ฉ์ ์ ๋ณด ๋ฐ์ดํฐ ํด๋์ค๊ฐ ์ ์ค๊ณ๋์์ต๋๋ค.
UserInfoEntity๋ ์จ๋ณด๋ฉ ํ๋ก์ธ์ค์์ ํ์ํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ ํ ๋ชจ๋ธ๋งํ์ต๋๋ค.favoriteTownId๋ง nullable๋ก ์ค์ ํ ๊ฒ์ด ์ ์ ํ๋ฉฐ, ๋ชจ๋ ํ๋์ ํ์ ๊ณผ ๋ช ๋ช ์ด ๋ช ํํฉ๋๋ค.data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/NicknameDuplicateResponseDto.kt (1)
6-10: ๊ตฌํ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ด ์์ต๋๋ค.์ด DTO๋ ๊ฐ๋จํ๊ณ ๋ช ํํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, Kotlin ์ง๋ ฌํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
@SerialName์ด๋ ธํ ์ด์ ์ ํตํ JSON ๋งคํ๋ ์ ์ ํฉ๋๋ค.data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/request/SocialLoginRequestDto.kt (1)
6-10: ์์ ๋ก๊ทธ์ธ ์์ฒญ DTO๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์์ต๋๋ค.๊ตฌ์กฐ๊ฐ ๋จ์ํ๊ณ ๋ช ํํ๋ฉฐ, ์ง๋ ฌํ ์ด๋ ธํ ์ด์ ์ด ์ ์ ํ ์ฌ์ฉ๋์์ต๋๋ค. ์์ฑ๋ช ๋ ๋ช ํํ๊ณ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค.
data/oauth/src/main/java/com/teamsolply/solply/oauth/source/OauthRemoteDataSource.kt (1)
5-7: OAuth ์๊ฒฉ ๋ฐ์ดํฐ ์์ค ์ธํฐํ์ด์ค๊ฐ ์ ์ค๊ณ๋์์ต๋๋ค.ํด๋ฆฐ ์ํคํ ์ฒ ์์น์ ์ ๋ฐ๋ฅด๊ณ ์์ผ๋ฉฐ, suspend ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ ์ ํ ๊ณ ๋ ค๋์์ต๋๋ค. ํจ์ ์๊ทธ๋์ฒ๋ ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ์ ํฉํฉ๋๋ค.
feature/main/src/main/java/com/teamsolply/solply/main/MainScreen.kt (1)
134-142: OAuth ๋ค๋น๊ฒ์ด์ ๊ทธ๋ํ์ Place ํ๋ฉด์ผ๋ก์ ๋ค๋น๊ฒ์ด์ ์ด ์ ์ ํ ์ถ๊ฐ๋์์ต๋๋ค.๊ธฐ์กด ๋ค๋น๊ฒ์ด์ ํจํด๊ณผ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉฐ, ๋ค๋น๊ฒ์ด์ ์ต์ ์ค์ ๋ ๋ค๋ฅธ ์ ์ฌํ ์ฝ๋ฐฑ๋ค๊ณผ ๋์ผํ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
app/build.gradle.kts (1)
54-54: OAuth ์๊ฒฉ ๋ชจ๋ ์์กด์ฑ ์ถ๊ฐ ์น์ธOAuth ๊ธฐ๋ฅ ๊ตฌํ์ ์ํ ์๊ฒฉ ๋ชจ๋ ์์กด์ฑ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐ๋์์ต๋๋ค.
feature/oauth/src/main/java/com/teamsolply/solply/oauth/navigation/OauthNavigation.kt (1)
20-21: ๋ค๋น๊ฒ์ด์ ํ๋ผ๋ฏธํฐ ์ถ๊ฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋จOAuth ํ๋ก์ฐ์์ Place ํ๋ฉด์ผ๋ก์ ๋ค๋น๊ฒ์ด์ ์ ์ง์ํ๊ธฐ ์ํ ํ๋ผ๋ฏธํฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐ๋๊ณ ์ ๋ฌ๋์์ต๋๋ค.
Also applies to: 26-27
remote/oauth/src/main/java/com/teamsolply/solply/oauth/di/OauthServiceModule.kt (1)
12-19: Dagger Hilt ๋ชจ๋ ๊ตฌ์ฑ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋จOAuth ์๋น์ค๋ฅผ ์ํ ์์กด์ฑ ์ฃผ์ ๋ชจ๋์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์์ต๋๋ค. @NoneAccessToken ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ํ ํฐ ์๋ ์์ฒญ์ ์ํ Retrofit ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํฉ๋๋ค.
data/oauth/src/main/java/com/teamsolply/solply/oauth/dto/response/SocialLoginResponseDto.kt (1)
6-14: ์์ ๋ก๊ทธ์ธ ์๋ต DTO๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋จ์์ ๋ก๊ทธ์ธ ์๋ต์ ์ํ DTO๊ฐ ์ ์ ํ ์ง๋ ฌํ ์ด๋ ธํ ์ด์ ๊ณผ ํจ๊ป ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์์ต๋๋ค. ํ๋๋ช ๊ณผ ๊ตฌ์กฐ๊ฐ OAuth ์๋ต ํ์์ ์ ํฉํฉ๋๋ค.
core/network/src/main/java/com/teamsolply/solply/network/service/TokenRefreshService.kt (1)
8-10: ํ ํฐ ์๋ก๊ณ ์นจ ์๋น์ค ๊ตฌ์ฑ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฐ์ดํธ๋จAPI ์๋ํฌ์ธํธ์ ํค๋ ๊ตฌ์ฑ์ด ๋ฐฑ์๋ API ๊ท๊ฒฉ์ ๋ง๊ฒ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฐ์ดํธ๋์์ต๋๋ค. "Refresh-Token" ํค๋ ์ฌ์ฉ์ด ์ ์ ํฉ๋๋ค.
data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/PatchUserInfoResponseDto.kt (1)
1-16: ๊น๋ํ Response DTO ๊ตฌํ์ ๋๋ค.Kotlin serialization์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ๋ชจ๋ ํ๋์ ์ ์ ํ
@SerialName์ด๋ ธํ ์ด์ ์ด ์ ์ฉ๋์ด ์์ต๋๋ค. ํ์ ์ ์๋ ๋ช ํํ๊ณ ๊ตฌ์กฐ๊ฐ ๊ฐ๊ฒฐํฉ๋๋ค.feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingContract.kt (2)
23-24: ์ํ ๊ด๋ฆฌ ๊ฐ์ ์ด ์ข์ต๋๋ค.
userNickname์ null์ด ์๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๊ณisNicknameDuplicate์ํ๋ฅผ ์ถ๊ฐํ ๊ฒ์ ๋๋ค์ ์ค๋ณต ๊ฒ์ฌ ํ๋ก์ฐ๋ฅผ ๋ช ํํ๊ฒ ์ง์ํฉ๋๋ค. ๋ ์์ ์ฑ๋ ํฅ์๋์์ต๋๋ค.
35-35: Intent ์ด๋ฆ ๊ฐ์ ์ด ์ ์ ํฉ๋๋ค.
ChangeInputNickname์ผ๋ก ์ด๋ฆ์ ๋ณ๊ฒฝํ ๊ฒ์ด ๋ ๋ช ํํ๊ณ ์๋๋ฅผ ์ ํํํฉ๋๋ค.remote/oauth/src/main/java/com/teamsolply/solply/oauth/di/OauthRemoteDataModule.kt (1)
11-17: ํ์ค์ ์ธ Dagger Hilt ๋ชจ๋ ๊ตฌํ์ ๋๋ค.SingletonComponent ์ค์ฝํ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์น๋์ด ์๊ณ , ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ ๋ฐ์ธ๋ฉ์ด ์ ์ ํ๊ฒ ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์์กด์ฑ ์ฃผ์ ํจํด์ ์ ํํ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
core/designsystem/src/main/java/com/teamsolply/solply/designsystem/component/textfield/SolplyTextField.kt (2)
117-117: UI ์ปดํฌ๋ํธ ์ฑ ์ ๋ถ๋ฆฌ๊ฐ ์ ๋์์ต๋๋ค.์ค๋ณต ๊ฒ์ฌ ๋ก์ง์ UI ์ปดํฌ๋ํธ์์ ๋ถ๋ฆฌํ์ฌ ์ธ๋ถ ์ํ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ข์ ์ํคํ ์ฒ ๊ฐ์ ์ ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ ์์ธก ๊ฐ๋ฅํ๊ณ ํ ์คํธํ๊ธฐ ์ฌ์์ก์ต๋๋ค.
140-144: ์ต์ ๊ธธ์ด ๊ฒ์ฆ ์ถ๊ฐ๊ฐ ์ข์ต๋๋ค.
TooShort์ํ๋ฅผ ์ถ๊ฐํ์ฌ ์ต์ ๊ธธ์ด ๊ฒ์ฆ์ ๊ตฌํํ ๊ฒ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํฉ๋๋ค. ๊ฒ์ฆ ๋ก์ง์ด ๋ ๋ช ํํด์ก์ต๋๋ค.feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt (1)
69-69: Place ํ๋ฉด์ผ๋ก์ ๋ค๋น๊ฒ์ด์ ์ฒ๋ฆฌ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์์ต๋๋ค.์๋ก์ด
NavigateToPlace์ฌ์ด๋ ์ดํํธ๊ฐ ์ ์ ํ๊ฒ ์ฒ๋ฆฌ๋์ด ์์ต๋๋ค.domain/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepository.kt (1)
6-7: ์ธํฐํ์ด์ค ๋ฆฌํฉํ ๋ง์ด ์ ์ ํ๊ฒ ์ํ๋์์ต๋๋ค.์์ ๋ก๊ทธ์ธ๊ณผ JWT ํ ํฐ ์ ์ฅ ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ๊ด์ฌ์ฌ๊ฐ ๋ช ํํ๊ฒ ๋ถ๋ฆฌ๋์๊ณ ,
Resultํ์ ์ ์ฌ์ฉํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐฉ์๋ ์ ์ ํฉ๋๋ค.remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/datasource/OnBoardingRemoteDataSourceImpl.kt (1)
13-17: ์จ๋ณด๋ฉ ๋ฐ์ดํฐ ์์ค ๋ฆฌํฉํ ๋ง์ด ์ ์ ํ๊ฒ ์ํ๋์์ต๋๋ค.๋จ์ผ ํ์๊ฐ์ ๋ฉ์๋๋ฅผ ๋๋ค์ ์ค๋ณต ๊ฒ์ฌ์ ์ฌ์ฉ์ ์ ๋ณด ์์ ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ๋์ฑ ์ธ๋ถํ๋ API ํธ์ถ์ด ๊ฐ๋ฅํด์ก์ต๋๋ค. ๊ตฌํ ํจํด๋ ์ผ๊ด์ฑ ์๊ฒ ์ ์ง๋์์ต๋๋ค.
domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt (2)
3-3: ์ํฌํธ ๋ณ๊ฒฝ์ด ์ ์ ํฉ๋๋ค.
SignUpEntity์์UserInfoEntity๋ก์ ์ํฌํธ ๋ณ๊ฒฝ์ด ์๋ก์ด ๋๋ฉ์ธ ๋ชจ๋ธ ๊ตฌ์กฐ์ ์ผ์นํฉ๋๋ค.
6-11: ๋ฉ์๋ ๋ถ๋ฆฌ๊ฐ ๋จ์ผ ์ฑ ์ ์์น์ ์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.๊ธฐ์กด signUp ๋ฉ์๋๋ฅผ ๋๋ค์ ์ค๋ณต ์ฒดํฌ์ ์ฌ์ฉ์ ์ ๋ณด ํจ์น๋ก ๋ถ๋ฆฌํ ๊ฒ์ ์ข์ ์ค๊ณ์ ๋๋ค. ๊ฐ ๋ฉ์๋๊ฐ ๋ช ํํ ์ฑ ์์ ๊ฐ์ง๋ฉฐ, ํ ์คํธํ๊ธฐ ์ฌ์ด ๊ตฌ์กฐ์ ๋๋ค.
data/onboarding/src/main/java/com/teamsolply/solply/onboarding/source/OnBoardingRemoteDataSource.kt (2)
3-5: ์๋ก์ด DTO ์ํฌํธ๊ฐ ์ ์ ํฉ๋๋ค.
PatchUserInfoRequestDto,NicknameDuplicateResponseDto,PatchUserInfoResponseDto์ ์ํฌํธ๊ฐ ์๋ก์ด API ๊ตฌ์กฐ์ ์ผ์นํฉ๋๋ค.
8-9: ๋ฉ์๋ ์๊ทธ๋์ฒ๊ฐ ์ ์ ํ๊ฒ ์ค๊ณ๋์์ต๋๋ค.๊ฐ ๋ฉ์๋๊ฐ ๋ช ํํ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ๊ฐ์ง๋ฉฐ, ์ ์ ํ DTO๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ suspend ํจ์๋ก ์ ์๋ ๊ฒ๋ ์ข์ต๋๋ค.
data/oauth/src/main/java/com/teamsolply/solply/oauth/repository/OauthRepositoryImpl.kt (4)
5-5: ์๊ฒฉ ๋ฐ์ดํฐ ์์ค ์์กด์ฑ ์ถ๊ฐ๊ฐ ์ ์ ํฉ๋๋ค.OAuth ์๊ฒฉ ๋ฐ์ดํฐ ์์ค ์์กด์ฑ์ด ์ถ๊ฐ๋์ด ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ์ง์ํ ์ ์๊ฒ ๋์์ต๋๋ค.
9-10: ์์ฑ์ ํ๋ผ๋ฏธํฐ ์์๋ฅผ ์ผ๊ด๋๊ฒ ์ ์งํ์ธ์.๋ก์ปฌ ๋ฐ์ดํฐ ์์ค์ ์๊ฒฉ ๋ฐ์ดํฐ ์์ค์ ์์๊ฐ ์ผ๊ด๋๊ฒ ์ ์ง๋์ด ๊ฐ๋ ์ฑ์ด ์ข์ต๋๋ค.
13-27: ์์ ๋ก๊ทธ์ธ ๋ฉ์๋๊ฐ ์ ๊ตฌํ๋์์ต๋๋ค.
runCatching๊ณผmapCatching์ ์ฌ์ฉํ ์๋ฌ ์ฒ๋ฆฌ๊ฐ ์ ์ ํ๋ฉฐ, DTO์์ ๋๋ฉ์ธ ์ํฐํฐ๋ก์ ๋งคํ์ด ์ฌ๋ฐ๋ฆ ๋๋ค.isNewUserํ๋๋ฅผ ํฌํจํ ๊ฒ๋ ์ข์ ์ค๊ณ์ ๋๋ค.
29-35: JWT ํ ํฐ ์ ์ฅ ๋ฉ์๋ ์๊ทธ๋์ฒ ๋ณ๊ฒฝ์ด ์ ์ ํฉ๋๋ค.๊ฐ๋ณ ํ ํฐ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๋๋ก ๋ณ๊ฒฝํ ๊ฒ์ด ๋ ์ ์ฐํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด API๋ฅผ ์ ๊ณตํฉ๋๋ค.
feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/NamingScreen.kt (3)
24-26: ์ ์ดํ ์ปดํฌ๋ํธ๋ก์ ๋ฆฌํฉํ ๋ง์ด ํ๋ฅญํฉ๋๋ค.
inputNickname,isNicknameDuplicateํ๋ผ๋ฏธํฐ์changeInputNickname์ฝ๋ฐฑ์ ์ถ๊ฐํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์์ ํ ์ ์ด ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๊ฒ์ ์ข์ ์ค๊ณ์ ๋๋ค. ์ด๋ ์ํ ๊ด๋ฆฌ๋ฅผ ์ธ๋ถํํ์ฌ ๋ ์์ธก ๊ฐ๋ฅํ๊ณ ํ ์คํธํ๊ธฐ ์ฌ์ด ๊ตฌ์กฐ๋ฅผ ๋ง๋ญ๋๋ค.
50-52: ์ธ๋ถ ์ํ ์ฌ์ฉ์ด ์ ์ ํฉ๋๋ค.
inputNickname๊ณผchangeInputNickname์ฝ๋ฐฑ์ ์ฌ์ฉํ์ฌ ์ํ ๊ด๋ฆฌ๊ฐ ์ธ๋ถํ๋์์ต๋๋ค.state.isNicknameDuplicate๋ฅผ ์ฌ์ฉํ ๊ฒ๋ ์ผ๊ด๋ ์ํ ๊ด๋ฆฌ ํจํด์ ๋ณด์ฌ์ค๋๋ค.
64-70: ๋ฒํผ ํ์ฑํ ๋ก์ง์ด ์ผ๊ด๋๊ฒ ๊ตฌํ๋์์ต๋๋ค.
state.userNickname์ ์ฌ์ฉํ์ฌ ๋ฒํผ ํ์ฑํ ์ํ์ ํ ์คํธ ์์์ ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ด ์ข์ต๋๋ค. UI ์ํ๊ฐ ๋ช ํํ๊ณ ์์ธก ๊ฐ๋ฅํฉ๋๋ค.data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt (3)
3-4: ์๋ก์ด ์ํฌํธ๊ฐ ์ ์ ํฉ๋๋ค.
PatchUserInfoRequestDto์UserInfoEntity์ํฌํธ๊ฐ ์๋ก์ด API ๊ตฌ์กฐ์ ์ผ์นํฉ๋๋ค.
11-13: ๋๋ค์ ์ค๋ณต ์ฒดํฌ ๋ฉ์๋๊ฐ ๊ฐ๊ฒฐํ๊ฒ ๊ตฌํ๋์์ต๋๋ค.
runCatching์ ์ฌ์ฉํ ์๋ฌ ์ฒ๋ฆฌ๊ฐ ์ ์ ํ๋ฉฐ, ์๊ฒฉ ๋ฐ์ดํฐ ์์ค์์ ๋ฐ์isDuplicated๊ฐ์ ์ง์ ๋ฐํํ๋ ๊ฒ์ด ํจ์จ์ ์ ๋๋ค.
15-34: ์ฌ์ฉ์ ์ ๋ณด ํจ์น ๋ฉ์๋๊ฐ ์ ๊ตฌํ๋์์ต๋๋ค.DTO ์์ฑ, ์๊ฒฉ ๋ฐ์ดํฐ ์์ค ํธ์ถ, ๋๋ฉ์ธ ์ํฐํฐ๋ก์ ๋งคํ์ด ์์๋๋ก ์ ์ ํ๊ฒ ๊ตฌํ๋์์ต๋๋ค.
runCatching๊ณผmapCatching์ ์ฌ์ฉํ ์๋ฌ ์ฒ๋ฆฌ๋ ์ฌ๋ฐ๋ฆ ๋๋ค.feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthContract.kt (3)
13-13: OAuth ํ ํฐ๊ณผ JWT ํ ํฐ ์ฒ๋ฆฌ ๋ถ๋ฆฌ๊ฐ ์ ์ด๋ฃจ์ด์ก์ต๋๋ค.
KakaoLoginSuccess์์refreshToken์ ์ ๊ฑฐํ๊ณprovider์accessToken๋ง ํฌํจํ๋๋ก ๋ณ๊ฒฝํ ๊ฒ์ OAuth ํ ํฐ ๊ตํ๊ณผ JWT ํ ํฐ ์ ์ฅ์ ๋ถ๋ฆฌํ๋ ์ข์ ์ํคํ ์ฒ ๊ฒฐ์ ์ ๋๋ค.
15-19: ์๋ก์ด JWT ํ ํฐ ์ ์ฅ ์ธํ ํธ๊ฐ ์ ์ค๊ณ๋์์ต๋๋ค.
SaveJwtToken์ธํ ํธ๋ ํ์ํ ๋ชจ๋ ์ ๋ณด(accessToken, refreshToken, isNewUser)๋ฅผ ํฌํจํ๊ณ ์์ด JWT ํ ํฐ ์ ์ฅ๊ณผ ์ ๊ท ์ฌ์ฉ์ ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๋ช ํํ๊ฒ ์ง์ํฉ๋๋ค.
25-25: Place ํ๋ฉด ๋ค๋น๊ฒ์ด์ ์ ์ํ ์ฌ์ด๋ ์ดํํธ๊ฐ ์ ์ ํ ์ถ๊ฐ๋์์ต๋๋ค.
NavigateToPlace์ฌ์ด๋ ์ดํํธ๋ ๊ธฐ์กด ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ํ ๋ฉ์ธ ํ๋ฉด์ผ๋ก ์ด๋ํ๋ ํ๋ก์ฐ๋ฅผ ๋ช ํํ๊ฒ ํํํฉ๋๋ค.remote/onboarding/src/main/java/com/teamsolply/solply/onboarding/service/OnBoardingService.kt (2)
14-17: ๋๋ค์ ์ค๋ณต ์ฒดํฌ API๊ฐ ์ ์ค๊ณ๋์์ต๋๋ค.GET ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ค์ ์ค๋ณต์ ์ฒดํฌํ๋ ๊ฒ์ REST ์์น์ ๋ง์ผ๋ฉฐ, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํ ๋๋ค์ ์ ๋ฌ๋ ์ ์ ํฉ๋๋ค.
19-22: ์ฌ์ฉ์ ์ ๋ณด ์ ๋ฐ์ดํธ API๊ฐ ์ ์ ํ ๊ตฌํ๋์์ต๋๋ค.PATCH ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ถ๋ถ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ์๋ฏธ์ ์ผ๋ก ์ฌ๋ฐ๋ฅด๋ฉฐ, ์์ฒญ DTO๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ๋ฌ๋ ํ์ ์์ ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthViewModel.kt (2)
19-22: OAuth ํ ํฐ ๊ตํ๊ณผ JWT ํ ํฐ ์ ์ฅ์ด ์ ๋ถ๋ฆฌ๋์์ต๋๋ค.
KakaoLoginSuccess์ฒ๋ฆฌ์์postSocialLogin์ ํธ์ถํ์ฌ OAuth ํ ํฐ์ JWT ํ ํฐ์ผ๋ก ๊ตํํ๋ ๋จ๊ณ์ ์ ๊ทผ ๋ฐฉ์์ ๋ช ํํ๊ณ ์ ์ง๋ณด์์ฑ์ด ์ข์ต๋๋ค.
28-41: JWT ํ ํฐ ์ ์ฅ๊ณผ ๋ค๋น๊ฒ์ด์ ๋ก์ง์ด ์ ์ ํ ๊ตฌํ๋์์ต๋๋ค.
SaveJwtToken์ธํ ํธ ์ฒ๋ฆฌ์์ ์ ๊ท ์ฌ์ฉ์ ์ฌ๋ถ์ ๋ฐ๋ผ ์จ๋ณด๋ฉ ๋๋ Place ํ๋ฉด์ผ๋ก ๋ถ๊ธฐํ๋ ๋ก์ง์ด ๋ช ํํ๊ณ ์ฌ๋ฐ๋ฆ ๋๋ค.feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingScreen.kt (2)
71-73: ๋๋ค์ ์ ๋ ฅ ์ฝ๋ฐฑ์ด ์ ์ ํ ๊ตฌํ๋์์ต๋๋ค.
changeInputNickname์ฝ๋ฐฑ์ ํตํด ๋๋ค์ ์ ๋ ฅ์ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋๋ก ๋ณ๊ฒฝํ ๊ฒ์ ์ํ ๊ด๋ฆฌ๋ฅผ ViewModel๋ก ์ง์คํํ๋ ์ข์ ์ํคํ ์ฒ ๊ฒฐ์ ์ ๋๋ค.
176-178: NamingScreen ํ๋ผ๋ฏธํฐ ์ ๋ฌ์ด ์ ๊ตฌํ๋์์ต๋๋ค.
inputNickname,isNicknameDuplicate,changeInputNicknameํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ์ฌ ๋๋ค์ ์ค๋ณต ์ฒดํฌ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๊ฒ์ด ์ ์ ํฉ๋๋ค.
| Log.d(TAG, "Request URL: ${newRequest.url}") | ||
| Log.d( | ||
| TAG, | ||
| "Authorization header: ${if (newRequest.header("Authorization") != null) "Bearer [REDACTED]" else "null"}" | ||
| ) |
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.
ํ๋ก๋์ ํ๊ฒฝ์์ ๋ฏผ๊ฐํ ์ ๋ณด ๋ก๊น ์ ๋ณด์ ์ํ์ด ์์ต๋๋ค.
์กฐ๊ฑด๋ถ ๋๋ฒ๊ทธ ๋ก๊น ์ ์ ๊ฑฐํ๊ณ ๋ชจ๋ ์์ฒญ์ ๋ํด URL๊ณผ ์ธ์ฆ ํค๋ ์ ๋ณด๋ฅผ ๋ฌด์กฐ๊ฑด ๋ก๊น ํ๋ ๊ฒ์ ๋ณด์์ ์ํํฉ๋๋ค. ํ๋ก๋์ ๋น๋์์๋ ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ๋ก๊ทธ์ ๋ ธ์ถ๋ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์์ ํ์ฌ ๋๋ฒ๊ทธ ๋น๋์์๋ง ๋ก๊น ํ๋๋ก ๊ฐ์ ํ์ธ์:
- Log.d(TAG, "Request URL: ${newRequest.url}")
- Log.d(
- TAG,
- "Authorization header: ${if (newRequest.header("Authorization") != null) "Bearer [REDACTED]" else "null"}"
- )
+ if (BuildConfig.DEBUG) {
+ Log.d(TAG, "Request URL: ${newRequest.url}")
+ Log.d(
+ TAG,
+ "Authorization header: ${if (newRequest.header("Authorization") != null) "Bearer [REDACTED]" else "null"}"
+ )
+ }๐ 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.
| Log.d(TAG, "Request URL: ${newRequest.url}") | |
| Log.d( | |
| TAG, | |
| "Authorization header: ${if (newRequest.header("Authorization") != null) "Bearer [REDACTED]" else "null"}" | |
| ) | |
| if (BuildConfig.DEBUG) { | |
| Log.d(TAG, "Request URL: ${newRequest.url}") | |
| Log.d( | |
| TAG, | |
| "Authorization header: ${if (newRequest.header("Authorization") != null) "Bearer [REDACTED]" else "null"}" | |
| ) | |
| } |
๐ค Prompt for AI Agents
In
core/network/src/main/java/com/teamsolply/solply/network/AccessTokenInterceptor.kt
around lines 35 to 39, the current code logs request URLs and authorization
headers unconditionally, which risks exposing sensitive information in
production logs. Modify the code to wrap these log statements inside a check
that ensures they only execute in debug builds, such as using a build
configuration flag or a debug mode check, to prevent sensitive data from being
logged in production environments.
| .currentBackStackEntryAsState().value?.destination | ||
|
|
||
| val startDestination = OnBoarding | ||
| val startDestination = Splash |
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
์์ ํ๋ฉด ๋ณ๊ฒฝ์ด ์ฑ ํ๋ก์ฐ์ ๋ฏธ์น๋ ์ํฅ์ ๊ฒ์ฆํ์ธ์.
์์ ํ๋ฉด์ OnBoarding์์ Splash๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ฑ์ ์ด๊ธฐ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ๋ฐ๊ฟ๋๋ค. ์คํ๋์ ํ๋ฉด์์ ์ ์ ํ ์์ ์ ์จ๋ณด๋ฉ์ด๋ OAuth ๋ก๊ทธ์ธ์ผ๋ก ์ด๋ํ๋ ๋ก์ง์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์ด ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
์คํ๋์ ํ๋ฉด์์ ์จ๋ณด๋ฉ/OAuth๋ก์ ๋ค๋น๊ฒ์ด์ ๋ก์ง์ ํ์ธํ์ธ์:
๐ Script executed:
#!/bin/bash
# ์คํ๋์ ํ๋ฉด์์ ๋ค๋ฅธ ํ๋ฉด์ผ๋ก์ ๋ค๋น๊ฒ์ด์
๋ก์ง ๊ฒ์
fd -t f -e kt | xargs grep -l "Splash" | xargs grep -A 10 -B 5 "navigate"Length of output: 17757
Splash ํ๋ฉด์์ ์จ๋ณด๋ฉ ๋ก์ง ๋๋ฝ ํ์ธ ๋ฐ ๋ณด์ ํ์
Splash๋ฅผ ์์ ํ๋ฉด์ผ๋ก ๋ณ๊ฒฝํ๋ฉด์ ์ค์ ๋ก OnBoarding์ผ๋ก์ ๋ค๋น๊ฒ์ด์
์ด ๋น ์ ธ ์๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. MainNavigator์๋ ์ฌ์ ํ navigateToOnboarding ๋ฉ์๋(import ํฌํจ)๊ฐ ๋จ์ ์์ผ๋, SplashNavigation ๋ฐ SplashScreen ์ชฝ์ ์จ๋ณด๋ฉ์ผ๋ก ์ด๋ํ๋ ์ฝ๋ฐฑ์ด ์ ๋ฌยท์ฒ๋ฆฌ๋์ง ์์ต๋๋ค.
์กฐ์น๊ฐ ํ์ํ ์์น:
- feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt
โขfun navigateToOnboarding(navOptions: NavOptions)์กด์ฌ - feature/main/src/main/java/com/teamsolply/solply/main/splash/SplashNavigation.kt
โขsplashNavGraphํธ์ถ๋ถ์ OnBoarding ์ฝ๋ฐฑ ์ ๋ฌ๋ถ ์์ - feature/main/src/main/java/com/teamsolply/solply/main/splash/SplashScreen.kt
โขSplashSideEffect์ OnBoarding ๊ด๋ จ ์ผ์ด์ค๊ฐ ์ ์๋์ด ์๋์ง ํ์ธ
์ ์
- ์ ๊ท ์ฌ์ฉ์์๊ฒ๋ง OnBoarding์ผ๋ก ๋ถ๊ธฐํ๋๋ก SplashViewModel์์ SideEffect๋ฅผ ์ถ๊ฐํ๊ณ , SplashNavigation์
navigateToOnboarding์ฝ๋ฐฑ์ ์ฐ๊ฒฐํ๊ฑฐ๋ - ์จ๋ณด๋ฉ ํ๋ก์ฐ ์์ฒด๋ฅผ ์์ ํ ์ ๊ฑฐํ๋ ค๋ฉด MainNavigator ๋ฐ ๊ด๋ จ import๋ฅผ ์ ๋ฆฌ
์ ์ฌํญ์ ๋ฐ์ํด ์ฑ ํ๋ก์ฐ๊ฐ ์๋ํ ๋๋ก ๋์ํ๋์ง ๊ฒ์ฆ ํ ์์ ๋ฐ๋๋๋ค.
๐ค Prompt for AI Agents
In feature/main/src/main/java/com/teamsolply/solply/main/MainNavigator.kt at
line 29 and related files, the navigation from Splash screen to OnBoarding is
missing despite the presence of navigateToOnboarding method. Fix this by adding
a SideEffect in SplashViewModel to trigger OnBoarding navigation for new users,
passing the navigateToOnboarding callback through SplashNavigation's
splashNavGraph, and handling the OnBoarding case in SplashScreen's
SplashSideEffect. Alternatively, if OnBoarding is to be removed, clean up
MainNavigator and imports accordingly. Verify the app flow works as intended
after these changes.
| release { | ||
| signingConfig = signingConfigs.getByName("debug") | ||
| isMinifyEnabled = false | ||
| proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") | ||
| } |
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.
๋ฆด๋ฆฌ์ฆ ๋น๋์์ ๋๋ฒ๊ทธ ํค์คํ ์ด ์ฌ์ฉ ๋ฐ ๋๋ ํ ๋นํ์ฑํ ๋ฌธ์
๋ฆด๋ฆฌ์ฆ ๋น๋์์ ๋๋ฒ๊ทธ ํค์คํ ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ์ฝ๋ ๋๋ ํ๊ฐ ๋นํ์ฑํ๋์ด ์์ต๋๋ค. ์ด๋ ๋ณด์์ ์ํํ ์ ์์ต๋๋ค.
๋ค์ ์์ ์ฌํญ์ ์ ์ฉํ์ธ์:
+ create("release") {
+ keyAlias = "release"
+ keyPassword = "your_release_password"
+ storeFile = File("${project.rootDir.absolutePath}/keystore/release.keystore")
+ }
}
buildTypes {
debug {
signingConfig = signingConfigs.getByName("debug")
}
release {
- signingConfig = signingConfigs.getByName("debug")
+ signingConfig = signingConfigs.getByName("release")
- isMinifyEnabled = false
+ isMinifyEnabled = true
+ isShrinkResources = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}๐ค Prompt for AI Agents
In app/build.gradle.kts around lines 22 to 26, the release build is incorrectly
using the debug signingConfig and has minify (code obfuscation) disabled, which
poses security risks. Change the signingConfig to use the proper release
keystore configuration instead of "debug" and enable minify by setting
isMinifyEnabled to true. Also, ensure the proguardFiles are correctly configured
for release builds to enable code obfuscation and optimization.
| @POST("api/auth/social/{soicialPlatform}/login") | ||
| suspend fun postSocialLogin( | ||
| @Path("soicialPlatform") soicialPlatform: String, | ||
| @Body oauthAccessToken: SocialLoginRequestDto | ||
| ): BaseResponse<SocialLoginResponseDto> |
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.
๊ฒฝ๋ก ๋งค๊ฐ๋ณ์๋ช ์คํ๊ฐ ์์ต๋๋ค.
@Path("soicialPlatform")์์ "soicialPlatform"์ "socialPlatform"์ผ๋ก ์์ ๋์ด์ผ ํฉ๋๋ค. ๋งค๊ฐ๋ณ์๋ช
๋ ํจ๊ป ์์ ํ๋ ๊ฒ์ด ์ข๊ฒ ์ต๋๋ค.
- @POST("api/auth/social/{soicialPlatform}/login")
+ @POST("api/auth/social/{socialPlatform}/login")
suspend fun postSocialLogin(
- @Path("soicialPlatform") soicialPlatform: String,
+ @Path("socialPlatform") socialPlatform: String,
@Body oauthAccessToken: SocialLoginRequestDto
): BaseResponse<SocialLoginResponseDto>๐ค Prompt for AI Agents
In
remote/oauth/src/main/java/com/teamsolply/solply/oauth/service/OauthService.kt
lines 11 to 15, there is a typo in the path parameter name "soicialPlatform"
which should be corrected to "socialPlatform". Update both the @Path annotation
and the corresponding function parameter name to "socialPlatform" to ensure
consistency and correct routing.
| provider: String, | ||
| oauthAccessToken: String | ||
| ): SocialLoginResponseDto = oauthService.postSocialLogin( | ||
| soicialPlatform = provider, |
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.
๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์คํ๋ฅผ ์์ ํด์ฃผ์ธ์.
soicialPlatform โ socialPlatform์ผ๋ก ์์ ํด์ผ ํฉ๋๋ค.
- soicialPlatform = provider,
+ socialPlatform = provider,๐ 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.
| soicialPlatform = provider, | |
| socialPlatform = provider, |
๐ค Prompt for AI Agents
In
remote/oauth/src/main/java/com/teamsolply/solply/oauth/datasource/OauthRemoteDataSourceImpl.kt
at line 16, there is a typo in the parameter name 'soicialPlatform'. Correct the
spelling to 'socialPlatform' to fix the issue.
| viewModelScope.launch { | ||
| onBoardingRepository.checkNicknameDuplicate(nickname = intent.nickname) | ||
| .onSuccess { | ||
| reduce { copy(isNicknameDuplicate = 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.
๐ ๏ธ Refactor suggestion
๋น๋๊ธฐ ์์ ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์.
๋๋ค์ ์ค๋ณต ๊ฒ์ฌ์์ ์คํจ ์ผ์ด์ค์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๋๋ฝ๋์์ต๋๋ค. ๋คํธ์ํฌ ์ค๋ฅ๋ ์๋ฒ ์ค๋ฅ ์ ์ฌ์ฉ์์๊ฒ ์ ์ ํ ํผ๋๋ฐฑ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
viewModelScope.launch {
onBoardingRepository.checkNicknameDuplicate(nickname = intent.nickname)
.onSuccess {
reduce { copy(isNicknameDuplicate = 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.
| viewModelScope.launch { | |
| onBoardingRepository.checkNicknameDuplicate(nickname = intent.nickname) | |
| .onSuccess { | |
| reduce { copy(isNicknameDuplicate = it) } | |
| } | |
| } | |
| viewModelScope.launch { | |
| onBoardingRepository.checkNicknameDuplicate(nickname = intent.nickname) | |
| .onSuccess { | |
| reduce { copy(isNicknameDuplicate = it) } | |
| } | |
| .onFailure { | |
| // ์ค๋ฅ ์ฒ๋ฆฌ ๋ก์ง ์ถ๊ฐ (์: ์๋ฌ ๋ฉ์์ง ํ์) | |
| } | |
| } |
๐ค Prompt for AI Agents
In
feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt
lines 46 to 51, the coroutine launched for checking nickname duplication handles
only the success case but lacks error handling. Add an onFailure block to handle
errors from checkNicknameDuplicate, and update the state or notify the user
appropriately to provide feedback on network or server errors.
๐ PR ์์ฝ
๐ฑ ์์ ํ ๋ด์ฉ
๐ฑ PR ํฌ์ธํธ
๐ธ ์คํฌ๋ฆฐ์ท
๐ฎ ๊ด๋ จ ์ด์
Summary by CodeRabbit
์ ๊ท ๊ธฐ๋ฅ
๊ธฐ๋ฅ ๊ฐ์
๋ฒ๊ทธ ์์
๊ตฌ์ฑ ๋ฐ ์์กด์ฑ