Skip to content

Conversation

@wjdrjs00
Copy link
Collaborator

@wjdrjs00 wjdrjs00 commented Jan 12, 2026

Related issue 🛠

Work Description ✏️

  • 로그인 성공/실패 로직을 개선했습니다.
  • 로그인/회원가입 화면에서 인증번호 재요청이 되지 않던 이슈 수정

Screenshot 📸

  • N/A

Uncompleted Tasks 😅

  • N/A

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 회원가입 및 로그인 중 로딩 상태 추가로 사용자 경험 개선
  • 버그 수정

    • 인증 요청 중 재시도 방지 로직 강화
    • 오류 메시지 처리 및 표시 개선
    • 자식 계정 네비게이션 흐름 수정
    • 백스택 관리 개선
  • 스타일

    • 휴대폰 번호 입력 필드 플레이스홀더 형식 변경 (010-1234-5678 → 01012345678)
    • 버튼 터치 반응 효과 제거

✏️ Tip: You can customize this high-level summary in your review settings.

@wjdrjs00 wjdrjs00 self-assigned this Jan 12, 2026
@coderabbitai
Copy link

coderabbitai bot commented Jan 12, 2026

📋 설명

이 PR은 로그인/회원가입 흐름에서 로딩 상태 관리를 추가하고 에러 처리를 개선하며, UI 텍스트 및 버튼 동작을 조정합니다. 또한 디자인 시스템의 버튼 컴포넌트를 리플 효과 없이 변경하고 네비게이션 백스택 처리를 최적화합니다.

📊 변경사항

코호트 / 파일(들) 변경 요약
로딩 상태 관리 추가
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signin/model/SignInUiState.kt, feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/model/SignUpPhoneAuthUiState.kt
두 UI 상태 클래스에 isLoading: Boolean 속성 추가 및 false로 초기화
SignIn 흐름 개선
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signin/SignInViewModel.kt, feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signin/SignInScreen.kt
로딩 상태 가드 추가, 재진입 방지, 에러 로깅(Timber) 개선, CHILD 역할의 네비게이션 경로 변경(GuardianHome), 플레이스홀더 텍스트 수정, 버튼 활성화 조건 제거
SignUp 흐름 개선
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/SignUpSharedViewModel.kt, feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/SignUpPhoneAuthScreen.kt
로딩 상태 사전 확인 및 가드 추가, 표준화된 한글 에러 메시지 적용, 플레이스홀더 텍스트 수정, 버튼 활성화 조건 제거
버튼 컴포넌트 리팩토링
core/designsystem/src/main/kotlin/com/moa/app/designsystem/component/core/button/MaButton.kt
clickable 수정자를 clickableWithoutRipple로 교체, 리플 인디케이션 제거
네비게이션 최적화
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/splash/SplashViewModel.kt
네비게이션 옵션에 clearBackStack = true 추가

⏱️ 코드 리뷰 예상 난이도

🎯 2 (Simple) | ⏱️ ~12 분

🔗 관련 PR

🐰 축하 시

🎉 로딩 상태를 다루며, 에러도 잡고,

리플 없는 버튼으로 매끄럽게 탭하고,

백스택을 정리하니, 네비게이션도 깔끔하네! 🚀

온보딩 흐름이 한층 견고해졌어요! ✨

🚥 Pre-merge checks | ✅ 3 | ❌ 2
❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning MaButton의 클릭 이펙트 변경(clickable → clickableWithoutRipple)은 로그인 로직과 무관한 변경사항입니다. MaButton의 ripple 제거 변경을 별도 PR로 분리하거나, 이 변경이 #74 요구사항과의 관련성을 명확히 설명해주세요.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 '로그인 성공/실패 로직을 개선합니다'로 변경사항의 핵심을 명확하게 설명하고 있습니다.
Description check ✅ Passed PR 설명은 관련 이슈 #74, 작업 내용, 스크린샷 상태를 포함하여 저장소 템플릿 구조를 대부분 따르고 있습니다.
Linked Issues check ✅ Passed PR 변경사항이 #74의 요구사항(로그인 성공 시 역할 분기처리, 로그인 실패 시 상세 예외 처리)을 모두 충족합니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signin/SignInViewModel.kt (1)

72-90: signIn()에서 로딩 상태 관리가 누락되었습니다.

