Skip to content

[Feat] Onboarding 모듈 생성 및 UseCase, Repository 추가 - #66

Merged
oungsi2000 merged 7 commits into
feat/41-onboardingfrom
feat/64-onboarding-usecase
Aug 8, 2026
Merged

[Feat] Onboarding 모듈 생성 및 UseCase, Repository 추가#66
oungsi2000 merged 7 commits into
feat/41-onboardingfrom
feat/64-onboarding-usecase

Conversation

@oungsi2000

@oungsi2000 oungsi2000 commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator

관련 이슈

#64

작업 내용

  • 온보딩 모듈 생성 및 UseCase와 Repository를 추가하였습니다.

변경사항 / 상세

  • 하나의 ViewModel에서 여러 Screen의 동작들을 처리하고자 합니다
  • 현재는 Terms의 경우 Uimodel이 조금 복잡하여 별개의 클래스로 분리했습니다. Immutable 의존성이 없어 dev에 추가 후ImmutableSet + @Immutable 어노테이션으로 변경하겠습니다.

중점 리뷰사항

  • OnboardingToken의 유효시간이 상당히 짧아. (10분) 일단 메모리 상에서만 두는 방식을 택했는데 (파라미터로 전달) 의견 부탁드립니다!
  • 이름 검증 및 패키지 구조 및 네이밍 관련

스크린샷 (선택)

Summary by CodeRabbit

  • 새로운 기능

    • 약관 동의부터 개인정보 입력, 가입 완료까지 온보딩 흐름을 추가했습니다.
    • 서비스·개인정보·AI 데이터·마케팅 약관의 개별 및 전체 동의를 지원합니다.
    • 이름 형식과 입력 길이를 자동으로 검증합니다.
    • 회원가입 완료 후 인증 정보를 저장하고 홈 화면으로 이동합니다.
  • 버그 수정

    • 회원가입 및 인증 정보 저장 실패 시 오류를 안내합니다.
    • 온보딩 단계별 필수 입력 누락을 감지합니다.
  • 테스트

    • 온보딩 진행, 입력 검증, 회원가입 성공·실패 시나리오를 검증했습니다.

@oungsi2000
oungsi2000 requested a review from Moony-H August 2, 2026 14:34
@oungsi2000 oungsi2000 self-assigned this Aug 2, 2026
@oungsi2000 oungsi2000 added the feature 새로운 기능 추가 label Aug 2, 2026
@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 2ce6e20b-8258-4318-8ddb-c61c00deba83

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

온보딩 입력과 약관 상태를 관리하는 모델 및 OnboardingViewModel을 추가했습니다. 회원가입 저장소와 SignUpUseCase를 구현하고, 인증 토큰 저장 흐름을 연결했습니다. 이름 검증, 회원가입, 취소 예외, 온보딩 상태 전환 테스트를 추가했습니다.

Changes

온보딩 회원가입

