Skip to content

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

Merged
merged 9 commits into from
May 6, 2025

Conversation

jinukeu
Copy link
Member

@jinukeu jinukeu commented May 6, 2025

💡 Issue

🌱 Key changes

✅ To Reviewers

최대한 처리하긴 했는데 놓친게 있을 수도 있습니다 ... ㅜㅜ

📸 스크린샷

스크린샷
파일첨부바람

Summary by CodeRabbit

  • 신규 기능

    • 앱 전역에 공통 에러 다이얼로그 및 예외 처리 기능이 추가되었습니다.
    • 다양한 화면에서 예외 발생 시, 사용자에게 안내 다이얼로그 또는 추천 액션(예: 문의 링크 이동) 제공이 가능합니다.
  • 버그 수정

    • 서버 오류 코드 매핑 및 예외 메시지 처리 방식이 개선되어, 미정의 오류 발생 시 안정적으로 처리됩니다.
  • UI/UX 개선

    • 에러 다이얼로그 버튼 레이아웃이 추가되어, 상황에 따라 버튼이 세로 또는 가로로 배치됩니다.
    • 일부 알림/확인 다이얼로그 디자인이 개선되었습니다.
  • 기타

    • 예외 발생 시 토스트 대신 중앙화된 예외 처리로 일관성 있는 사용자 경험을 제공합니다.
    • 토큰 만료 등 인증 관련 오류 발생 시 자동으로 로그인 화면으로 이동합니다.

jinukeu added 7 commits May 6, 2025 18:37
- YappServerError에 `NOT_DEFINED` 오류 코드를 추가하고 `NotDefinedException` 예외 클래스를 추가합니다.
- `YappServerError.safeValueOf()` 함수를 추가하여, 정의되지 않은 오류 코드가 들어올 경우 `NOT_DEFINED`를 반환하도록 처리합니다.
- ApiResultCallAdapter와 OptionalApiResultCallAdapter에서 서버 오류 발생 시 `safeValueOf()`를 사용하여 예외를 가져오도록 수정합니다.
- `NotDefinedException`이 발생한 경우에는 에러 메시지를 설정하지 않도록 수정합니다.
Pull to refresh indicator 색상을 흰색으로 변경합니다.
Pull to refresh indicator 색상을 흰색으로 변경합니다.
@jinukeu jinukeu added the Feature 기능 추가, 개발 label May 6, 2025
@jinukeu jinukeu requested review from TaeseongYun and DongChyeon May 6, 2025 10:04
@jinukeu jinukeu self-assigned this May 6, 2025
Copy link

coderabbitai bot commented May 6, 2025

Important

Review skipped

Auto reviews are limited to specific labels.

🏷️ Labels to auto review (1)
  • CodeRabbit

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.

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

Walkthrough

이번 변경은 앱 전역에서 공통 에러 처리 다이얼로그를 도입하고, 각 주요 네비게이션 그래프와 화면에 예외 처리 콜백(handleException)을 일관적으로 전달하는 구조로 리팩터링합니다. 또한, 각 ViewModel과 화면에서 예외 발생 시 중앙의 에러 다이얼로그를 통해 사용자에게 안내 및 후속 조치를 제공하도록 구현되었습니다.

Changes

파일/그룹 변경 요약
app/src/main/java/com/yapp/app/YappApp.kt, YappAppViewModel.kt 앱 루트에 공통 에러 다이얼로그 및 예외 처리 상태 추가, ViewModel에서 추천 액션(문의 링크 열기) 처리 로직 도입
app/src/main/java/com/yapp/app/official/navigation/YappNavHost.kt 및 각 feature의 navigation 파일 모든 네비게이션 그래프에 handleException 콜백 추가 및 하위 그래프/라우트에 전달
core/designsystem/.../YappAlertDialog.kt 기존 다이얼로그를 YappAlertShortDialog로 이름 변경, 버튼 세로 배치의 YappAlertLongDialog 추가
core/model/.../YappExceptions.ktcore/data/.../ApiResultCallAdapter.kt, OptionalApiResultCallAdapter.kt 서버 에러 매핑 안전화(safeValueOf), 미정의 에러 예외 및 enum 추가, 메시지 할당 조건 강화
각 feature의 Contract.kt, Screen.kt, ViewModel.kt SideEffect에 HandleException 등 예외 처리 타입 추가, 예외 발생 시 handleException 콜백 호출로 통일, InvalidTokenException 등 인증 만료 시 로그인 네비게이션 SideEffect 도입
feature/home/.../HomeViewModel.kt 중복 데이터 로딩 방지 플래그 추가, 비동기 로딩 병렬화, 예외 처리 간소화 및 기록 일원화
기타 ForceUpdateDialog 등에서 다이얼로그 컴포넌트 교체, Preview 함수 등 부수적 변경

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
Loading

