[Feat] Onboarding 모듈 생성 및 UseCase, Repository 추가 - #66
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
📝 WalkthroughWalkthrough온보딩 입력과 약관 상태를 관리하는 모델 및 Changes온보딩 회원가입
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 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. Comment |
|
@CodeRabbit review |
✅ Action performedReview finished.
|
708a0ad to
7795626
Compare
7795626 to
de93d68
Compare
|
@CodeRabbit review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (4)
feature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.kt (2)
49-52: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value[P3]
moveToStep은 검증 없이 임의 단계 이동을 허용합니다.
moveToStep은canProceed를 확인하지 않습니다. 호출자가 마지막 단계로 바로 이동하면, 미입력 상태로 완료 화면에 도달할 수 있습니다. 진행률 표시용 되돌아가기 전용이라면 이름을moveToPreviousStep등으로 좁히거나, 이미 통과한 단계로만 이동을 허용하는 검증을 추가하세요.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@feature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.kt` around lines 49 - 52, Update OnboardingViewModel.moveToStep so callers cannot jump to arbitrary later steps without satisfying canProceed; either restrict it to previously completed steps or rename/narrow it to a previous-step-only operation, while preserving legitimate backward navigation.
25-32: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy lift[P2] 온보딩 입력값에 대한 상태 보존을 검토하세요.
온보딩 입력은 이름, 생년월일, 성별 등 여러 단계에 걸쳐 누적됩니다. 현재 구성에서는 프로세스 종료 후 복귀 시 모든 입력이 초기화됩니다. 사용자는 처음 단계부터 다시 입력해야 합니다.
SavedStateHandle로step과 주요 입력값을 보존하거나, Orbit 의container(savedStateHandle = ...)사용을 검토하세요.As per coding guidelines "상태 보존이 필요한 값은 SavedStateHandle 사용을 검토하세요."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@feature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.kt` around lines 25 - 32, Update OnboardingViewModel to preserve onboarding progress and accumulated inputs across process recreation by injecting SavedStateHandle and wiring it into the Orbit container via its saved-state support, or explicitly persisting/restoring the step and key fields through SavedStateHandle. Keep the existing OnboardingState and signUpUseCase behavior intact while ensuring restored state is used instead of always starting from a fresh OnboardingState.Source: Path instructions
feature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingState.kt (1)
24-27: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win[P2]
@Immutable약속과 실제 필드 안정성이 어긋납니다.
OnboardingState에@Immutable을 선언했지만,termsAgreement의TermsAgreementUiModel은 안정성 표기가 없고 내부에Set<OnboardingTerm>을 가집니다. Compose 컴파일러는kotlin.collections.Set을 불안정 타입으로 추론합니다. 그래서OnboardingState를 파라미터로 받는 Composable 이 리컴포지션을 스킵하지 못할 수 있습니다.PR 본문에 언급한
ImmutableSet도입을 이 PR에서 함께 적용하거나, 최소한TermsAgreementUiModel에@Immutable을 붙여 주세요.♻️ 제안: TermsAgreementUiModel 안정성 표기
+import androidx.compose.runtime.Immutable import com.kikidan.domain.model.onboarding.OnboardingTerm +@Immutable data class TermsAgreementUiModel( - val selected: Set<OnboardingTerm> = emptySet(), + val selected: ImmutableSet<OnboardingTerm> = persistentSetOf(), ) {As per coding guidelines "Composable 함수의 불필요한 리컴포지션 유발 요소(불안정 파라미터, 람다 재생성 등)가 있으면 P2로 안내합니다."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@feature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingState.kt` around lines 24 - 27, Update OnboardingState and its TermsAgreementUiModel dependency so the `@Immutable` contract is valid: prefer replacing the internal Set<OnboardingTerm> with the project’s ImmutableSet type, or at minimum annotate TermsAgreementUiModel with `@Immutable`. Keep the existing OnboardingState fields and defaults unchanged.Source: Path instructions
feature/onboarding/src/test/java/com/kikidan/onboarding/OnboardingViewModelTest.kt (1)
242-265: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win[P2] 실패 경로 테스트가 없습니다.
FakeAuthRepository.signupResult와FakeTokenRepository.saveResult는 실패 값 주입이 가능한var입니다. 그러나 어떤 테스트도 실패 값을 사용하지 않습니다. 그래서OnboardingSideEffect.Failure경로와 토큰 저장 실패 경로가 검증되지 않습니다.다음 두 케이스를 추가해 주세요.
- signup 실패 시
Failure사이드 이펙트가 발생하고 상태가 바뀌지 않는다.- 필수 입력이 비어 있을 때
onCompleteConfirmed가InvalidInput을 발생시킨다.원하시면 테스트 코드를 작성해 드리겠습니다.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@feature/onboarding/src/test/java/com/kikidan/onboarding/OnboardingViewModelTest.kt` around lines 242 - 265, Extend OnboardingViewModelTest to cover the injectable failure paths in FakeAuthRepository.signupResult and FakeTokenRepository.saveResult: verify signup failure emits OnboardingSideEffect.Failure without changing state, and verify onCompleteConfirmed with required inputs empty emits InvalidInput. Reuse the existing test setup and assertions for side effects and state.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@feature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.kt`:
- Around line 75-80: Update the success handling around the onboarding signup
request so it either removes the unused SIGN_UP_COMPLETE dialog or defers
NavigateToHome until the dialog confirmation action, preventing both from being
triggered together. In the onFailure handler, preserve the caught exception e by
logging it or passing it through the existing OnboardingSideEffect.Failure
representation.
- Around line 65-81: Prevent duplicate submissions in onCompleteConfirmed by
adding a submission-in-progress flag to OnboardingState, returning immediately
when it is already set, and setting it before invoking signUpUseCase. Clear the
flag on both success and failure, and reuse it for the completion button’s
disabled state if applicable.
---
Nitpick comments:
In
`@feature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingState.kt`:
- Around line 24-27: Update OnboardingState and its TermsAgreementUiModel
dependency so the `@Immutable` contract is valid: prefer replacing the internal
Set<OnboardingTerm> with the project’s ImmutableSet type, or at minimum annotate
TermsAgreementUiModel with `@Immutable`. Keep the existing OnboardingState fields
and defaults unchanged.
In
`@feature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.kt`:
- Around line 49-52: Update OnboardingViewModel.moveToStep so callers cannot
jump to arbitrary later steps without satisfying canProceed; either restrict it
to previously completed steps or rename/narrow it to a previous-step-only
operation, while preserving legitimate backward navigation.
- Around line 25-32: Update OnboardingViewModel to preserve onboarding progress
and accumulated inputs across process recreation by injecting SavedStateHandle
and wiring it into the Orbit container via its saved-state support, or
explicitly persisting/restoring the step and key fields through
SavedStateHandle. Keep the existing OnboardingState and signUpUseCase behavior
intact while ensuring restored state is used instead of always starting from a
fresh OnboardingState.
In
`@feature/onboarding/src/test/java/com/kikidan/onboarding/OnboardingViewModelTest.kt`:
- Around line 242-265: Extend OnboardingViewModelTest to cover the injectable
failure paths in FakeAuthRepository.signupResult and
FakeTokenRepository.saveResult: verify signup failure emits
OnboardingSideEffect.Failure without changing state, and verify
onCompleteConfirmed with required inputs empty emits InvalidInput. Reuse the
existing test setup and assertions for side effects and state.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 41311f37-2be5-424b-abc4-864446458d58
⛔ Files ignored due to path filters (4)
app/build.gradle.ktsis excluded by!**/*.gradle.ktscore/domain/build.gradle.ktsis excluded by!**/*.gradle.ktsfeature/onboarding/build.gradle.ktsis excluded by!**/*.gradle.ktssettings.gradle.ktsis excluded by!**/*.gradle.kts
📒 Files selected for processing (19)
core/data/src/main/java/com/kikidan/data/repository/AuthRepositoryImpl.ktcore/data/src/test/java/com/kikidan/data/fake/FakeRemoteAuthDataSource.ktcore/data/src/test/java/com/kikidan/data/repository/AuthRepositoryImplTest.ktcore/domain/src/main/java/com/kikidan/domain/model/onboarding/OnboardingTerm.ktcore/domain/src/main/java/com/kikidan/domain/model/onboarding/UserName.ktcore/domain/src/main/java/com/kikidan/domain/repository/AuthRepository.ktcore/domain/src/main/java/com/kikidan/domain/usecase/SignUpUseCase.ktcore/domain/src/test/java/com/kikidan/domain/model/onboarding/UserNameTest.ktcore/domain/src/test/java/com/kikidan/domain/usecase/SignUpUseCaseTest.ktfeature/onboarding/.gitignorefeature/onboarding/consumer-rules.profeature/onboarding/proguard-rules.profeature/onboarding/src/main/AndroidManifest.xmlfeature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingSideEffect.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingState.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingStep.ktfeature/onboarding/src/main/java/com/kikidan/onboarding/model/TermsAgreementUiModel.ktfeature/onboarding/src/test/java/com/kikidan/onboarding/OnboardingViewModelTest.kt
ae928d0 to
3b74928
Compare
신규 온보딩 기능을 위한 :feature:onboarding 모듈을 생성하고 app 모듈에 의존성을 추가한다. settings.gradle.kts에 모듈을 등록하여 전체 프로젝트 빌드 구성에 포함한다.
회원가입 성공 시 발급된 토큰을 TokenRepository에 저장하도록 SignUpUseCase를 구현한다. OnboardingTerm enum으로 서비스 이용약관 및 마케팅 수신 동의 항목의 필수 여부를 정의한다. 도메인 레이어의 비즈니스 로직 검증을 위해 junit 및 coroutines-test 의존성을 추가한다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01299PBN5qzgPtdnPH2e25rs
UserName의 유효성 검사 로직과 SignUpUseCase의 토큰 저장 흐름을 검증하는 테스트를 추가한다. - UserName: 한글·영문·숫자 허용, 특수문자 및 이모지 제한, 최대 길이 및 앞뒤 공백 제거 로직 검증 - SignUpUseCase: 회원가입 성공 시 토큰 저장 여부와 성공/실패 시의 결과 전파 로직 검증
AuthRepository에 signup API를 연동하고 runCatchingCancellable을 적용하여 코루틴 취소가 적절히 전파되도록 구현한다. 온보딩 모듈에는 Orbit MVI를 도입하여 단계별 입력 상태를 관리한다. - OnboardingStep: 약관 동의, 이름, 생년월일, 추가 질문 단계 정의 및 진행률 계산 - TermsAgreementUiModel: 필수 약관 동의 여부 검증 및 전체 선택 로직 처리 - OnboardingViewModel: 각 단계별 유효성 검증(canProceed)과 최종 가입 요청 및 화면 전환 처리 - 테스트 코드를 통해 스텝별 유효성 검사, 뒤로가기 동작, 그리고 가입 완료 로직을 검증한다.
OnboardingState, OnboardingStep, OnboardingSideEffect 및 TermsAgreementUiModel 등 UI 상태와 관련된 클래스들을 `com.kikidan.onboarding.model` 패키지로 이동하여 모듈 내부 구조를 정리한다. 클래스 위치 변경에 따라 OnboardingViewModel과 관련 테스트 코드의 import 경로를 수정한다. Co-Authored-By: Claude 3.5 Sonnet <noreply@anthropic.com>
회원가입 요청 시 `isSubmitting` 상태를 추가하여 중복 요청을 방지한다. 성공 시 즉시 홈으로 이동하는 대신 `PermissionRequest` 사이드 이펙트를 먼저 발생시키며, `Failure` 사이드 이펙트에 `Throwable`을 포함하여 실패 원인을 전달하도록 수정한다. 최종 완료 확인(`onSignUpCompleteConfirmed`) 시점에 다이얼로그를 닫고 홈 화면으로 이동한다.
회원가입 성공 시 완료 다이얼로그를 띄우는 대신 `OnboardingStep.COMPLETE` 단계로 진입하도록 변경한다. 완료 단계는 진행바 비율을 갖지 않으며, 이전 단계로의 이동을 허용하지 않는다. 테스트 코드 가독성을 위해 `FakeAuthRepository`와 `FakeTokenRepository`를 별도 파일로 분리한다.
3b74928 to
5ff8152
Compare
관련 이슈
#64
작업 내용
변경사항 / 상세
@Immutable어노테이션으로 변경하겠습니다.중점 리뷰사항
스크린샷 (선택)
Summary by CodeRabbit
새로운 기능
버그 수정
테스트