[Feature/#156] QA2 반영 및 api변경사항 관련 수정#157
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 |
There was a problem hiding this comment.
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 개선
리팩토링