requestAuthCode()와 달리 signIn()에서는 API 호출 전 isLoading = true 설정과 완료 후 isLoading = false 리셋이 누락되어 있습니다. 이로 인해:

  1. 로그인 중 로딩 UI가 표시되지 않습니다.
  2. 성공/실패 시 isLoading이 리셋되지 않아 이전 상태가 유지됩니다.
🔧 제안하는 수정 사항
 fun signIn() {
     viewModelScope.launch {
         if (_uiState.value.isLoading) return@launch
+        _uiState.update { it.copy(isLoading = true) }
         val phoneNumber = _uiState.value.phoneNumber
         val authCode = _uiState.value.authCode
         signInUseCase(phoneNumber, authCode).fold(
-            onSuccess = { userRole -> handleNavigationForRole(userRole) },
+            onSuccess = { userRole ->
+                _uiState.update { it.copy(isLoading = false) }
+                handleNavigationForRole(userRole)
+            },
             onFailure = { error ->
                 Timber.e("signIn: $error")
                 _uiState.update {
                     it.copy(
+                        isLoading = false,
                         isAuthCodeError = true,
                         authCodeErrorMessage = "인증번호가 일치하지 않아요.\n다시 확인해주세요.",
                     )
                 }
             },
         )
     }
 }
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/splash/SplashViewModel.kt (1)

56-64: clearBackStack = true를 사용하면 popUpTo 옵션은 무시되므로 제거하세요.

Kdoc에 따르면 clearBackStack = truepopUpTo 옵션보다 우선하며 전체 스택을 초기화합니다. 실제 구현(ObserveNavigationEvents.kt)도 clearBackStack이 활성화되면 독립적으로 popUpTo(navController.graph.id)를 실행하여, 지정된 popUpTo = AppRoute.Splashinclusive = true는 무시됩니다. 이 조합은 혼동을 초래할 수 있으므로 다음과 같이 정리하는 것을 권장합니다:

options = NavigationOptions(
    clearBackStack = true
)

전체 백스택 초기화가 의도라면 popUpToinclusive는 불필요합니다.

🧹 Nitpick comments (4)
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signin/SignInScreen.kt (1)

169-171: isLoading 상태를 버튼 비활성화에 활용하는 것을 고려해 주세요.

SignInUiStateisLoading 프로퍼티가 추가되었지만, 인증 확인 버튼과 인증 요청 버튼에서 로딩 중 비활성화 처리가 되어 있지 않습니다. API 호출 중 중복 요청을 방지하려면 버튼의 enabled 조건에 !uiState.isLoading을 추가하는 것이 좋습니다.

