Skip to content

NR-148 회원가입 및 로그인 화면을 compose로 마이그레이션한다#149

Merged
juhwankim-dev merged 4 commits into
developfrom
feature/NR-148
May 30, 2026
Merged

NR-148 회원가입 및 로그인 화면을 compose로 마이그레이션한다#149
juhwankim-dev merged 4 commits into
developfrom
feature/NR-148

Conversation

@juhwankim-dev

Copy link
Copy Markdown
Member

회원가입 및 로그인 화면을 compose로 마이그레이션한다 !

순차적 마이그레이션 중 😉

특이사항 없음

@juhwankim-dev juhwankim-dev self-assigned this May 30, 2026
@github-actions

Copy link
Copy Markdown

🤖 AI Code Review (Gemini)

안녕하세요! NextRoom 프로젝트의 PR을 검토하게 되어 기쁩니다.
NR-148 회원가입 및 로그인 화면을 Compose로 마이그레이션하는 작업은 프로젝트의 현대화 전략에 매우 중요한 단계입니다.
제출해주신 코드 변경사항을 면밀히 검토했습니다.


🟢 전반적인 평가

이 PR은 회원가입 및 로그인 화면을 Jetpack Compose로 성공적으로 마이그레이션했습니다. 기존 View Binding 및 Orbit MVI 기반의 구현을 Flow 기반의 Compose UI로 전환하는 과정에서 프로젝트의 Clean Architecture 원칙과 최신 Android 개발 모범 사례를 잘 따르고 있습니다. ViewModel은 Orbit MVI에서 Flow 기반의 상태 관리로 전환되었으며, UI는 Compose 컴포저블로 재작성되었습니다. 몇 가지 사소한 개선 사항이 있지만, 전반적으로 매우 긍정적인 변경입니다.


📝 파일별 상세 리뷰

1. presentation/src/main/java/com/nextroom/nextroom/presentation/ui/login/EmailLoginEvent.kt (removed)

2. presentation/src/main/java/com/nextroom/nextroom/presentation/ui/login/EmailLoginState.kt (removed)

3. presentation/src/main/res/layout/fragment_email_login.xml (removed)

4. presentation/src/main/res/layout/fragment_login.xml (removed)

5. presentation/src/main/res/layout/fragment_signup.xml (removed)

  • 🟢 긍정적: Orbit MVI의 sideEffectstate 인터페이스/데이터 클래스, 그리고 View Binding을 위한 XML 레이아웃 파일들이 제거되었습니다. 이는 Compose 마이그레이션의 핵심적인 부분이며, 프로젝트의 Orbit MVI 단계적 폐지 전략에 완벽하게 부합합니다.

6. presentation/src/main/java/com/nextroom/nextroom/presentation/ui/login/EmailLoginFragment.kt (modified)

  • 🟢 긍정적: BaseFragment에서 ComposeBaseViewModelFragment로 성공적으로 전환되었습니다.
  • 🟢 긍정적: onCreateView에서 ComposeView를 설정하고 ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed를 적용한 것은 올바른 Compose 통합 방식입니다.
  • 🟢 긍정적: initSubscribe를 통해 uiEventloginState Flow를 수집하는 방식은 Compose 기반 Fragment에서 권장되는 패턴입니다.
  • 🟢 긍정적: safeNavigate 확장 함수를 사용하여 안전한 내비게이션을 유지하고 있습니다.
  • 🟢 긍정적: 고객 서비스 및 회원가입 웹뷰를 여는 로직이 private 함수로 잘 분리되어 가독성이 향상되었습니다.

