-
Notifications
You must be signed in to change notification settings - Fork 0
Feature/#166 공통 에러 처리, PullToRefresh Indicator 색상 변경 #169
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
- YappServerError에 `NOT_DEFINED` 오류 코드를 추가하고 `NotDefinedException` 예외 클래스를 추가합니다. - `YappServerError.safeValueOf()` 함수를 추가하여, 정의되지 않은 오류 코드가 들어올 경우 `NOT_DEFINED`를 반환하도록 처리합니다. - ApiResultCallAdapter와 OptionalApiResultCallAdapter에서 서버 오류 발생 시 `safeValueOf()`를 사용하여 예외를 가져오도록 수정합니다. - `NotDefinedException`이 발생한 경우에는 에러 메시지를 설정하지 않도록 수정합니다.
Pull to refresh indicator 색상을 흰색으로 변경합니다.
Pull to refresh indicator 색상을 흰색으로 변경합니다.
Important Review skippedAuto reviews are limited to specific labels. 🏷️ Labels to auto review (1)
Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Walkthrough이번 변경은 앱 전역에서 공통 에러 처리 다이얼로그를 도입하고, 각 주요 네비게이션 그래프와 화면에 예외 처리 콜백(handleException)을 일관적으로 전달하는 구조로 리팩터링합니다. 또한, 각 ViewModel과 화면에서 예외 발생 시 중앙의 에러 다이얼로그를 통해 사용자에게 안내 및 후속 조치를 제공하도록 구현되었습니다. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant App (YappApp)
participant ViewModel
participant ErrorDialog
participant UriHandler
User->>App (YappApp): 앱 실행 및 화면 진입
App (YappApp)->>ViewModel: 화면/네비게이션에서 handleException 콜백 전달
ViewModel-->>App (YappApp): 예외 발생 시 handleException(Throwable)
App (YappApp)->>ErrorDialog: 공통 에러 다이얼로그 표시
User->>ErrorDialog: 추천 액션 버튼 클릭
ErrorDialog->>ViewModel: onCommonErrorDialogRecommendActionButtonClick
ViewModel->>UriHandler: 문의 링크 요청 및 열기 시도
alt 성공
UriHandler-->>User: 문의 페이지로 이동
else 실패
App (YappApp)-->>User: 토스트로 실패 안내
end
Assessment against linked issues
Possibly related PRs
Poem
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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
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: 15
🔭 Outside diff range comments (4)
feature/notice/src/main/java/com/yapp/feature/notice/noticedetail/NoticeDetailRoute.kt (1)
58-60
: 🛠️ Refactor suggestion
LaunchedEffect(Unit)
대신LaunchedEffect(key1 = noticeId)
고려스크린 재진입(예: 다른 공지 → 현재 공지) 시 동일 Composable 인스턴스가 재사용될 수 있습니다.
Unit
을 key 로 쓰면 이전 effect 가 취소되지 않고 재실행되지 않을 수도 있습니다. 공지 ID 변화에 반응하려면 다음과 같이 명시적인 key 를 사용하는 것이 더 안전합니다.LaunchedEffect(noticeId) { viewModel.store.onIntent(NoticeDetailIntent.EnterScreen(noticeId)) }core/designsystem/src/main/java/com/yapp/core/designsystem/component/alert/YappAlertDialog.kt (2)
64-87
: 🧹 Nitpick (assertive)다이얼로그 버튼 클릭 후 자동 dismiss 가 필요하다면 명시적으로 처리하세요
현재
onActionButtonClick
,onRecommendActionButtonClick
내부에서onDismissRequest
를 호출하지 않으므로, 클릭 후 다이얼로그가 그대로 남아 있을 수 있습니다. UX 요구사항에 따라 다음과 같이 기본 동작을 제공할 수 있습니다.val wrappedAction: () -> Unit = { onActionButtonClick?.invoke() onDismissRequest() }
161-187
: 🧹 Nitpick (assertive)프리뷰 이름을 실제 함수명과 매칭하여 혼동을 줄이세요
YappAlertShortDialogPreview
,YappAlertLongDialogPreview
는 좋지만, 기존 파일에 남아 있는YappAlertDialogPreview
와 같은 오래된 프리뷰가 없는지 검색해 제거해 주세요. 라이브러리 사용자가 잘못된 예제를 참고할 수 있습니다.feature/schedule/src/main/java/com/yapp/feature/schedule/ScheduleScreen.kt (1)
3-3
: 🧹 Nitpick (assertive)
⚠️ 사용하지 않는 import 제거 권장
android.widget.Toast
import는 현재 파일에서 사용되지 않습니다. 사용하지 않는 import를 그대로 두면 경고가 발생하고 가독성이 떨어질 수 있으니 삭제해 주세요.-import android.widget.Toast
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (43)
app/src/main/java/com/yapp/app/YappApp.kt
(2 hunks)app/src/main/java/com/yapp/app/official/MainActivity.kt
(3 hunks)app/src/main/java/com/yapp/app/official/YappAppViewModel.kt
(1 hunks)app/src/main/java/com/yapp/app/official/navigation/YappNavHost.kt
(3 hunks)core/data/src/main/java/com/yapp/core/data/remote/retrofit/ApiResultCallAdapter.kt
(2 hunks)core/data/src/main/java/com/yapp/core/data/remote/retrofit/OptionalApiResultCallAdapter.kt
(2 hunks)core/designsystem/src/main/java/com/yapp/core/designsystem/component/alert/YappAlertDialog.kt
(2 hunks)core/model/src/main/java/com/yapp/model/exceptions/YappExceptions.kt
(2 hunks)feature/history/src/main/java/com/yapp/feature/history/navigation/HistoryNavigation.kt
(1 hunks)feature/history/src/main/java/com/yapp/feature/history/previous/PreviousHistoryContract.kt
(1 hunks)feature/history/src/main/java/com/yapp/feature/history/previous/PreviousHistoryScreen.kt
(2 hunks)feature/history/src/main/java/com/yapp/feature/history/previous/PreviousHistoryViewModel.kt
(2 hunks)feature/home/src/main/java/com/yapp/feature/home/HomeViewModel.kt
(6 hunks)feature/home/src/main/java/com/yapp/feature/home/navigation/HomeNavigation.kt
(1 hunks)feature/home/src/main/java/com/yapp/feature/home/setting/SettingContract.kt
(1 hunks)feature/home/src/main/java/com/yapp/feature/home/setting/SettingScreen.kt
(2 hunks)feature/home/src/main/java/com/yapp/feature/home/setting/SettingViewModel.kt
(2 hunks)feature/login/src/main/java/com/yapp/feature/login/LoginContract.kt
(1 hunks)feature/login/src/main/java/com/yapp/feature/login/LoginScreen.kt
(3 hunks)feature/login/src/main/java/com/yapp/feature/login/LoginViewModel.kt
(4 hunks)feature/login/src/main/java/com/yapp/feature/login/navigation/LoginNavigation.kt
(1 hunks)feature/notice/src/main/java/com/yapp/feature/notice/navigation/NoticeNavigation.kt
(2 hunks)feature/notice/src/main/java/com/yapp/feature/notice/notice/NoticeContract.kt
(1 hunks)feature/notice/src/main/java/com/yapp/feature/notice/notice/NoticeRoute.kt
(1 hunks)feature/notice/src/main/java/com/yapp/feature/notice/notice/NoticeViewModel.kt
(4 hunks)feature/notice/src/main/java/com/yapp/feature/notice/noticedetail/NoticeDetailContract.kt
(1 hunks)feature/notice/src/main/java/com/yapp/feature/notice/noticedetail/NoticeDetailRoute.kt
(2 hunks)feature/notice/src/main/java/com/yapp/feature/notice/noticedetail/NoticeDetailViewModel.kt
(2 hunks)feature/profile/src/main/java/com/yapp/feature/profile/ProfileContract.kt
(1 hunks)feature/profile/src/main/java/com/yapp/feature/profile/ProfileScreen.kt
(4 hunks)feature/profile/src/main/java/com/yapp/feature/profile/ProfileViewModel.kt
(2 hunks)feature/profile/src/main/java/com/yapp/feature/profile/navigation/ProfileNavigation.kt
(1 hunks)feature/schedule/src/main/java/com/yapp/feature/schedule/ScheduleContract.kt
(1 hunks)feature/schedule/src/main/java/com/yapp/feature/schedule/ScheduleScreen.kt
(6 hunks)feature/schedule/src/main/java/com/yapp/feature/schedule/ScheduleViewModel.kt
(2 hunks)feature/schedule/src/main/java/com/yapp/feature/schedule/navigation/ScheduleNavigation.kt
(1 hunks)feature/signup/src/main/java/com/yapp/feature/signup/navigation/SignUpNavigation.kt
(1 hunks)feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpContract.kt
(2 hunks)feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpScreen.kt
(3 hunks)feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpViewModel.kt
(2 hunks)feature/signup/src/main/java/com/yapp/feature/signup/signup/page/email/EmailContract.kt
(1 hunks)feature/signup/src/main/java/com/yapp/feature/signup/signup/page/email/EmailPage.kt
(1 hunks)feature/signup/src/main/java/com/yapp/feature/signup/signup/page/email/EmailViewModel.kt
(2 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (19)
core/data/src/main/java/com/yapp/core/data/remote/retrofit/ApiResultCallAdapter.kt (1)
core/model/src/main/java/com/yapp/model/exceptions/YappExceptions.kt (1)
setMessage
(64-66)
feature/profile/src/main/java/com/yapp/feature/profile/ProfileScreen.kt (1)
core/designsystem/src/main/java/com/yapp/core/designsystem/component/alert/YappAlertDialog.kt (1)
YappAlertShortDialog
(22-90)
core/data/src/main/java/com/yapp/core/data/remote/retrofit/OptionalApiResultCallAdapter.kt (1)
core/model/src/main/java/com/yapp/model/exceptions/YappExceptions.kt (1)
setMessage
(64-66)
feature/schedule/src/main/java/com/yapp/feature/schedule/navigation/ScheduleNavigation.kt (1)
feature/schedule/src/main/java/com/yapp/feature/schedule/ScheduleScreen.kt (1)
ScheduleRoute
(48-71)
feature/history/src/main/java/com/yapp/feature/history/previous/PreviousHistoryScreen.kt (1)
feature/login/src/main/java/com/yapp/feature/login/navigation/LoginNavigation.kt (1)
navigateToLogin
(13-15)
feature/notice/src/main/java/com/yapp/feature/notice/notice/NoticeRoute.kt (2)
feature/notice/src/main/java/com/yapp/feature/notice/navigation/NoticeNavigation.kt (1)
navigateToNoticeDetail
(25-27)feature/login/src/main/java/com/yapp/feature/login/navigation/LoginNavigation.kt (1)
navigateToLogin
(13-15)
app/src/main/java/com/yapp/app/official/MainActivity.kt (1)
core/designsystem/src/main/java/com/yapp/core/designsystem/component/alert/YappAlertDialog.kt (1)
YappAlertShortDialog
(22-90)
feature/history/src/main/java/com/yapp/feature/history/navigation/HistoryNavigation.kt (1)
feature/history/src/main/java/com/yapp/feature/history/previous/PreviousHistoryScreen.kt (1)
PreviousHistoryRoute
(30-60)
app/src/main/java/com/yapp/app/official/YappAppViewModel.kt (1)
core/domain/src/main/java/com/yapp/domain/RunCatchingIgnoreCancelled.kt (1)
runCatchingIgnoreCancelled
(5-8)
feature/home/src/main/java/com/yapp/feature/home/navigation/HomeNavigation.kt (1)
feature/home/src/main/java/com/yapp/feature/home/setting/SettingScreen.kt (1)
SettingRoute
(34-74)
feature/profile/src/main/java/com/yapp/feature/profile/navigation/ProfileNavigation.kt (1)
feature/profile/src/main/java/com/yapp/feature/profile/ProfileScreen.kt (1)
ProfileRoute
(31-100)
feature/signup/src/main/java/com/yapp/feature/signup/navigation/SignUpNavigation.kt (1)
feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpScreen.kt (1)
SignUpRoute
(51-85)
feature/home/src/main/java/com/yapp/feature/home/setting/SettingViewModel.kt (3)
core/domain/src/main/java/com/yapp/domain/RunCatchingIgnoreCancelled.kt (1)
runCatchingIgnoreCancelled
(5-8)feature/login/src/main/java/com/yapp/feature/login/LoginViewModel.kt (1)
updateUrl
(169-187)feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpViewModel.kt (1)
updateUrl
(253-263)
app/src/main/java/com/yapp/app/official/navigation/YappNavHost.kt (5)
feature/signup/src/main/java/com/yapp/feature/signup/navigation/SignUpNavigation.kt (1)
signupNavGraph
(17-29)feature/schedule/src/main/java/com/yapp/feature/schedule/navigation/ScheduleNavigation.kt (1)
scheduleNavGraph
(17-27)feature/notice/src/main/java/com/yapp/feature/notice/navigation/NoticeNavigation.kt (2)
noticeNavGraph
(29-45)noticeDetailNavGraph
(47-66)feature/profile/src/main/java/com/yapp/feature/profile/navigation/ProfileNavigation.kt (1)
profileNavGraph
(17-33)feature/history/src/main/java/com/yapp/feature/history/navigation/HistoryNavigation.kt (1)
previousHistoryNavGraph
(32-44)
feature/notice/src/main/java/com/yapp/feature/notice/navigation/NoticeNavigation.kt (3)
feature/notice/src/main/java/com/yapp/feature/notice/notice/NoticeRoute.kt (1)
NoticeRoute
(43-69)app/src/main/java/com/yapp/app/official/ui/Navigator.kt (1)
navigateToNoticeDetail
(82-84)feature/notice/src/main/java/com/yapp/feature/notice/noticedetail/NoticeDetailRoute.kt (1)
NoticeDetailRoute
(41-66)
feature/login/src/main/java/com/yapp/feature/login/navigation/LoginNavigation.kt (1)
feature/login/src/main/java/com/yapp/feature/login/LoginScreen.kt (1)
LoginRoute
(32-74)
core/designsystem/src/main/java/com/yapp/core/designsystem/component/alert/YappAlertDialog.kt (3)
core/designsystem/src/main/java/com/yapp/core/designsystem/component/button/solid/SolidButton.kt (1)
YappSolidPrimaryButtonXLarge
(82-111)core/designsystem/src/main/java/com/yapp/core/designsystem/component/button/outlined/OutlinedSecondaryButton.kt (1)
YappOutlinedSecondaryButtonXLarge
(15-44)core/designsystem/src/main/java/com/yapp/core/designsystem/theme/Theme.kt (1)
YappTheme
(9-24)
feature/home/src/main/java/com/yapp/feature/home/HomeViewModel.kt (2)
feature/schedule/src/main/java/com/yapp/feature/schedule/ScheduleViewModel.kt (1)
loadUpcomingSessionInfo
(101-115)core/domain/src/main/java/com/yapp/domain/RunCatchingIgnoreCancelled.kt (1)
runCatchingIgnoreCancelled
(5-8)
feature/schedule/src/main/java/com/yapp/feature/schedule/ScheduleScreen.kt (1)
feature/login/src/main/java/com/yapp/feature/login/navigation/LoginNavigation.kt (1)
navigateToLogin
(13-15)
🔇 Additional comments (79)
core/model/src/main/java/com/yapp/model/exceptions/YappExceptions.kt (3)
29-30
: 오류 정의되지 않은 상황 추가예상치 못한 서버 오류 코드에 대한 안전한 처리를 위해
NOT_DEFINED
열거형 상수가 추가되었습니다. 이를 통해 정의되지 않은 오류 코드에 대해서도 일관적인 예외 처리가 가능해집니다.
32-40
: 안전한 Enum 변환 메서드 추가문자열을
YappServerError
enum 값으로 안전하게 변환하는safeValueOf
메서드가 추가되었습니다. 이는 IllegalArgumentException이 발생하는 대신NOT_DEFINED
를 반환하여 애플리케이션의 예외 처리를 더 안정적으로 만듭니다.
56-56
: 정의되지 않은 오류에 대한 예외 클래스 추가
NotDefinedException
클래스를 추가하여 정의되지 않은 서버 오류에 대한 예외 처리를 명확하게 할 수 있게 되었습니다. 사용자에게 적절한 오류 메시지를 제공합니다.app/src/main/java/com/yapp/app/official/MainActivity.kt (3)
20-22
: 임포트 경로 업데이트
YappApp
및 알림 대화상자 컴포넌트의 임포트 경로가 업데이트되었습니다. 이는 앱 전체의 일관된 대화상자 사용을 위한 변경으로 보입니다.
48-49
: 상태 변수 위치 변경
showForceUpdateDialog
변수의 위치가 약간 변경되었지만 기능적으로는 동일하게 유지됩니다.
99-99
: 알림 대화상자 컴포넌트 업데이트강제 업데이트 대화상자가
YappAlertDialog
에서YappAlertShortDialog
로 변경되었습니다. 이는 앱 전체에서 알림 대화상자 사용을 표준화하기 위한 변경으로, 제공된YappAlertShortDialog
컴포넌트의 디자인과 일치합니다.feature/profile/src/main/java/com/yapp/feature/profile/ProfileContract.kt (1)
35-35
: 예외 처리 사이드 이펙트 추가
ProfileSideEffect
에HandleException
사이드 이펙트를 추가하여 중앙화된 예외 처리 메커니즘의 일부로 구현되었습니다. 이를 통해 프로필 기능에서 발생하는 예외를 공통 처리 흐름으로 전달할 수 있게 되었습니다.feature/signup/src/main/java/com/yapp/feature/signup/signup/page/email/EmailContract.kt (1)
42-42
: 이메일 기능에 예외 처리 사이드 이펙트 추가
EmailSideEffect
에HandleException
사이드 이펙트를 추가하여 중앙화된 예외 처리의 일부로 구현되었습니다. 이는 앱 전체의 일관된 예외 처리 전략을 따르며, 이메일 기능에서 발생하는 예외를 공통 처리 흐름으로 전달할 수 있게 합니다.feature/home/src/main/java/com/yapp/feature/home/setting/SettingContract.kt (1)
22-22
: 예외 처리를 위한 사이드 이펙트 추가 👍공통 에러 처리를 위한 HandleException 사이드 이펙트를 추가한 것은 좋은 접근 방식입니다. 이를 통해 설정 화면에서 발생하는 예외를 중앙화된 방식으로 처리할 수 있게 되었습니다.
feature/login/src/main/java/com/yapp/feature/login/LoginContract.kt (1)
39-39
: 예외 처리 사이드 이펙트로 일관성 있는 에러 처리 구현 👍로그인 화면에서 발생하는 예외를 처리하기 위한 HandleException 사이드 이펙트를 추가한 것은 앱 전체의 에러 처리 방식과 일관성을 유지하는 좋은 접근 방식입니다. 토스트 메시지 대신 구조화된 예외 처리를 사용함으로써 사용자 경험을 향상시킬 수 있습니다.
feature/schedule/src/main/java/com/yapp/feature/schedule/ScheduleContract.kt (1)
26-27
: 예외 처리와 인증 관련 사이드 이펙트 추가 👍스케줄 화면에 HandleException과 NavigateToLogin 사이드 이펙트를 추가한 것은 적절합니다. 이를 통해:
- 일반적인 예외는 중앙화된 에러 다이얼로그로 처리
- 토큰 무효화와 같은 인증 관련 예외는 로그인 화면으로 이동
이러한 구분된 처리는 사용자 경험을 향상시키는 좋은 접근 방식입니다.
feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpViewModel.kt (2)
203-203
: 예외 처리를 위한 인텐트 핸들러 추가 👍예외 처리를 위한 인텐트 핸들러를 추가한 것은 좋은 접근 방식입니다. 이를 통해 SignUp 기능에서 발생하는 예외를 중앙화된 방식으로 처리할 수 있게 되었습니다.
233-236
: 일반 예외에 대한 중앙화된 에러 처리 구현 👍일반 예외를 HandleException 사이드 이펙트로 전파하는 방식은 앱 전체의 일관된 에러 처리 패턴을 따르고 있습니다. 이를 통해 사용자에게 적절한 오류 메시지를 표시하고 UX를 향상시킬 수 있습니다.
한 가지 고려할 점은 record() 메서드 호출 위치입니다. 만약 HandleException 핸들러에서도 record()를 호출한다면, 여기서는 중복 호출이 될 수 있습니다. 그러나 현재 구현은 적절해 보입니다.
core/data/src/main/java/com/yapp/core/data/remote/retrofit/ApiResultCallAdapter.kt (3)
3-3
: NotDefinedException 임포트 추가에러 코드가 정의되지 않은 경우를 처리하기 위한 NotDefinedException을 임포트했습니다. 이는 에러 핸들링 개선의 일부로 적절합니다.
60-60
: valueOf 대신 safeValueOf 메서드 사용기존의
valueOf
대신safeValueOf
메서드를 사용하여 정의되지 않은 에러 코드에 대한 안전한 처리가 가능해졌습니다. 이 방식은 예상치 못한 서버 에러 코드에 대해 앱이 크래시되는 것을 방지합니다.
63-63
: NotDefinedException 조건부 메시지 설정NotDefinedException이 아닌 경우에만 에러 메시지를 설정하도록 개선되었습니다. 이는 정의되지 않은 에러의 경우 기본 메시지를 유지하기 위한 적절한 처리입니다.
feature/home/src/main/java/com/yapp/feature/home/navigation/HomeNavigation.kt (2)
40-40
: 공통 에러 처리 콜백 매개변수 추가settingNavGraph 함수에
handleException
콜백 매개변수를 추가했습니다. 이는 앱 전체에 일관된 에러 처리 방식을 적용하기 위한 좋은 접근법입니다.
46-46
: 에러 처리 콜백 전달
handleException
콜백을 SettingRoute 컴포저블에 전달하여 에러 처리를 중앙화하고 있습니다. 이는 관련 코드 스니펫에서 확인된 SettingSideEffect.HandleException과 함께 작동하여 일관된 에러 처리 메커니즘을 제공합니다.feature/signup/src/main/java/com/yapp/feature/signup/navigation/SignUpNavigation.kt (2)
20-20
: 공통 에러 처리 콜백 매개변수 추가signupNavGraph 함수에
handleException
콜백 매개변수를 추가했습니다. 이는 앱 전체에 일관된 에러 처리 방식을 구현하기 위한 일관된 패턴입니다.
26-26
: 에러 처리 콜백 전달
handleException
콜백을 SignUpRoute 컴포저블에 전달하여 중앙집중식 에러 처리를 가능하게 합니다. 관련 코드 스니펫에서 볼 수 있듯이 이 콜백은 SignUpSideEffect.HandleException 사이드 이펙트 발생 시 호출됩니다.core/data/src/main/java/com/yapp/core/data/remote/retrofit/OptionalApiResultCallAdapter.kt (3)
3-3
: NotDefinedException 임포트 추가ApiResultCallAdapter와 일관되게 NotDefinedException을 임포트하여 정의되지 않은 에러 코드에 대한 처리를 개선했습니다.
66-66
: valueOf 대신 safeValueOf 메서드 사용
valueOf
대신safeValueOf
메서드를 사용함으로써 알 수 없는 에러 코드에 대한 안전한 처리가 가능해졌습니다. 이는 ApiResultCallAdapter와 동일한 패턴을 따르며 일관된 에러 처리를 보장합니다.
69-69
: NotDefinedException 조건부 메시지 설정NotDefinedException이 아닌 경우에만 에러 메시지를 설정하도록 로직이 개선되었습니다. 이는 ApiResultCallAdapter와 일관된 접근 방식으로 정의되지 않은 에러의 경우 기본 메시지를 유지합니다.
feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpContract.kt (2)
48-48
: 예외 처리 기능 추가공통 에러 처리 패턴에 맞게
HandleException
인텐트를 추가하셨네요. 발생한 예외를 UI 계층으로 전달하는 좋은 방법입니다.
57-57
: 사이드 이펙트를 통한 예외 처리 구현
HandleException
사이드 이펙트를 추가하여 ViewModel에서 화면으로 예외를 전달할 수 있게 되었습니다. 이렇게 하면 모든 예외를 중앙에서 일관되게 처리할 수 있어 사용자 경험이 향상됩니다.feature/profile/src/main/java/com/yapp/feature/profile/ProfileScreen.kt (5)
20-20
: Alert 다이얼로그 컴포넌트 변경
YappAlertDialog
에서YappAlertShortDialog
로 임포트를 변경하셨네요. 디자인 시스템의 업데이트를 반영한 좋은 변경입니다.
37-38
: 예외 처리 및 로그인 네비게이션 파라미터 추가
onNavigateToLogin
과handleException
파라미터를 추가하여 에러 처리와 인증 관련 네비게이션을 일관되게 처리할 수 있게 되었습니다. 앱 전체의 공통 에러 처리 패턴과 일치합니다.
64-66
: 예외 처리 사이드 이펙트 구현예외가 발생했을 때
handleException
콜백을 호출하도록 구현하셨네요. 이를 통해 앱 전체에서 일관된 에러 처리가 가능해집니다.
71-71
: 로그아웃 다이얼로그 컴포넌트 변경
YappAlertShortDialog
로 변경하여 디자인 시스템의 변경사항을 반영하셨습니다. 일관된 UI 경험을 제공할 수 있습니다.
82-82
: 회원 탈퇴 다이얼로그 컴포넌트 변경회원 탈퇴 다이얼로그도
YappAlertShortDialog
로 변경하여 디자인 시스템의 일관성을 유지하셨습니다.feature/history/src/main/java/com/yapp/feature/history/previous/PreviousHistoryViewModel.kt (2)
9-9
: InvalidTokenException 임포트 추가토큰 무효화 예외를 감지하기 위한 임포트를 추가하셨습니다. 인증 상태에 따른 처리를 위한 좋은 변경입니다.
50-59
: 향상된 예외 처리 로직 구현예외 타입에 따른 처리를 세분화하셨네요:
InvalidTokenException
이 발생하면 로그인 화면으로 네비게이션- 그 외 예외는 공통 예외 처리 메커니즘으로 전달하고 기록
이는 사용자 경험을 향상시키는 좋은 패턴입니다. 토큰 관련 문제가 발생하면 사용자를 로그인 화면으로 자연스럽게 안내할 수 있습니다.
feature/notice/src/main/java/com/yapp/feature/notice/notice/NoticeContract.kt (1)
29-30
: 공통 예외 처리를 위한 사이드 이펙트 추가
NavigateToLogin
과HandleException
사이드 이펙트를 추가하셨습니다. 이는 앱 전체에서 일관된 에러 처리와 인증 관련 네비게이션을 가능하게 하는 좋은 패턴입니다.다른 기능 모듈(profile, history, signup 등)에서도 동일한 패턴을 적용하여 일관성을 유지하셨네요.
feature/signup/src/main/java/com/yapp/feature/signup/signup/page/email/EmailPage.kt (2)
32-32
: 중앙 집중식 에러 처리 패턴 적용 👍이메일 페이지에
handleException
콜백이 추가되었습니다. 이는 앱 전체에 걸쳐 일관된 예외 처리 패턴을 구현하는 좋은 접근법입니다.
38-38
: 사이드 이펙트 처리기 업데이트 완료새로운
EmailSideEffect.HandleException
케이스를 처리하도록 사이드 이펙트 콜렉터가 적절히 업데이트되었습니다. 이는 상위 계층으로 예외를 전파하는 중앙화된 에러 처리 패턴을 따릅니다.feature/notice/src/main/java/com/yapp/feature/notice/noticedetail/NoticeDetailContract.kt (1)
28-30
: 새로운 사이드 이펙트 추가 완료
NoticeDetailSideEffect
인터페이스에 두 가지 새로운 사이드 이펙트가 추가되었습니다:
NavigateToLogin
: 로그인 화면으로의 네비게이션을 트리거합니다.HandleException
: 예외 처리를 위한 데이터 클래스입니다.이는 앱 전체의 일관된 예외 처리 및 네비게이션 패턴을 지원합니다.
feature/schedule/src/main/java/com/yapp/feature/schedule/navigation/ScheduleNavigation.kt (2)
17-20
: 네비게이션 그래프에 에러 처리 콜백 추가
scheduleNavGraph
함수에 두 개의 콜백 매개변수가 추가되었습니다:
handleException
: 예외 처리를 위한 콜백navigateToLogin
: 로그인 화면으로 네비게이션하기 위한 콜백이는 앱 전체에 걸쳐 일관된 예외 처리 및 로그인 리디렉션을 구현하는 패턴과 일치합니다.
22-25
: ScheduleRoute 호출 업데이트 완료
ScheduleRoute
호출이 새로운 매개변수를 전달하도록 적절히 업데이트되었습니다. 이는ScheduleScreen.kt
에서 확인된 대로 이러한 콜백이 실제로 사용되는 방식과 일치합니다.feature/login/src/main/java/com/yapp/feature/login/LoginViewModel.kt (5)
13-13
: 새로운 예외 타입 추가 완료
UserNotFoundForEmailException
가져오기가 추가되었습니다. 이는 로그인 실패 시나리오를 더 세밀하게 처리하기 위한 것입니다.
124-125
: 이메일 오류 시 로그인 버튼 활성화 유지이메일 형식 오류가 발생해도 로그인 버튼이 활성화 상태를 유지하도록 변경되었습니다. 이는 사용자가 화면을 다시 로드하지 않고도 다시 시도할 수 있게 하여 사용자 경험을 개선합니다.
138-139
: 로그인 실패 시 버튼 상태 개선로그인 실패 시에도 버튼이 활성화 상태를 유지하도록 변경되었습니다. 이는 사용자가 오류를 수정한 후 즉시 다시 시도할 수 있게 하여 사용자 경험을 향상시킵니다.
148-154
: 이메일 미등록 사용자 예외 처리 추가
UserNotFoundForEmailException
에 대한 처리가 추가되었습니다. 이는 특정 오류 메시지를 이메일 필드에 표시하여 사용자에게 더 명확한 피드백을 제공합니다.
162-162
: 중앙 집중식 예외 처리로 전환일반적인 실패 처리가 토스트 메시지 표시에서
HandleException
사이드 이펙트 호출로 변경되었습니다. 이는 앱 전체에 걸쳐 구현되고 있는 중앙 집중식 예외 처리 접근 방식과 일치합니다.feature/profile/src/main/java/com/yapp/feature/profile/ProfileViewModel.kt (2)
94-103
: 계정 삭제 실패 시 예외 처리 추가계정 삭제 과정에서 발생하는 예외를 적절히 처리하는 코드가 추가되었습니다. 이제 계정 삭제 작업 실패 시 사용자에게 오류 메시지를 표시할 수 있게 되었습니다.
115-124
: 예외 처리 로직 개선예외 처리 로직이 개선되어 토큰 무효화 예외(
InvalidTokenException
)와 기타 예외를 구분하여 처리합니다. 토큰 무효화 시 로그인 화면으로 리디렉션하고, 다른 예외는 중앙 집중식 예외 처리 메커니즘으로 전달합니다. 이 변경사항은 앱 전체의 일관된 오류 처리 패턴을 따르고 있습니다.feature/history/src/main/java/com/yapp/feature/history/previous/PreviousHistoryContract.kt (1)
18-19
: 새로운 사이드 이펙트 추가공통 오류 처리 패턴에 맞게 두 가지 새로운 사이드 이펙트가 추가되었습니다:
NavigateLogin
: 토큰 만료 또는 인증 관련 문제 발생 시 로그인 화면으로 이동HandleException
: 발생한 예외를 캡슐화하여 상위 컴포넌트에서 처리할 수 있도록 함이러한 변경은 앱 전체의 일관된 오류 처리 전략을 구현하는 데 도움이 됩니다.
feature/signup/src/main/java/com/yapp/feature/signup/signup/page/email/EmailViewModel.kt (1)
69-83
: 이메일 중복 검사 오류 처리 개선이메일 중복 검사 시 발생하는 예외를 유형별로 구분하여 처리하도록 개선되었습니다:
AlreadyRegisteredException
: 이미 등록된 이메일인 경우 상태를 업데이트하여 사용자에게 알림- 그 외 예외: 중앙 집중식 예외 처리 메커니즘으로 전달하고 로깅
이러한 구분은 사용자에게 더 명확한 피드백을 제공하고 예외 처리의 일관성을 유지하는 데 도움이 됩니다.
feature/history/src/main/java/com/yapp/feature/history/previous/PreviousHistoryScreen.kt (2)
31-36
: 새로운 콜백 매개변수 추가
PreviousHistoryRoute
컴포저블에 두 가지 새로운 콜백 매개변수가 추가되었습니다:
navigateToLogin
: 인증 관련 문제 발생 시 로그인 화면으로 이동하기 위한 콜백handleException
: 예외 처리를 상위 컴포넌트에 위임하기 위한 콜백이러한 매개변수 추가는 앱 전체의 통합된 오류 처리 패턴에 맞춰 진행되었습니다.
49-50
: 사이드 이펙트 처리 로직 추가새로 추가된 사이드 이펙트를 처리하는 로직이 구현되었습니다:
HandleException
: 전달된 예외를handleException
콜백을 통해 상위 컴포넌트로 위임NavigateLogin
:navigateToLogin
콜백을 호출하여 로그인 화면으로 이동이 구현은 최상위 컴포넌트(YappApp)에서 정의된 공통 오류 다이얼로그 및 네비게이션 로직과 연결되어 일관된 사용자 경험을 제공합니다.
feature/history/src/main/java/com/yapp/feature/history/navigation/HistoryNavigation.kt (2)
32-35
: 중앙 집중식 예외 처리 및 로그인 네비게이션 추가
previousHistoryNavGraph
함수에navigateToLogin
과handleException
파라미터를 추가한 것은 앱 전체에 걸친 일관된 오류 처리 및 인증 관련 네비게이션 패턴을 구현하는 좋은 접근 방식입니다.
37-42
: 파라미터 전달 구현이 잘 되었습니다
PreviousHistoryRoute
컴포저블에 새로운 콜백 파라미터들을 올바르게 전달했습니다. 이는 AI 요약에서 설명한 바와 같이 다른 피처 모듈에서도 일관되게 적용된 패턴과 잘 일치합니다.feature/home/src/main/java/com/yapp/feature/home/setting/SettingScreen.kt (2)
39-39
: 예외 처리 콜백 파라미터 추가
SettingRoute
컴포저블에handleException
파라미터를 추가하여 중앙화된 예외 처리 메커니즘을 구현한 것은 좋은 접근 방식입니다.
61-62
: 예외 처리 사이드 이펙트 처리 구현
SettingSideEffect.HandleException
사이드 이펙트를 처리하는 코드를 추가하여 일관된 예외 처리 패턴을 구현했습니다. 이는 앱 전체에 걸쳐 동일한 패턴을 사용하여 오류 처리를 중앙화하는 좋은 예입니다.feature/notice/src/main/java/com/yapp/feature/notice/notice/NoticeRoute.kt (2)
48-49
: 예외 및 로그인 네비게이션 처리 파라미터 추가
NoticeRoute
컴포저블에handleException
과navigateToLogin
파라미터를 추가하여 중앙화된 예외 처리 및 인증 관련 네비게이션을 일관되게 구현했습니다.
56-57
: 사이드 이펙트 처리 로직 추가
NoticeSideEffect.HandleException
과NoticeSideEffect.NavigateToLogin
사이드 이펙트를 처리하는 코드를 적절히 추가했습니다. 이는 AI 요약에서 언급된 것처럼 다른 기능 모듈에서도 일관되게 적용된 패턴과 잘 일치합니다.feature/profile/src/main/java/com/yapp/feature/profile/navigation/ProfileNavigation.kt (2)
21-22
: 로그인 네비게이션 및 예외 처리 파라미터 추가
profileNavGraph
함수에onNavigateToLogin
과handleException
파라미터를 추가하여 중앙화된 예외 처리 및 인증 관련 네비게이션을 위한 일관된 패턴을 구현했습니다.
28-30
: 파라미터 올바르게 전달
ProfileRoute
컴포저블에 새 파라미터들이 적절하게 전달되었습니다.onNavigateToPreviousHistory
파라미터의 위치가 변경되었지만 함수 시그니처는 여전히 올바릅니다.feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpScreen.kt (3)
56-56
: 중앙 집중식 예외 처리를 위한 handleException 파라미터 추가중앙에서 일관된 방식으로 예외를 처리할 수 있도록
handleException
콜백을 추가한 것은 좋은 접근법입니다. 이를 통해 에러 처리 로직을 각 화면에서 중복 구현하지 않아도 됩니다.
76-78
: 예외 처리 사이드 이펙트 구현
HandleException
사이드 이펙트를 통해 예외를 상위 컴포넌트로 전달하는 방식이 잘 구현되었습니다. 이 패턴을 통해 앱 전체에서 일관된 에러 처리가 가능해집니다.
142-144
: EmailPage에 예외 처리 기능 전달
EmailPage
컴포넌트에 예외 처리 기능을 전달하여 하위 컴포넌트에서 발생한 예외를 상위로 전파할 수 있도록 구현했습니다. 일관된 예외 처리 패턴을 잘 따르고 있습니다.feature/notice/src/main/java/com/yapp/feature/notice/notice/NoticeViewModel.kt (2)
79-80
: loadNoticeTypeList 함수 매개변수 추가
postSideEffect
매개변수를 추가하여 예외 발생 시 적절한 사이드 이펙트를 발생시킬 수 있도록 개선했습니다. 이는 예외 처리 패턴을 일관되게 적용하는 데 필요한 변경입니다.
88-98
: 토큰 만료와 일반 예외 처리 구분예외 처리 로직이 크게 개선되었습니다:
InvalidTokenException
의 경우 로그인 화면으로 이동- 그 외 예외는 중앙 처리 메커니즘으로 전달 및 로깅
이 구조는 토큰 만료와 같은 특수 케이스를 효과적으로 처리하면서, 일반 예외는 통합된 방식으로 사용자에게 표시할 수 있게 합니다.
app/src/main/java/com/yapp/app/official/navigation/YappNavHost.kt (2)
26-26
: 앱 전체 예외 처리기 파라미터 추가전체 네비게이션 호스트에
handleException
파라미터를 추가함으로써 앱 전체에서 일관된 예외 처리가 가능해졌습니다. 이는 중앙 집중식 예외 처리를 위한 기반을 마련합니다.
43-45
: 모든 네비게이션 그래프에 예외 처리기 전달각 기능 모듈의 네비게이션 그래프에 예외 처리기를 전달하여 일관된 예외 처리 패턴을 구현했습니다. 이를 통해 앱 전체에서 동일한 방식으로 예외를 처리하고 사용자에게 표시할 수 있습니다.
특히
scheduleNavGraph
의 경우 파라미터가 없던 호출에서 예외 처리와 로그인 네비게이션 콜백을 포함하도록 개선되었습니다.Also applies to: 52-54, 71-73, 79-81, 86-93, 95-102, 107-109, 114-117
feature/home/src/main/java/com/yapp/feature/home/setting/SettingViewModel.kt (2)
42-57
: EnterScreen 인텐트의 예외 처리 강화
runCatchingIgnoreCancelled
를 사용하여 코루틴 취소 예외는 다시 던지고 다른 예외는 적절히 처리하는 패턴이 잘 구현되었습니다. 예외 유형에 따라 다른 사이드 이펙트를 발생시키는 방식은 다음과 같은 이점이 있습니다:
InvalidTokenException
은 로그인 화면으로 이동- 기타 예외는 중앙 처리 메커니즘으로 전달
- 모든 예외는 적절히 로깅
이러한 구조적 예외 처리는 사용자 경험을 개선하고 디버깅을 용이하게 합니다.
64-77
: ClickNotificationSwitch 인텐트의 예외 처리 강화
EnterScreen
과 동일한 패턴으로 예외 처리를 개선했습니다. 통지 스위치 상태 변경 시 발생할 수 있는 예외를 구조적으로 처리하여 적절한 사용자 피드백을 제공할 수 있게 되었습니다.app/src/main/java/com/yapp/app/official/YappAppViewModel.kt (1)
1-25
: 전체적인 ViewModel 구조가 깔끔합니다!공통 에러 처리를 위한 ViewModel이 잘 설계되었습니다.
onCommonErrorDialogRecommendActionButtonClick
함수는 에러 처리 다이얼로그에서 추천 액션 버튼을 클릭했을 때 문의 링크를 가져오는 기능을 적절하게 구현하고 있습니다.runCatchingIgnoreCancelled
를 사용하여 취소 예외를 적절히 처리한 점이 좋습니다.몇 가지 추가적인 개선 사항이 있을 수 있습니다:
- 함수명이 다소 길어서 가독성이 떨어질 수 있습니다. 더 간결한 이름(예:
fetchUsageInquiryLink
)을 고려해 보세요.- 에러 상태를 UI에 표시하기 위한 StateFlow를 추가하는 것도 고려해 볼 수 있습니다.
feature/login/src/main/java/com/yapp/feature/login/navigation/LoginNavigation.kt (3)
10-15
: 코드 포맷팅이 개선되었습니다.
LoginRoute
데이터 객체와navigateToLogin
함수의 형식이 깔끔하게 정리되었습니다.
17-23
: 예외 처리 콜백 추가가 적절합니다.
loginNavGraph
함수에handleException: (Throwable) -> Unit
파라미터를 추가한 것은 앱 전체의 중앙화된 예외 처리 시스템과 일치합니다. 이 접근 방식은 모든 화면에서 일관된 오류 처리를 제공하는 데 도움이 됩니다.
24-32
: LoginRoute에 예외 처리 콜백 전달이 적절합니다.
LoginRoute
컴포저블에handleException
콜백을 전달하여 오류 처리를 상위 컴포넌트로 위임하는 것은 좋은 패턴입니다. 이는 앱 전체에서 일관된 오류 메시지 표시를 가능하게 합니다.feature/notice/src/main/java/com/yapp/feature/notice/navigation/NoticeNavigation.kt (2)
29-34
: noticeNavGraph에 콜백 추가가 적절합니다.
noticeNavGraph
함수에handleException
과navigateToLogin
콜백을 추가한 것은 앱 전체의 중앙화된 예외 처리 및 인증 흐름과 일치합니다.
35-45
: NoticeRoute에 콜백 전달이 적절합니다.
NoticeRoute
컴포저블에handleException
과navigateToLogin
콜백을 전달하는 것은 오류 처리 및 인증 관련 네비게이션을 적절히 처리할 수 있게 합니다.feature/login/src/main/java/com/yapp/feature/login/LoginScreen.kt (3)
32-40
: 예외 처리 콜백 파라미터 추가가 적절합니다.
LoginRoute
컴포저블에handleException
파라미터를 추가한 것은 앱 전체의 중앙화된 예외 처리 패턴과 일치합니다.
49-58
: 사이드 이펙트 처리가 개선되었습니다.
LoginSideEffect.HandleException
을 사용하여 예외를 상위 컴포넌트로 위임하는 패턴이 구현되었습니다. 이는 토스트 메시지 표시 로직을 개별 화면에서 분리하여 앱 전체에서 일관된 오류 처리를 가능하게 합니다.
126-135
: 미리보기 컴포저블 업데이트가 적절합니다.
LoginScreenPreview
가 수정되어LoginScreen
을 직접 호출하도록 변경되었습니다. 이는 미리보기 코드를 더 간결하게 만들어 줍니다.feature/notice/src/main/java/com/yapp/feature/notice/noticedetail/NoticeDetailRoute.kt (1)
50-56
:collectWithLifecycle
반복 구독 가능성 확인
collectWithLifecycle
가Composable
본문 최상단에 위치해 있어,NoticeDetailRoute
가 재구성될 때마다 중복 구독이 일어날 가능성이 있습니다. 라이프사이클 확장 함수 내부에서LaunchedEffect
를 사용한 단일 구독이라면 문제없겠지만, 구현체가 보장되지 않는다면 다음과 같이remember
로 래핑해 한 번만 실행되도록 해두면 안전합니다.val sideEffectFlow = remember { viewModel.store.sideEffects } sideEffectFlow.collectWithLifecycle { /* ... */ }feature/schedule/src/main/java/com/yapp/feature/schedule/ScheduleScreen.kt (3)
51-64
: 새 파라미터 전달은 좋지만, 예외 기록이 누락될 수 있습니다
handleException
콜백으로 예외를 넘기면 공통 다이얼로그가 표시되지만, 여기서는 단순히 상위로 전달만 합니다. ViewModel 쪽에서 이미record()
를 호출하긴 하지만, 혹시 상위 계층(예:YappApp
)에서 예외를 무시하도록 구현되면 로깅이 누락될 수 있습니다. 필요 시 상위 콜백에서도it.record()
같은 처리를 추가하는 방안을 검토해 주세요.
88-96
: Indicator 색상 커스터마이징 👍
Pull-to-Refresh 인디케이터에 앱 컬러를 적용하여 디자인 일관성을 맞춘 점이 인상적입니다.
141-143
:fillMaxSize()
적용 시 스크롤 충돌 여부 확인 필요
LazyColumn
에fillMaxSize()
를 주면 상위Column
과 스크롤 영역이 겹칠 때 NestedScroll 충돌이 발생할 수 있습니다. 현재 동작이 정상인지 실제 기기에서 한 번 더 확인해 보세요.
feature/notice/src/main/java/com/yapp/feature/notice/navigation/NoticeNavigation.kt
Show resolved
Hide resolved
feature/notice/src/main/java/com/yapp/feature/notice/navigation/NoticeNavigation.kt
Show resolved
Hide resolved
feature/notice/src/main/java/com/yapp/feature/notice/noticedetail/NoticeDetailRoute.kt
Show resolved
Hide resolved
feature/notice/src/main/java/com/yapp/feature/notice/noticedetail/NoticeDetailRoute.kt
Show resolved
Hide resolved
feature/notice/src/main/java/com/yapp/feature/notice/noticedetail/NoticeDetailViewModel.kt
Show resolved
Hide resolved
feature/schedule/src/main/java/com/yapp/feature/schedule/ScheduleViewModel.kt
Show resolved
Hide resolved
26f3ba3
to
6014faf
Compare
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.
고생하셨습니다!
에러 처리 빠진 부분 있으면 작업하면서 나오는대로 처리할게요
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.
확인했습니다 ~
@@ -120,7 +121,7 @@ class LoginViewModel @Inject constructor( | |||
if (!email.matches(Regex.email)) { | |||
reduce { | |||
copy( | |||
isLoginEnabled = false, | |||
isLoginEnabled = true, |
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.
Q : 요기는 왜 false 에서 변경된걸까요 ??
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.
아 true로 하는게 좋긴하겠네요 ...
큰 이슈는 아닌 것 같아 다음에 반영할게요!
💡 Issue
🌱 Key changes
✅ To Reviewers
최대한 처리하긴 했는데 놓친게 있을 수도 있습니다 ... ㅜㅜ
📸 스크린샷
Summary by CodeRabbit
신규 기능
버그 수정
UI/UX 개선
기타