♻️ 제안하는 수정 사항
 MaButton(
     onClick = onAuthConfirmClick,
-    enabled = uiState.authCode.isNotEmpty(),
+    enabled = uiState.authCode.isNotEmpty() && !uiState.isLoading,
     modifier = Modifier

인증 요청 버튼(Line 120-131)에도 동일하게 적용:

MaButton(
    onClick = onAuthCodeRequestClick,
    enabled = !uiState.isLoading,  // 추가
    colors = MaButtonDefaults.maBlackButtonColors(),
    ...
)
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/SignUpPhoneAuthScreen.kt (1)

171-173: isLoading 상태를 버튼 비활성화에 활용하는 것을 고려해 주세요.

SignInScreen과 동일하게, SignUpPhoneAuthUiState에 추가된 isLoading 프로퍼티가 버튼 비활성화에 사용되지 않고 있습니다. ViewModel에서 중복 요청 방지를 하고 있지만, UI 레벨에서도 로딩 중 버튼을 비활성화하면 사용자에게 더 명확한 피드백을 제공할 수 있습니다.

♻️ 제안하는 수정 사항
 MaButton(
     onClick = onAuthConfirmClick,
-    enabled = uiState.authCode.isNotEmpty(),
+    enabled = uiState.authCode.isNotEmpty() && !uiState.isLoading,
     modifier = Modifier
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/SignUpSharedViewModel.kt (2)

112-113: signUp 성공 시 isLoading 상태 리셋 누락 확인

signUp 성공 시 isLoading = false를 설정하지 않고 바로 네비게이션됩니다. 현재 navigateToCompletepopUpTo로 화면을 제거하므로 실질적인 문제는 없지만, 네비게이션 지연이나 실패 시 로딩 상태가 유지될 수 있습니다. 명시적으로 리셋하는 것이 더 안전합니다.

♻️ 제안하는 수정 사항
 ).fold(
-    onSuccess = { navigateToComplete() },
+    onSuccess = {
+        _signUpPhoneAuthUiState.update { it.copy(isLoading = false) }
+        navigateToComplete()
+    },
     onFailure = { error ->

91-91: 하드코딩된 에러 메시지에 대해 문자열 리소스 사용을 고려해 주세요.

에러 메시지가 한국어로 하드코딩되어 있습니다. 다국어 지원이 필요한 경우 strings.xml 리소스를 사용하는 것이 좋습니다. 현재 한국어만 지원한다면 문제없지만, 향후 확장성을 위해 참고하시기 바랍니다.

Also applies to: 119-119

📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 563ff79 and b2ffc46.

📒 Files selected for processing (8)
  • core/designsystem/src/main/kotlin/com/moa/app/designsystem/component/core/button/MaButton.kt
  • feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signin/SignInScreen.kt
  • feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signin/SignInViewModel.kt
  • feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signin/model/SignInUiState.kt
  • feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/SignUpPhoneAuthScreen.kt
  • feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/SignUpSharedViewModel.kt
  • feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/model/SignUpPhoneAuthUiState.kt
  • feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/splash/SplashViewModel.kt
🧰 Additional context used
🧬 Code graph analysis (1)
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signin/SignInViewModel.kt (1)
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/splash/SplashViewModel.kt (2)
  • handleNavigationForRole (47-54)
  • navigateToRoute (56-65)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Run Unit Tests
🔇 Additional comments (9)
core/designsystem/src/main/kotlin/com/moa/app/designsystem/component/core/button/MaButton.kt (1)

28-28: clickableWithoutRipple 확장 함수 구현 확인됨

clickableWithoutRipple 확장 함수는 core/ui/src/main/java/com/moa/app/ui/extension/Modifier.kt에서 올바르게 구현되어 있으며, indication = null로 설정되어 리플 효과를 제거합니다. interactionSourceisPressed 상태를 통한 커스텀 프레스 피드백 유지를 위해 전달됩니다. 변경사항은 적절합니다.

feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signin/model/SignInUiState.kt (1)

4-5: LGTM!

isLoading 프로퍼티 추가와 초기화가 적절합니다. 로딩 상태를 UI 상태 클래스에서 명시적으로 관리하는 좋은 패턴입니다.

Also applies to: 14-15

feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/model/SignUpPhoneAuthUiState.kt (1)

4-5: LGTM!

SignInUiState와 일관된 패턴으로 isLoading 프로퍼티가 추가되었습니다. 온보딩 플로우 전반에 걸쳐 로딩 상태 관리가 통일되어 있습니다.

Also applies to: 14-15

feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signin/SignInScreen.kt (1)

114-114: LGTM!

플레이스홀더 텍스트가 하이픈 없는 전화번호 형식으로 변경되었습니다.

feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/SignUpPhoneAuthScreen.kt (1)

116-116: LGTM!

SignInScreen과 일관되게 플레이스홀더 텍스트가 업데이트되었습니다.

feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/SignUpSharedViewModel.kt (1)

76-97: LGTM!

isLoading 가드와 상태 전환이 적절하게 구현되어 있습니다. 중복 API 호출 방지와 에러 처리가 잘 되어 있습니다.

feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signin/SignInViewModel.kt (3)

32-32: LGTM!

타입 추론을 사용한 리팩토링으로 코드가 더 간결해졌습니다.


46-70: LGTM!

로딩 상태 관리와 에러 처리가 적절하게 구현되었습니다. 동시 요청 방지 가드, API 호출 전/후 로딩 상태 업데이트, 그리고 성공/실패 시 적절한 UI 상태 업데이트가 잘 되어 있습니다.


92-99: LGTM!

UserRole.CHILD에 대한 네비게이션이 SplashViewModel의 동작과 일치하도록 GuardianHome으로 수정되었습니다.

@wjdrjs00 wjdrjs00 merged commit 16600e3 into develop Jan 12, 2026
4 checks passed
@wjdrjs00 wjdrjs00 deleted the refactor/74-signin-logic branch January 12, 2026 17:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Refactor] 로그인 성공/실패 로직을 개선합니다.

2 participants