7. presentation/src/main/java/com/nextroom/nextroom/presentation/ui/login/EmailLoginViewModel.kt (modified)

  • 🟢 긍정적: Orbit MVI (BaseViewModel, container, intent, reduce, postSideEffect)에서 Flow 기반 (NewBaseViewModel, MutableStateFlow, MutableSharedFlow)으로 성공적으로 마이그레이션되었습니다. 이는 ViewModel의 상태 관리 현대화에 있어 매우 중요한 변경입니다.

  • 🟢 긍정적: UI 상태는 _uiState (MutableStateFlow)로, 일회성 이벤트는 _uiEvent (MutableSharedFlow)로 명확하게 분리하여 관리하고 있습니다.

  • 🟢 긍정적: 상태 업데이트는 불변성을 유지하며 _uiState.update { it.copy(...) }를 통해 이루어지고 있습니다.

  • 🟢 긍정적: adminRepository.loggedIn Flow를 stateIn으로 수집하여 로그인 상태를 지속적으로 관찰하는 방식이 좋습니다.

  • 🟢 긍정적: checkEmailSaved()가 ViewModel의 init 블록에서 호출되어 초기 상태 설정이 적절하게 이루어집니다.

  • 💡 Suggestion: inputEmail 함수에서 사용자가 이메일을 입력할 때 hasError 상태를 false로 초기화하는 것이 일반적인 사용자 경험입니다. 현재는 inputPassword에서만 hasError = false를 설정하고 있습니다.

    • Action: inputEmail 함수에도 _uiState.update { it.copy(currentEmailInput = email, hasError = false) }를 추가하여 에러 상태를 초기화하도록 합니다.

8. presentation/src/main/java/com/nextroom/nextroom/presentation/ui/login/SignupFragment.kt (modified)

  • 🟢 긍정적: EmailLoginFragment와 동일하게 ComposeBaseViewModelFragment로 성공적으로 마이그레이션되었습니다.

  • 🟢 긍정적: onCreateView에서 ComposeView를 설정하고 SignupScreen 컴포저블을 사용합니다.

  • 🟢 긍정적: setFragmentResultListeners를 통해 BottomSheet로부터 결과를 받아 처리하는 로직이 잘 유지되고 있습니다.

  • 🟡 Warning: handleFragmentResults 함수 내에서 BundleCompat.getParcelable을 호출할 때 bundle 대신 this를 사용하고 있습니다. 이는 bundle 변수를 잘못 참조한 것으로 보입니다.

    • Action: SignupFragment.kt L71: BundleCompat.getParcelable(this, ...)BundleCompat.getParcelable(bundle, ...)로 수정해야 합니다.

9. presentation/src/main/java/com/nextroom/nextroom/presentation/ui/login/SignupViewModel.kt (modified)

  • 🟢 긍정적: uiState를 여러 MutableStateFlowcombine하여 생성하는 방식이 매우 좋습니다. Inputs 데이터 클래스를 도입하여 관련 입력 필드 상태를 묶어 관리하는 것은 코드의 가독성과 유지보수성을 크게 향상시킵니다.

  • 🟢 긍정적: customSignupSourcecustomSignupReason 필드가 UIState.Loaded에 추가되어 "기타" 선택 시 사용자 정의 입력 값을 관리할 수 있게 되었습니다.

  • 🟢 긍정적: allRequiredFieldFilled 로직이 필수 필드(매장명, 가입 경로, 서비스 약관 동의)를 정확하게 검증하고 있습니다.

  • 💡 Suggestion: UIState.LoadedcustomSignupSourcecustomSignupReason은 현재 String? 타입입니다. SignupFragment에서 "기


This review was automatically generated using Gemini AI. Please use your judgment when addressing the feedback.

@juhwankim-dev

Copy link
Copy Markdown
Member Author

7번 리뷰는 타탕하여 반영함
8번 리뷰는 this가 bundle인데 ai가 잘못해석함. 오히려 this로 접근하는게 더 적절함

@juhwankim-dev juhwankim-dev merged commit b9dc68f into develop May 30, 2026
1 check failed
@juhwankim-dev juhwankim-dev deleted the feature/NR-148 branch May 30, 2026 11:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant