-
Notifications
You must be signed in to change notification settings - Fork 0
[Feature/#156] QA2 반영 및 api변경사항 관련 수정 #157
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온보딩 및 OAuth 플로우를 통합하여 Google 로그인 옵션으로 변경하고, 정책 동의 데이터를 추가하며, 마을 엔티티 구조를 평탄화(ParentTownEntity/SubTownEntity)하고, 상태 기반 관리로 AllowClauseScreen을 리팩토링합니다. Changes
Sequence Diagram(s)sequenceDiagram
actor User
participant AllowClauseScreen as AllowClauseScreen<br/>(UI)
participant OnBoardingViewModel as OnBoardingViewModel
participant OnBoardingRepository as OnBoardingRepository
participant API as Backend API
User->>AllowClauseScreen: 정책 항목 클릭/전체 동의
AllowClauseScreen->>OnBoardingViewModel: ChangeAgree14/Service/Privacy<br/>(인텐트 발행)
OnBoardingViewModel->>OnBoardingViewModel: 상태 업데이트<br/>(agree14/agreeService/<br/>agreePrivacy)
AllowClauseScreen->>AllowClauseScreen: 상태 반영하여 UI 업데이트
User->>AllowClauseScreen: "다음" 버튼 클릭
AllowClauseScreen->>OnBoardingViewModel: onNextClick()
OnBoardingViewModel->>OnBoardingViewModel: PolicyAgreementInfoEntity 리스트 생성<br/>(policyId: 1,2,3 +<br/>현재 동의 상태)
OnBoardingViewModel->>OnBoardingRepository: patchUserInfo()<br/>(policyAgreementInfos 포함)
OnBoardingRepository->>OnBoardingRepository: policyAgreementInfos.map<br/>{ it.toDto() }
OnBoardingRepository->>API: PATCH /user/info<br/>(PatchUserInfoRequestDto)
API-->>OnBoardingRepository: UserInfoEntity
OnBoardingRepository-->>OnBoardingViewModel: Result<UserInfoEntity>
OnBoardingViewModel->>OnBoardingViewModel: isOnBoardingSuccess = true
sequenceDiagram
participant API as Backend API
participant TownEntitiyMapper as TownEntitiyMapper
participant SelectTownScreen as SelectTownScreen<br/>(UI)
API-->>TownEntitiyMapper: GetAllTownResponseDto<br/>(towns with parentTownId)
TownEntitiyMapper->>TownEntitiyMapper: 필터: parentTownId==null<br/>→ parentTowns 리스트 생성
TownEntitiyMapper->>TownEntitiyMapper: 그룹화: parentTownId별로<br/>SubTownEntity 정렬
TownEntitiyMapper-->>SelectTownScreen: TownEntity<br/>(parentTowns: List<ParentTownEntity>)
SelectTownScreen->>SelectTownScreen: 좌측 지역 목록: ParentTownEntity
SelectTownScreen->>SelectTownScreen: 우측 마을 목록: 선택된<br/>ParentTownEntity.subTowns
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes
Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Tip 📝 Customizable high-level summaries are now available in beta!You can now customize how CodeRabbit generates the high-level summary in your pull requests — including its content, structure, tone, and formatting.
Example instruction:
Note: This feature is currently in beta for Pro-tier users, and pricing will be announced later. 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 |
leeseokchan00
left a comment
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.
good
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: 0
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt (1)
148-177: 치명적 버그: Google 로그인 버튼이 Kakao 로그인 핸들러를 호출합니다Line 160의 onClick 핸들러가
kakaoLoginClick()을 호출하고 있어, 사용자가 Google 로그인 버튼을 탭해도 Kakao 로그인 플로우가 실행됩니다. Google 로그인을 위한 별도의 핸들러가 필요합니다.다음과 같이 수정하세요:
@Composable fun OauthScreen( kakaoLoginClick: () -> Unit, + googleLoginClick: () -> Unit, modifier: Modifier = Modifier ) {Row( modifier = Modifier .fillMaxWidth() .height(52.dp) .padding(start = 20.dp, end = 20.dp) .background( color = SolplyTheme.colors.white, shape = RoundedCornerShape(12.dp) ) .customClickable( rippleEnabled = false ) { - kakaoLoginClick() + googleLoginClick() },그리고
OauthRoute에서도 해당 파라미터를 전달하도록 업데이트해야 합니다.
🧹 Nitpick comments (2)
feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt (1)
167-167: contentDescription 문자열 현지화 권장접근성 향상을 위해 하드코딩된 contentDescription을 문자열 리소스로 추출하는 것이 좋습니다.
Icon( painter = painterResource(R.drawable.ic_google_logo), - contentDescription = "google_logo", + contentDescription = stringResource(R.string.google_logo_description), tint = Color.Unspecified,feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt (1)
134-138: 하드코딩된 정책 ID를 상수로 관리 권장정책 ID가 하드코딩되어 있어 유지보수가 어렵고 오류 가능성이 있습니다. 상수나 enum으로 관리하는 것을 권장합니다.
다음과 같이 리팩토링할 수 있습니다:
companion object 또는 별도의 상수 파일에 추가:
object PolicyIds { const val POLICY_AGE_14 = 1L const val POLICY_SERVICE = 2L const val POLICY_PRIVACY = 3L }그 다음 사용 부분 수정:
- val policyInfos = listOf( - PolicyAgreementInfoEntity(1, uiState.value.agree14), - PolicyAgreementInfoEntity(2, uiState.value.agreeService), - PolicyAgreementInfoEntity(3, uiState.value.agreePrivacy) - ) + val policyInfos = listOf( + PolicyAgreementInfoEntity(PolicyIds.POLICY_AGE_14, uiState.value.agree14), + PolicyAgreementInfoEntity(PolicyIds.POLICY_SERVICE, uiState.value.agreeService), + PolicyAgreementInfoEntity(PolicyIds.POLICY_PRIVACY, uiState.value.agreePrivacy) + )
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (16)
core/designsystem/src/main/res/drawable/ic_google_logo.xml(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/request/PolicyAgreementInfoDto.kt(1 hunks)data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/GetAllTownResponseDto.kt(1 hunks)data/onboarding/src/main/java/com/teamsolply/solply/onboarding/mapper/PolicyAgreementInfoMapper.kt(1 hunks)data/onboarding/src/main/java/com/teamsolply/solply/onboarding/mapper/TownEntitiyMapper.kt(1 hunks)data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt(2 hunks)domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/PolicyAgreementInfoEntity.kt(1 hunks)domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/TownEntity.kt(1 hunks)domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt(2 hunks)feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt(3 hunks)feature/oauth/src/main/res/values/strings.xml(1 hunks)feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingContract.kt(2 hunks)feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt(3 hunks)feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/AllowClauseScreen.kt(4 hunks)feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/SelectTownScreen.kt(6 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
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)
🔇 Additional comments (27)
feature/oauth/src/main/res/values/strings.xml (1)
4-4: Apple 로그인에서 Google 로그인으로 변경 완료리소스 문자열이 올바르게 업데이트되었습니다.
core/designsystem/src/main/res/drawable/ic_google_logo.xml (1)
1-22: Google 로고 리소스가 올바르게 추가되었습니다벡터 드로어블이 Google 브랜드 색상을 사용하고 있으며, 크기와 구조가 적절합니다.
feature/oauth/src/main/java/com/teamsolply/solply/oauth/OauthScreen.kt (2)
85-85: 상단 여백 수정이 올바르게 적용되었습니다PR 목표에 명시된 "앱 로그인 메인 화면 상단 여백 좁음" 이슈가 115.dp에서 180.dp로 수정되어 해결되었습니다.
154-154: Google 로그인 버튼 스타일링이 적절하게 적용되었습니다배경색을 흰색으로, 텍스트 색상을 검은색으로 변경하고 Google 로고를 사용하는 것이 Google 브랜드 가이드라인에 부합합니다.
Also applies to: 166-166, 173-175
domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/PolicyAgreementInfoEntity.kt (1)
3-6: LGTM!정책 동의 정보를 담는 엔티티 구조가 명확하고 간결합니다. 불변 속성을 사용하여 데이터의 안정성을 보장하고 있습니다.
data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/response/GetAllTownResponseDto.kt (1)
18-19: LGTM!상위 동네 참조를 위한
parentTownId필드가 적절하게 추가되었습니다. nullable 타입과 기본값 null을 사용하여 하위 호환성을 보장하고 있습니다.data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/request/PolicyAgreementInfoDto.kt (1)
6-13: LGTM!정책 동의 정보 DTO가 올바르게 정의되어 있습니다. kotlinx.serialization 어노테이션이 적절히 적용되어 JSON 직렬화를 지원합니다.
data/onboarding/src/main/java/com/teamsolply/solply/onboarding/mapper/PolicyAgreementInfoMapper.kt (1)
6-10: LGTM!엔티티를 DTO로 변환하는 매퍼 함수가 명확하게 구현되어 있습니다. 확장 함수 패턴을 사용하여 코드 가독성이 좋습니다.
data/onboarding/src/main/java/com/teamsolply/solply/onboarding/mapper/TownEntitiyMapper.kt (3)
32-38: LGTM!
ParentTownEntity로의 변환 로직이 명확합니다. nullablesubTowns를 적절히 처리하고 있습니다.
40-45: LGTM!
SubTownEntity로의 변환이 단순화되었습니다. 2단계 계층 구조(부모/자식)에 맞게 중첩된 subTowns 처리를 제거한 것이 적절합니다.
9-30: API 응답이 고아 동네(부모 없는 자식)를 포함할 수 있으면 현재 구현에서 조용히 제외됩니다현재 코드는
parentTownId == null인 동네만 부모로 필터링하고, 각 부모의 자식을parentTownId == parent.townId로 찾습니다. 만약 API가 부모 ID는 있지만 해당 부모가 목록에 없는 "고아 동네"를 반환한다면, 이들은 자동으로 손실됩니다.확인 필요: 백엔드 API가 항상 일관된 부모-자식 관계를 보장하는지, 아니면 이러한 손실이 의도된 설계인지 명확히 해주세요.
feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/SelectTownScreen.kt (4)
81-84: LGTM!새로운
ParentTownEntity구조에 맞게 선택된 동네 이름을 조회하는 로직이 올바르게 수정되었습니다.flatMap을 사용하여 모든 부모의 자식 동네들을 평탄화하는 방식이 적절합니다.
85-87: QA 피드백 반영 확인!선택된 동네를 탭하면 바텀시트를 다시 열어 재설정할 수 있도록 개선되었습니다. PR 목표에 명시된 QA 수정사항이 올바르게 반영되었습니다.
178-232: QA 피드백 반영 확인!
LeftRegionPane이ParentTownEntity구조를 사용하도록 올바르게 업데이트되었습니다. 또한 지역 텍스트 타이포그래피가body14M에서body16M으로 변경되어 PR에서 언급된 "서울 / 동네 텍스트 크기 오류"가 수정되었습니다.
128-133: LGTM!선택된 지역의 하위 동네 목록을 가져오는 로직이
ParentTownEntity구조에 맞게 올바르게 수정되었습니다. 부모를 찾지 못한 경우emptyList()로 안전하게 처리하고 있습니다.feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/screen/AllowClauseScreen.kt (3)
36-39: LGTM! 상태 관리 개선로컬 Compose 상태 대신
state파라미터에서 동의 정보를 읽도록 리팩토링되었습니다. 이는 단일 진실 공급원(single source of truth) 원칙을 따르며, 상태 관리가 더 명확해졌습니다.
69-74: LGTM! Intent 기반 상태 업데이트전체 동의 토글 시 각 동의 항목에 대한 별도 Intent를 발행하도록 변경되었습니다. 이는 단방향 데이터 흐름 패턴을 올바르게 따르고 있으며, ViewModel에서 상태 변경을 중앙 집중식으로 관리할 수 있게 합니다.
107-109: LGTM! 일관된 Intent 패턴각 동의 항목 클릭 시 일관된 Intent 패턴을 사용하여 상태를 업데이트하도록 변경되었습니다. 코드의 일관성과 유지보수성이 향상되었습니다.
Also applies to: 115-117, 127-129
domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepository.kt (1)
12-17: 코드 변경사항 검증 완료 - 승인호출부 검증 결과, 모든 계층에서
patchUserInfo메서드 시그니처가 올바르게 업데이트되었습니다:
- ✅
OnBoardingViewModel(140-145행): 새로운 시그니처에 맞게 모든 파라미터(selectedTownId,persona,nickname,policyAgreementInfos) 전달- ✅
OnBoardingRepositoryImpl(32-37행): 도메인 인터페이스와 정확히 일치- ✅ 데이터 변환 계층: 파라미터를
PatchUserInfoRequestDto로 적절히 매핑feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingContract.kt (3)
27-29: 약관 동의 필드 추가 확인세 가지 약관 동의 필드가 추가되었습니다. 구현이 깔끔합니다.
47-49: 약관 동의 Intent 추가 확인약관 동의 상태 변경을 위한 Intent가 적절하게 추가되었습니다.
11-11: totalPageCount = 4 확인 완료온보딩 화면이 4개 페이지(인덱스 0-3)로 구성되어 있으며, totalPageCount = 4가 UI 구조와 일치합니다. 변경사항이 올바릅니다.
feature/onboarding/src/main/java/com/teamsolply/solply/onboarding/OnBoardingViewModel.kt (2)
87-97: 약관 동의 Intent 처리 확인약관 동의 상태를 업데이트하는 로직이 올바르게 구현되었습니다.
129-151: 필수 약관 동의 검증 누락 확인 필요사용자가 필수 약관에 동의하지 않은 상태에서도 patchUserInfo가 호출될 수 있습니다. 필수 약관 동의 여부를 확인하는 로직이 필요한지 검토해주세요.
data/onboarding/src/main/java/com/teamsolply/solply/onboarding/repository/OnBoardingRepositoryImpl.kt (1)
32-53: API 변경사항이 올바르게 반영됨favoriteTownIdList가 제거되고 nickname과 policyAgreementInfos가 추가되었습니다. 매핑 로직도 올바르게 구현되었습니다.
data/onboarding/src/main/java/com/teamsolply/solply/onboarding/dto/request/PatchUserInfoRequestDto.kt (1)
7-19: DTO 변경사항이 올바르게 반영됨API 변경사항에 맞춰 favoriteTownIdList가 제거되고 policyAgreementInfos가 추가되었습니다. 직렬화 어노테이션도 올바릅니다.
domain/onboarding/src/main/java/com/teamsolply/solply/onboarding/model/TownEntity.kt (1)
3-16: Town 엔티티 구조 개선평면 구조에서 계층적 구조(ParentTownEntity/SubTownEntity)로 변경되었습니다. API 변경사항이 잘 반영되었고, 도메인 모델이 더 명확해졌습니다.
📌 PR 요약
🌱 작업한 내용
🌱 PR 포인트
📸 스크린샷
Screen_recording_20251118_192755.mp4
📮 관련 이슈
Summary by CodeRabbit
릴리스 노트
새로운 기능
UI 개선
리팩토링