Assessment against linked issues

Objective Addressed Explanation
유저 인증 API, 유저 프로필 API, 스케쥴 API, 유저 알람 API에서 공통 에러 처리 팝업 적용 (#166)
비정상 토큰(InvalidTokenException) 발생 시 로그아웃 처리 (#166) InvalidTokenException 발생 시 로그인 네비게이션 SideEffect만 추가, 실제 로그아웃 처리 로직은 미포함
출석 API, 게시판 API, 유저 시스템 설정 관련 API에서 공통 에러 처리 팝업 적용 (#166) 출석/게시판/시스템 설정 관련 API에 대한 구체적 예외 처리 적용 여부는 본 변경에서 명확하지 않음.

Possibly related PRs

  • Feature/#144 : 운영 Url 불러오기 실패 처리 #145: OperationsRepository의 URL 조회 방식 변경 및 실패 처리 추가로, 본 PR의 문의 링크 열기 로직과 직접적으로 연관됨.
  • Feature/#90 token #93: YappNavHost 및 네비게이션 그래프에 로그인 네비게이션/예외 처리 파라미터 추가로, 본 PR의 네비게이션 파라미터 확장과 코드 수준에서 밀접하게 관련됨.

Poem

🐰
에러가 오면 이제는 당황 말아요
팝업이 뿅! 하고 안내해 주죠
문의도 링크로 척척 연결,
예외는 handleException으로 쏙쏙
토큰이 이상해도 로그인으로 슝—
토스트와 다이얼로그, 토끼의 마음처럼
앱은 더 든든해졌어요!


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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

‼️ IMPORTANT
Auto-reply has been disabled for this repository in the CodeRabbit settings. The CodeRabbit bot will not respond to your replies unless it is explicitly tagged.

  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need 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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@jinukeu
Copy link
Member Author

jinukeu commented May 6, 2025

@coderabbitai review

Copy link

coderabbitai bot commented May 6, 2025

✅ Actions performed

Review triggered.

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.

Copy link

@coderabbitai coderabbitai bot left a 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

📥 Commits

Reviewing files that changed from the base of the PR and between 83bb2ad and d181ed1.

📒 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: 예외 처리 사이드 이펙트 추가

ProfileSideEffectHandleException 사이드 이펙트를 추가하여 중앙화된 예외 처리 메커니즘의 일부로 구현되었습니다. 이를 통해 프로필 기능에서 발생하는 예외를 공통 처리 흐름으로 전달할 수 있게 되었습니다.

feature/signup/src/main/java/com/yapp/feature/signup/signup/page/email/EmailContract.kt (1)

42-42: 이메일 기능에 예외 처리 사이드 이펙트 추가

EmailSideEffectHandleException 사이드 이펙트를 추가하여 중앙화된 예외 처리의 일부로 구현되었습니다. 이는 앱 전체의 일관된 예외 처리 전략을 따르며, 이메일 기능에서 발생하는 예외를 공통 처리 흐름으로 전달할 수 있게 합니다.

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 사이드 이펙트를 추가한 것은 적절합니다. 이를 통해:

  1. 일반적인 예외는 중앙화된 에러 다이얼로그로 처리
  2. 토큰 무효화와 같은 인증 관련 예외는 로그인 화면으로 이동

이러한 구분된 처리는 사용자 경험을 향상시키는 좋은 접근 방식입니다.

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: 예외 처리 및 로그인 네비게이션 파라미터 추가

onNavigateToLoginhandleException 파라미터를 추가하여 에러 처리와 인증 관련 네비게이션을 일관되게 처리할 수 있게 되었습니다. 앱 전체의 공통 에러 처리 패턴과 일치합니다.


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: 향상된 예외 처리 로직 구현

예외 타입에 따른 처리를 세분화하셨네요:

  1. InvalidTokenException이 발생하면 로그인 화면으로 네비게이션
  2. 그 외 예외는 공통 예외 처리 메커니즘으로 전달하고 기록

이는 사용자 경험을 향상시키는 좋은 패턴입니다. 토큰 관련 문제가 발생하면 사용자를 로그인 화면으로 자연스럽게 안내할 수 있습니다.

feature/notice/src/main/java/com/yapp/feature/notice/notice/NoticeContract.kt (1)

29-30: 공통 예외 처리를 위한 사이드 이펙트 추가

NavigateToLoginHandleException 사이드 이펙트를 추가하셨습니다. 이는 앱 전체에서 일관된 에러 처리와 인증 관련 네비게이션을 가능하게 하는 좋은 패턴입니다.

다른 기능 모듈(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 인터페이스에 두 가지 새로운 사이드 이펙트가 추가되었습니다:

  1. NavigateToLogin: 로그인 화면으로의 네비게이션을 트리거합니다.
  2. HandleException: 예외 처리를 위한 데이터 클래스입니다.

이는 앱 전체의 일관된 예외 처리 및 네비게이션 패턴을 지원합니다.

feature/schedule/src/main/java/com/yapp/feature/schedule/navigation/ScheduleNavigation.kt (2)

17-20: 네비게이션 그래프에 에러 처리 콜백 추가

scheduleNavGraph 함수에 두 개의 콜백 매개변수가 추가되었습니다:

  1. handleException: 예외 처리를 위한 콜백
  2. 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: 새로운 사이드 이펙트 추가

공통 오류 처리 패턴에 맞게 두 가지 새로운 사이드 이펙트가 추가되었습니다:

  1. NavigateLogin: 토큰 만료 또는 인증 관련 문제 발생 시 로그인 화면으로 이동
  2. HandleException: 발생한 예외를 캡슐화하여 상위 컴포넌트에서 처리할 수 있도록 함

이러한 변경은 앱 전체의 일관된 오류 처리 전략을 구현하는 데 도움이 됩니다.

feature/signup/src/main/java/com/yapp/feature/signup/signup/page/email/EmailViewModel.kt (1)

69-83: 이메일 중복 검사 오류 처리 개선

이메일 중복 검사 시 발생하는 예외를 유형별로 구분하여 처리하도록 개선되었습니다:

  1. AlreadyRegisteredException: 이미 등록된 이메일인 경우 상태를 업데이트하여 사용자에게 알림
  2. 그 외 예외: 중앙 집중식 예외 처리 메커니즘으로 전달하고 로깅

이러한 구분은 사용자에게 더 명확한 피드백을 제공하고 예외 처리의 일관성을 유지하는 데 도움이 됩니다.

feature/history/src/main/java/com/yapp/feature/history/previous/PreviousHistoryScreen.kt (2)

31-36: 새로운 콜백 매개변수 추가

PreviousHistoryRoute 컴포저블에 두 가지 새로운 콜백 매개변수가 추가되었습니다:

  1. navigateToLogin: 인증 관련 문제 발생 시 로그인 화면으로 이동하기 위한 콜백
  2. handleException: 예외 처리를 상위 컴포넌트에 위임하기 위한 콜백

이러한 매개변수 추가는 앱 전체의 통합된 오류 처리 패턴에 맞춰 진행되었습니다.


49-50: 사이드 이펙트 처리 로직 추가

새로 추가된 사이드 이펙트를 처리하는 로직이 구현되었습니다:

  1. HandleException: 전달된 예외를 handleException 콜백을 통해 상위 컴포넌트로 위임
  2. NavigateLogin: navigateToLogin 콜백을 호출하여 로그인 화면으로 이동

이 구현은 최상위 컴포넌트(YappApp)에서 정의된 공통 오류 다이얼로그 및 네비게이션 로직과 연결되어 일관된 사용자 경험을 제공합니다.

feature/history/src/main/java/com/yapp/feature/history/navigation/HistoryNavigation.kt (2)

32-35: 중앙 집중식 예외 처리 및 로그인 네비게이션 추가

previousHistoryNavGraph 함수에 navigateToLoginhandleException 파라미터를 추가한 것은 앱 전체에 걸친 일관된 오류 처리 및 인증 관련 네비게이션 패턴을 구현하는 좋은 접근 방식입니다.


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 컴포저블에 handleExceptionnavigateToLogin 파라미터를 추가하여 중앙화된 예외 처리 및 인증 관련 네비게이션을 일관되게 구현했습니다.


56-57: 사이드 이펙트 처리 로직 추가

NoticeSideEffect.HandleExceptionNoticeSideEffect.NavigateToLogin 사이드 이펙트를 처리하는 코드를 적절히 추가했습니다. 이는 AI 요약에서 언급된 것처럼 다른 기능 모듈에서도 일관되게 적용된 패턴과 잘 일치합니다.

feature/profile/src/main/java/com/yapp/feature/profile/navigation/ProfileNavigation.kt (2)

21-22: 로그인 네비게이션 및 예외 처리 파라미터 추가

profileNavGraph 함수에 onNavigateToLoginhandleException 파라미터를 추가하여 중앙화된 예외 처리 및 인증 관련 네비게이션을 위한 일관된 패턴을 구현했습니다.


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: 토큰 만료와 일반 예외 처리 구분

예외 처리 로직이 크게 개선되었습니다:

  1. InvalidTokenException의 경우 로그인 화면으로 이동
  2. 그 외 예외는 중앙 처리 메커니즘으로 전달 및 로깅

이 구조는 토큰 만료와 같은 특수 케이스를 효과적으로 처리하면서, 일반 예외는 통합된 방식으로 사용자에게 표시할 수 있게 합니다.

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를 사용하여 코루틴 취소 예외는 다시 던지고 다른 예외는 적절히 처리하는 패턴이 잘 구현되었습니다. 예외 유형에 따라 다른 사이드 이펙트를 발생시키는 방식은 다음과 같은 이점이 있습니다:

  1. InvalidTokenException은 로그인 화면으로 이동
  2. 기타 예외는 중앙 처리 메커니즘으로 전달
  3. 모든 예외는 적절히 로깅

이러한 구조적 예외 처리는 사용자 경험을 개선하고 디버깅을 용이하게 합니다.


64-77: ClickNotificationSwitch 인텐트의 예외 처리 강화

EnterScreen과 동일한 패턴으로 예외 처리를 개선했습니다. 통지 스위치 상태 변경 시 발생할 수 있는 예외를 구조적으로 처리하여 적절한 사용자 피드백을 제공할 수 있게 되었습니다.

app/src/main/java/com/yapp/app/official/YappAppViewModel.kt (1)

1-25: 전체적인 ViewModel 구조가 깔끔합니다!

공통 에러 처리를 위한 ViewModel이 잘 설계되었습니다. onCommonErrorDialogRecommendActionButtonClick 함수는 에러 처리 다이얼로그에서 추천 액션 버튼을 클릭했을 때 문의 링크를 가져오는 기능을 적절하게 구현하고 있습니다. runCatchingIgnoreCancelled를 사용하여 취소 예외를 적절히 처리한 점이 좋습니다.

몇 가지 추가적인 개선 사항이 있을 수 있습니다:

  1. 함수명이 다소 길어서 가독성이 떨어질 수 있습니다. 더 간결한 이름(예: fetchUsageInquiryLink)을 고려해 보세요.
  2. 에러 상태를 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 함수에 handleExceptionnavigateToLogin 콜백을 추가한 것은 앱 전체의 중앙화된 예외 처리 및 인증 흐름과 일치합니다.


35-45: NoticeRoute에 콜백 전달이 적절합니다.

NoticeRoute 컴포저블에 handleExceptionnavigateToLogin 콜백을 전달하는 것은 오류 처리 및 인증 관련 네비게이션을 적절히 처리할 수 있게 합니다.

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 반복 구독 가능성 확인

collectWithLifecycleComposable 본문 최상단에 위치해 있어, 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() 적용 시 스크롤 충돌 여부 확인 필요
LazyColumnfillMaxSize()를 주면 상위 Column과 스크롤 영역이 겹칠 때 NestedScroll 충돌이 발생할 수 있습니다. 현재 동작이 정상인지 실제 기기에서 한 번 더 확인해 보세요.

@jinukeu jinukeu force-pushed the feature/#166-common-error-popup branch from 26f3ba3 to 6014faf Compare May 6, 2025 10:53
Copy link
Member

@DongChyeon DongChyeon left a comment

Choose a reason for hiding this comment

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

고생하셨습니다!
에러 처리 빠진 부분 있으면 작업하면서 나오는대로 처리할게요

@jinukeu jinukeu merged commit 6041786 into release/1.1.0 May 6, 2025
1 check passed
@jinukeu jinukeu deleted the feature/#166-common-error-popup branch May 6, 2025 12:28
Copy link
Contributor

@TaeseongYun TaeseongYun left a 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,
Copy link
Contributor

Choose a reason for hiding this comment

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

Q : 요기는 왜 false 에서 변경된걸까요 ??

Copy link
Member Author

Choose a reason for hiding this comment

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

아 true로 하는게 좋긴하겠네요 ...
큰 이슈는 아닌 것 같아 다음에 반영할게요!

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.

3 participants