Layer / File(s) Summary
회원가입 도메인 계약과 유효성 검증
core/domain/src/main/java/com/kikidan/domain/model/onboarding/*, core/domain/src/main/java/com/kikidan/domain/repository/AuthRepository.kt, core/domain/src/main/java/com/kikidan/domain/usecase/SignUpUseCase.kt, core/domain/src/test/java/com/kikidan/domain/*
OnboardingTerm, UserName, AuthRepository.signup, SignUpUseCase를 추가했습니다. 이름 검증과 회원가입 성공·실패·토큰 저장 실패를 테스트합니다.
회원가입 원격 요청 구현
core/data/src/main/java/com/kikidan/data/repository/AuthRepositoryImpl.kt, core/data/src/test/java/com/kikidan/data/*
AuthRepositoryImpl.signup이 원격 회원가입을 호출하고 runCatchingCancellable로 결과를 반환합니다. 일반 예외와 CancellationException 처리를 테스트합니다.
온보딩 상태와 입력 모델
feature/onboarding/src/main/java/com/kikidan/onboarding/model/*
온보딩 단계, 약관 선택, 입력 상태, 진행 가능 여부 및 SignupSubmission 변환을 추가했습니다.
온보딩 상태 흐름과 회원가입 실행
feature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.kt, feature/onboarding/src/test/java/com/kikidan/onboarding/*, feature/onboarding/src/main/AndroidManifest.xml, feature/onboarding/.gitignore, feature/onboarding/proguard-rules.pro
OnboardingViewModel이 입력 변경, 단계 이동, 종료, 완료 및 회원가입 결과에 따른 사이드 이펙트를 관리합니다. 관련 Orbit 테스트와 모듈 기본 파일을 추가했습니다.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

Suggested reviewers: moony-h

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
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 (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed 온보딩 모듈 생성과 UseCase 및 Repository 추가라는 PR의 주요 변경사항을 명확하게 설명합니다.
Description check ✅ Passed 관련 이슈, 작업 내용, 상세 변경사항, 중점 리뷰사항을 포함하여 템플릿을 대부분 충족합니다.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch

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.

@oungsi2000

Copy link
Copy Markdown
Collaborator Author

@CodeRabbit review

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@oungsi2000
oungsi2000 force-pushed the feat/64-onboarding-usecase branch from 708a0ad to 7795626 Compare August 3, 2026 14:46
@oungsi2000
oungsi2000 force-pushed the feat/64-onboarding-usecase branch from 7795626 to de93d68 Compare August 3, 2026 15:29
@oungsi2000

Copy link
Copy Markdown
Collaborator Author

@CodeRabbit review

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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 은 검증 없이 임의 단계 이동을 허용합니다.

moveToStepcanProceed 를 확인하지 않습니다. 호출자가 마지막 단계로 바로 이동하면, 미입력 상태로 완료 화면에 도달할 수 있습니다. 진행률 표시용 되돌아가기 전용이라면 이름을 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] 온보딩 입력값에 대한 상태 보존을 검토하세요.

온보딩 입력은 이름, 생년월일, 성별 등 여러 단계에 걸쳐 누적됩니다. 현재 구성에서는 프로세스 종료 후 복귀 시 모든 입력이 초기화됩니다. 사용자는 처음 단계부터 다시 입력해야 합니다.

SavedStateHandlestep 과 주요 입력값을 보존하거나, 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 을 선언했지만, termsAgreementTermsAgreementUiModel 은 안정성 표기가 없고 내부에 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.signupResultFakeTokenRepository.saveResult 는 실패 값 주입이 가능한 var 입니다. 그러나 어떤 테스트도 실패 값을 사용하지 않습니다. 그래서 OnboardingSideEffect.Failure 경로와 토큰 저장 실패 경로가 검증되지 않습니다.

다음 두 케이스를 추가해 주세요.

  • signup 실패 시 Failure 사이드 이펙트가 발생하고 상태가 바뀌지 않는다.
  • 필수 입력이 비어 있을 때 onCompleteConfirmedInvalidInput 을 발생시킨다.

원하시면 테스트 코드를 작성해 드리겠습니다.

🤖 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

📥 Commits

Reviewing files that changed from the base of the PR and between 2aa874f and de93d68.

⛔ Files ignored due to path filters (4)
  • app/build.gradle.kts is excluded by !**/*.gradle.kts
  • core/domain/build.gradle.kts is excluded by !**/*.gradle.kts
  • feature/onboarding/build.gradle.kts is excluded by !**/*.gradle.kts
  • settings.gradle.kts is excluded by !**/*.gradle.kts
📒 Files selected for processing (19)
  • core/data/src/main/java/com/kikidan/data/repository/AuthRepositoryImpl.kt
  • core/data/src/test/java/com/kikidan/data/fake/FakeRemoteAuthDataSource.kt
  • core/data/src/test/java/com/kikidan/data/repository/AuthRepositoryImplTest.kt
  • core/domain/src/main/java/com/kikidan/domain/model/onboarding/OnboardingTerm.kt
  • core/domain/src/main/java/com/kikidan/domain/model/onboarding/UserName.kt
  • core/domain/src/main/java/com/kikidan/domain/repository/AuthRepository.kt
  • core/domain/src/main/java/com/kikidan/domain/usecase/SignUpUseCase.kt
  • core/domain/src/test/java/com/kikidan/domain/model/onboarding/UserNameTest.kt
  • core/domain/src/test/java/com/kikidan/domain/usecase/SignUpUseCaseTest.kt
  • feature/onboarding/.gitignore
  • feature/onboarding/consumer-rules.pro
  • feature/onboarding/proguard-rules.pro
  • feature/onboarding/src/main/AndroidManifest.xml
  • feature/onboarding/src/main/java/com/kikidan/onboarding/OnboardingViewModel.kt
  • feature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingSideEffect.kt
  • feature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingState.kt
  • feature/onboarding/src/main/java/com/kikidan/onboarding/model/OnboardingStep.kt
  • feature/onboarding/src/main/java/com/kikidan/onboarding/model/TermsAgreementUiModel.kt
  • feature/onboarding/src/test/java/com/kikidan/onboarding/OnboardingViewModelTest.kt

@oungsi2000
oungsi2000 force-pushed the feat/64-onboarding-usecase branch from ae928d0 to 3b74928 Compare August 4, 2026 13:58
Base automatically changed from feat/42-splash-login to feat/41-onboarding August 5, 2026 13:52
oungsi2000 and others added 7 commits August 5, 2026 22:52
신규 온보딩 기능을 위한 :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`를 별도 파일로 분리한다.
@oungsi2000
oungsi2000 force-pushed the feat/64-onboarding-usecase branch from 3b74928 to 5ff8152 Compare August 5, 2026 13:52
@oungsi2000
oungsi2000 merged commit aadfd85 into feat/41-onboarding Aug 8, 2026
3 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature 새로운 기능 추가

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants