Skip to content

Conversation

jinukeu
Copy link
Member

@jinukeu jinukeu commented May 1, 2025

💡 Issue

Summary by CodeRabbit

Summary by CodeRabbit

  • 버그 수정

    • URL 열기 방식이 개선되어, 잘못된 URL 입력 시 안전하게 처리되고 오류 발생 시 토스트 메시지로 안내됩니다.
    • 개인정보처리방침, 이용약관, 문의 링크 등 URL 정보를 불러오는 과정에서 실패 시 사용자에게 알림이 제공됩니다.
  • 신규 기능

    • URL 로드 실패 시 "관련 URL을 불러오지 못했어요."라는 안내 토스트 메시지가 추가되었습니다.
  • 리팩터링

    • URL 관련 데이터 로딩 방식이 Flow 기반에서 suspend 함수와 캐싱 방식으로 변경되어 성능과 안정성이 향상되었습니다.
    • URL 열기 확장 함수가 개선되어 예외 처리 및 로깅이 추가되었습니다.
  • 문서 및 리소스

    • URL 로드 실패 안내 메시지 리소스가 추가되었습니다.
    • 관련 라이브러리 및 의존성이 업데이트되었습니다.

@jinukeu jinukeu requested review from TaeseongYun and DongChyeon May 1, 2025 03:43
Copy link

coderabbitai bot commented May 1, 2025

"""

Walkthrough

이 변경사항은 운영 URL(문의, 이용약관, 개인정보처리방침 등) 불러오기 실패 시 글로벌 토스트로 실패를 알리는 처리를 도입합니다. 이를 위해 URL을 가져오는 기존의 Flow 기반 비동기 로직을 suspend 함수와 캐싱 방식으로 변경하고, URL 로드 실패 시 각 화면에서 토스트 메시지를 보여주는 사이드 이펙트(ShowUrlLoadFailToast)를 추가했습니다. 또한 URL 오픈 로직을 더 안전하게 처리하도록 개선하고, 관련 문자열 리소스를 추가했습니다.

Changes

파일/그룹 변경 요약
core/dataapi/OperationsRepository.kt, core/data/.../OperationsRepositoryImpl.kt URL 관련 메서드들을 Flow에서 suspend 함수로 변경, 캐싱 로직 추가
core/ui/build.gradle.kts core.commonAndroidtimber 라이브러리 의존성 추가
core/ui/extension/Context.kt Context의 openUrl 확장 함수 삭제
core/ui/extension/UriHandler.kt UriHandler.safeOpenUri 확장 함수 추가 (URL 스킴 보정, 예외 로깅)
core/ui/res/values/strings.xml URL 로드 실패 토스트 메시지 문자열 추가
feature/home/setting/SettingContract.kt, feature/login/LoginContract.kt, feature/signup/signup/SignUpContract.kt 각 화면의 SideEffect에 ShowUrlLoadFailToast 추가
feature/home/setting/SettingScreen.kt, feature/login/LoginScreen.kt, feature/signup/signup/SignUpScreen.kt URL 오픈 방식 개선 및 URL 로드 실패 시 토스트 표시 로직 추가
feature/home/setting/SettingViewModel.kt, feature/login/LoginViewModel.kt, feature/signup/signup/SignUpViewModel.kt URL 불러오기 로직을 suspend 함수 및 캐싱 방식으로 변경, 실패 시 토스트 사이드 이펙트 발생

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant ViewModel
    participant Repository
    participant API

    User->>ViewModel: URL 열기 요청 (예: 약관 클릭)
    alt URL 캐시 있음
        ViewModel->>User: 브라우저 오픈 side effect
    else URL 캐시 없음
        ViewModel->>Repository: suspend fun getUrl()
        Repository->>API: 원격 URL 요청
        API-->>Repository: URL 반환
        Repository-->>ViewModel: URL 반환
        alt URL 정상 반환
            ViewModel->>User: 브라우저 오픈 side effect
        else URL 실패(null)
            ViewModel->>User: ShowUrlLoadFailToast side effect
        end
    end
Loading

Assessment against linked issues

Objective Addressed Explanation
운영 URL 불러오기 실패 시 글로벌 토스트로 실패 처리 (#144)

Possibly related PRs

Suggested labels

Feature

Suggested reviewers

  • ashwon12

Poem

🐇
운영 URL을 불러올 때,
실패해도 걱정 마!
토스트로 살포시 알려주니
사용자 마음도 한결 가볍지.
안전한 URI, 캐싱도 척척—
토끼도 웃는 오늘의 코드 럭!
🍞✨
"""


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4690982 and c3a5cc3.

📒 Files selected for processing (3)
  • feature/home/src/main/java/com/yapp/feature/home/setting/SettingViewModel.kt (5 hunks)
  • feature/login/src/main/java/com/yapp/feature/login/LoginViewModel.kt (4 hunks)
  • feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpViewModel.kt (9 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (3)
feature/login/src/main/java/com/yapp/feature/login/LoginViewModel.kt (2)
feature/home/src/main/java/com/yapp/feature/home/setting/SettingViewModel.kt (1)
  • updateUrl (127-153)
feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpViewModel.kt (1)
  • updateUrl (248-258)
feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpViewModel.kt (2)
feature/home/src/main/java/com/yapp/feature/home/setting/SettingViewModel.kt (1)
  • updateUrl (127-153)
feature/login/src/main/java/com/yapp/feature/login/LoginViewModel.kt (1)
  • updateUrl (162-180)
feature/home/src/main/java/com/yapp/feature/home/setting/SettingViewModel.kt (2)
feature/login/src/main/java/com/yapp/feature/login/LoginViewModel.kt (1)
  • updateUrl (162-180)
feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpViewModel.kt (1)
  • updateUrl (248-258)
🔇 Additional comments (17)
feature/login/src/main/java/com/yapp/feature/login/LoginViewModel.kt (6)

14-15: 필요한 코루틴 유틸리티 임포트 추가

비동기 URL 가져오기 작업을 위한 필수 임포트가 추가되었습니다.


24-25: URL 속성의 nullable 타입 변경 적절함

URL이 로드되지 않았거나 실패했을 때 null을 허용하는 방식으로 변경하여 오류 상태를 더 명확하게 표현합니다.


85-94: 이용약관 URL 로드 실패 처리 로직 개선

이용약관 URL 로드 실패 시 토스트 메시지를 표시하는 처리가 추가되었습니다. 사용자 경험 측면에서 적절한 개선입니다.


95-104: 개인정보처리방침 URL 로드 실패 처리 로직 개선

개인정보처리방침 URL 로드 실패 시 토스트 메시지를 표시하는 처리가 추가되었습니다. 사용자 경험 측면에서 적절한 개선입니다.


106-109: 화면 진입 시 URL 미리 로드 처리

로그인 화면 진입 시 이용약관과 개인정보처리방침 URL을 미리 로드하는 방식으로 변경하여 사용자 경험을 향상시켰습니다.


162-180: URL 로드 및 캐싱 로직 개선

updateUrl() 함수가 추가되어 다음과 같은 이점을 제공합니다:

  1. 코루틴을 사용한 비동기 병렬 URL 로드
  2. 이미 캐시된 URL이 있으면 재사용하는 효율적인 메커니즘
  3. 오류 처리 및 실패 시 null 반환으로 안전성 향상

이 접근 방식은 SignUpViewModelSettingViewModel에서 사용하는 패턴과 일치하여 코드베이스 전반의 일관성을 유지합니다.

feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpViewModel.kt (7)

17-18: 적절한 코루틴 import 추가 확인

비동기 URL 로딩을 위한 코루틴 관련 import들이 추가되었습니다. 이는 새로운 updateUrl() 함수에서 사용됩니다.


34-34: URL 로드 실패 처리를 위한 null 가능성 추가

inquiryLink가 non-null 빈 문자열에서 nullable 타입으로 변경되었습니다. 이는 URL 로드 실패 시 적절하게 처리하기 위한 좋은 변경입니다.


59-71: EnterScreen 처리 로직 개선

Flow 기반 URL 로딩에서 코루틴 기반 접근 방식으로 변경되었습니다. 이는 다른 화면들과의 일관성을 유지하고 URL 로드 실패를 더 잘 처리할 수 있게 합니다.


192-200: URL 로드 실패 처리 로직 추가

URL을 로드하고 사용하는 방식이 개선되었습니다:

  1. 코루틴을 실행하여 URL을 최신 상태로 업데이트합니다
  2. URL이 성공적으로 로드된 경우에만 브라우저를 엽니다
  3. URL 로드에 실패한 경우 사용자에게 토스트 메시지로 알립니다

이 변경사항은 PR 목표인 "운영 URL 불러오기 실패 처리"에 잘 부합합니다.


224-230: 가독성을 위한 코드 포맷팅 개선

UnprocessedSignUpException 처리 로직의 포맷팅이 개선되었습니다. 다중 라인 호출은 코드의 가독성을 향상시킵니다.


248-258: 새로운 URL 업데이트 함수 구현 확인

URL 로딩을 위한 새로운 suspend 함수가 잘 구현되었습니다:

  • 이미 캐시된 URL이 있으면 재사용하여 불필요한 네트워크 호출 방지
  • runCatching을 사용하여 예외 처리
  • coroutineScopeasync를 사용하여 구조화된 동시성 제공
  • 이전 리뷰에서 지적된 getTermsOfServiceLink() 대신 올바르게 getUsageInquiryLink()를 호출

이 구현은 다른 뷰모델의 updateUrl() 함수와 일관된 패턴을 따르고 있습니다.


1-259: 전체적인 구현에 대한 의견

URL 로드 실패 처리 로직이 잘 구현되었습니다. Flow 기반 접근 방식에서 코루틴 기반 접근 방식으로의 전환은 코드를 더 간결하게 만들고 오류 처리를 개선했습니다. 전체 애플리케이션에서 일관된 패턴을 따르고 있어 코드 베이스의 유지 관리성이 향상됩니다.

이 변경사항은 PR 목표인 "운영 URL 불러오기 실패 처리"를 성공적으로 달성했습니다.

feature/home/src/main/java/com/yapp/feature/home/setting/SettingViewModel.kt (4)

42-47: 메인 스레드 차단 가능성 – Dispatcher 지정 필요

updateUrl() 내부에서 네트워크/IO 작업(operationsRepository.*)이 수행되지만,
viewModelScope.launch { … } 는 기본적으로 Main dispatcher를 사용합니다.
리포지토리에서 별도 withContext(Dispatchers.IO) 전환을 보장하지 않는 이상 UI 스레드가 블로킹될 수 있습니다.

- viewModelScope.launch {
+ viewModelScope.launch(Dispatchers.IO) {   // 또는 updateUrl() 내부에서 withContext(IO)
     val enabled = alarmRepository.getMasterAlarmStatus()
-    reduce { copy(isNotificationEnabled = enabled) }
-    updateUrl()
+    withContext(Dispatchers.Main) {
+        reduce { copy(isNotificationEnabled = enabled) }
+    }
+    updateUrl()
 }

UI 지터를 방지하려면 IO dispatcher를 명시하거나, updateUrl() 내에서 withContext(Dispatchers.IO) 로 감싸 주세요.
[ suggest_essential_refactor ]


65-94: 중복 로직 추출 필요 – 헬퍼 함수로 통합하세요

ClickPrivacyPolicyItem, ClickTermsItem, ClickInquiryItem 블록이
updateUrl() 호출 → 널 체크 → 사이드이펙트 분기 패턴을 그대로 반복하고 있습니다.
이전 커밋 리뷰에서도 동일한 리팩터링(예: handleUrlRequest())을 권고했으나 아직 반영되지 않았습니다.

중복 제거는 유지보수 비용·버그 확률을 줄여줍니다. 동일 로직이 세 곳 이상이면 추출이 권장됩니다.
[ duplicate_comment ][ suggest_essential_refactor ]


127-153: coroutineScope 불필요 사용 – 코드 간소화 가능

updateUrl() 에서 다시 coroutineScope { … } 를 열고 세 async 를 만들었는데,
이미 suspend 컨텍스트이며 별도 스코프가 없어도 구조적 동시성 보장이 됩니다.
coroutineScope 를 제거해도 동일하게 작동하며 코드가 간결해집니다.

추가로, 세 async 각각이 동일 리포지토리 콜을 수행하므로
async { runCatching { … } }runCatching { … } 로 간단히 직렬 호출 후
await 생략(병렬 필요 시 유지) 등도 고려해 보세요.
[ suggest_optional_refactor ]


127-153: 필요 URL만 가져오도록 세분화 권장

모든 인텐트에서 updateUrl() 은 세 URL를 모두 조회합니다.
사용자가 ‘문의하기’만 누른 경우에도 개인정보처리방침·이용약관까지 매번 네트워크 호출될 수 있습니다
(캐시 비어있는 초기 앱 첫 클릭 시 특히 불필요).

인텐트별로 필요한 URL만 로드하도록
updateUrl(urlType: UrlType) 같은 세분화 함수 도입을 검토해 주세요.
[ suggest_optional_refactor ]

✨ Finishing Touches
  • 📝 Generate Docstrings

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 1, 2025

@coderabbitai review

Copy link

coderabbitai bot commented May 1, 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: 4

♻️ Duplicate comments (1)
feature/login/src/main/java/com/yapp/feature/login/LoginViewModel.kt (1)

84-99: 재시도 로직-UX 동일 이슈

SettingViewModel 과 동일하게 재시도 직후 즉시 실패 토스트를 표시하여 성공/실패 여부가 확정되기 전 사용자에게 혼란을 줄 수 있습니다.
앞서 제시한 개선안을 함께 적용해 주세요.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e8319a8 and 4690982.

📒 Files selected for processing (15)
  • core/data-api/src/main/java/com/yapp/dataapi/OperationsRepository.kt (1 hunks)
  • core/data/src/main/java/com/yapp/core/data/data/repository/OperationsRepositoryImpl.kt (2 hunks)
  • core/ui/build.gradle.kts (1 hunks)
  • core/ui/src/main/java/com/yapp/core/ui/extension/Context.kt (0 hunks)
  • core/ui/src/main/java/com/yapp/core/ui/extension/UriHandler.kt (1 hunks)
  • core/ui/src/main/res/values/strings.xml (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 (4 hunks)
  • feature/home/src/main/java/com/yapp/feature/home/setting/SettingViewModel.kt (5 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/signup/src/main/java/com/yapp/feature/signup/signup/SignUpContract.kt (1 hunks)
  • feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpScreen.kt (5 hunks)
  • feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpViewModel.kt (5 hunks)
💤 Files with no reviewable changes (1)
  • core/ui/src/main/java/com/yapp/core/ui/extension/Context.kt
🧰 Additional context used
🧬 Code Graph Analysis (3)
feature/login/src/main/java/com/yapp/feature/login/LoginViewModel.kt (2)
feature/home/src/main/java/com/yapp/feature/home/setting/SettingViewModel.kt (1)
  • updateUrl (121-147)
feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpViewModel.kt (1)
  • updateUrl (235-247)
feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpViewModel.kt (2)
feature/home/src/main/java/com/yapp/feature/home/setting/SettingViewModel.kt (1)
  • updateUrl (121-147)
feature/login/src/main/java/com/yapp/feature/login/LoginViewModel.kt (1)
  • updateUrl (155-173)
feature/home/src/main/java/com/yapp/feature/home/setting/SettingViewModel.kt (2)
feature/login/src/main/java/com/yapp/feature/login/LoginViewModel.kt (1)
  • updateUrl (155-173)
feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpViewModel.kt (1)
  • updateUrl (235-247)
🪛 detekt (1.23.7)
core/ui/src/main/java/com/yapp/core/ui/extension/UriHandler.kt

[warning] 16-16: The caught exception is too generic. Prefer catching specific exceptions to the case that is currently handled.

(detekt.exceptions.TooGenericExceptionCaught)

🔇 Additional comments (26)
core/ui/build.gradle.kts (1)

15-15: 필요한 종속성 추가 확인됨

안전한 URI 처리와 로깅을 위한 core.commonAndroid와 timber 종속성이 적절하게 추가되었습니다. 이는 URL 불러오기 실패 처리를 위한 핵심 기능을 지원합니다.

Also applies to: 19-19

feature/login/src/main/java/com/yapp/feature/login/LoginContract.kt (1)

38-38: URL 로드 실패 처리를 위한 사이드 이펙트 추가 확인

URL 불러오기 실패 시 토스트 메시지를 표시하는 사이드 이펙트가 적절하게 추가되었습니다. 이는 다른 기능 모듈과 일관되게 URL 오류 처리 방식을 개선합니다.

core/ui/src/main/res/values/strings.xml (1)

9-9: URL 로드 실패 메시지 추가 확인

URL 불러오기 실패 시 사용자에게 표시할 메시지가 적절하게 추가되었습니다. 메시지 내용이 명확하고 사용자 친화적입니다.

feature/home/src/main/java/com/yapp/feature/home/setting/SettingContract.kt (1)

29-29: URL 로드 실패 처리를 위한 사이드 이펙트 추가 확인

설정 화면에서 URL 불러오기 실패 시 토스트 메시지를 표시하는 사이드 이펙트가 적절하게 추가되었습니다. 이는 로그인 및 회원가입 모듈과 일관된 방식으로 구현되어 앱 전체적으로 URL 오류 처리 패턴이 통일되었습니다.

feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpContract.kt (1)

55-55: URL 로드 실패를 표시하는 Side Effect 추가 👍

ShowUrlLoadFailToast Side Effect를 추가하여 URL 로드 실패 시 사용자에게 알림을 제공하는 방식이 좋습니다. 이는 다른 기능(Login, Setting)과 일관되게 구현되어 사용자 경험을 향상시킵니다.

feature/home/src/main/java/com/yapp/feature/home/setting/SettingScreen.kt (4)

3-3: 필요한 import 문 추가 확인

URL 처리 로직 개선을 위한 import 추가가 적절합니다. Toast, LocalUriHandler, safeOpenUri 확장 함수 및 문자열 리소스를 위한 import가 포함되어 있습니다.

Also applies to: 16-16, 31-31, 33-33


46-46: UriHandler 인스턴스 추가 확인

LocalUriHandler.current를 사용하는 방식은 Jetpack Compose의 권장 방식입니다.


53-53: 더 안전한 URL 열기 방식으로 변경

context.openUrl()에서 uriHandler.safeOpenUri()로 변경하여 URL 처리가 더 안전해졌습니다. 이 방식은 URL 스키마 검증 및 오류 로깅을 포함하여 더 견고한 구현을 제공합니다.


60-62: URL 로드 실패 처리 추가

URL 로드 실패 시 토스트 메시지를 표시하는 로직이 추가되었습니다. 사용자에게 명확한 피드백을 제공하여 사용자 경험이 향상되었습니다.

feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpScreen.kt (5)

3-3: 필요한 import 문 추가 확인

URL 처리 로직 개선을 위한 import 추가가 적절합니다. Toast, LocalUriHandler, safeOpenUri 확장 함수 및 문자열 리소스를 위한 import가 포함되어 있습니다.

Also applies to: 24-24, 37-37, 40-40


60-60: UriHandler 인스턴스 추가 확인

LocalUriHandler.current를 사용하는 방식은 Jetpack Compose의 권장 방식입니다.


67-67: 더 안전한 URL 열기 방식으로 변경

safeOpenUri() 확장 함수를 사용하여 URL 열기 방식이 개선되었습니다. 이는 URL 유효성 검사와 오류 처리를 포함하여 더 안전한 구현을 제공합니다.


68-74: URL 로드 실패 처리 추가

URL 로드 실패 시 토스트 메시지를 표시하는 로직이 추가되었습니다. 이는 사용자에게 명확한 피드백을 제공하고 다른 기능(Login, Setting)과 일관된 사용자 경험을 제공합니다.


201-201: 코드 포맷팅 수정

if 조건문 뒤에 공백을 추가하여 코드 가독성이 향상되었습니다.

feature/login/src/main/java/com/yapp/feature/login/LoginScreen.kt (4)

15-15: 필요한 import 문 추가 확인

URL 처리 로직 개선을 위한 import 추가가 적절합니다. LocalUriHandler, safeOpenUri 확장 함수 및 문자열 리소스를 위한 import가 포함되어 있습니다.

Also applies to: 18-18, 24-24


43-43: UriHandler 인스턴스 추가 확인

LocalUriHandler.current를 사용하는 방식은 Jetpack Compose의 권장 방식입니다.


53-53: 더 안전한 URL 열기 방식으로 변경

context.openUrl()에서 uriHandler.safeOpenUri()로 변경하여 URL 처리가 더 안전해졌습니다. 이 방식은 URL 스키마 검증 및 오류 로깅을 포함하여 더 견고한 구현을 제공합니다.


63-69: URL 로드 실패 처리 추가

URL 로드 실패 시 토스트 메시지를 표시하는 로직이 추가되었습니다. 사용자에게 명확한 피드백을 제공하여 사용자 경험이 향상되었습니다.

core/data-api/src/main/java/com/yapp/dataapi/OperationsRepository.kt (1)

8-12: Flow에서 suspend 함수로 URL 반환 타입 변경

URL을 가져오는 메서드의 반환 타입을 Flow<String>에서 suspend fun으로 변경한 것은 비동기 처리를 단순화하고 코드 가독성을 향상시키는 좋은 결정입니다.

feature/signup/src/main/java/com/yapp/feature/signup/signup/SignUpViewModel.kt (3)

33-33: inquiryLink 속성을 nullable로 변경

inquiryLink 속성을 null로 초기화하여 URL이 로드되지 않은 상태를 명확하게 표현할 수 있게 되었습니다.


68-68: 화면 진입 시 URL 로드 로직 개선

화면 진입 시 즉시 URL을 업데이트하는 방식으로 변경한 것은 좋은 접근입니다.


187-194: URL 로드 실패 시 사용자 피드백 추가

URL이 null일 경우 사용자에게 토스트 메시지를 표시하는 처리가 잘 추가되었습니다. 이는 사용자 경험을 향상시키는 좋은 개선점입니다.

core/data/src/main/java/com/yapp/core/data/data/repository/OperationsRepositoryImpl.kt (2)

25-27: URL 캐싱을 위한 속성 추가

URL을 캐싱하기 위한 속성들을 추가한 것은 네트워크 호출을 최소화하고 성능을 향상시키는 좋은 접근입니다.


50-66: URL 반환 메소드의 효율적인 구현

URL을 가져오는 메소드들이 캐싱 로직을 포함하여 효율적으로 구현되었습니다. 기존 값이 있으면 반환하고, 없을 경우에만 API를 호출하는 방식은 네트워크 리소스를 절약하는 좋은 패턴입니다.

또한 also 블록을 사용하여 API 응답을 캐싱하는 방식도 간결하고 가독성이 좋습니다.

feature/home/src/main/java/com/yapp/feature/home/setting/SettingViewModel.kt (2)

23-26: 동시 접근 시 가시성 문제 가능성

privacyPolicyLink 등 세 변수는 var 로 선언되었습니다. 동일 ViewModel 내부에서만 접근하더라도 다중 코루틴이 병렬로 updateUrl() 을 실행하면 최근 값이 덮어써지는 경쟁 조건이 발생할 수 있습니다.

  • Mutex 혹은 atomic 변수를 이용해 한 번만 갱신
  • 또는 private val _links = mutableStateOf<Links?>(null) 등 불변 객체로 묶어 변경 지점을 단일화

검토 부탁드립니다.


121-147: ⚠️ Potential issue

제너릭 타입 불일치로 인한 컴파일 오류 가능성 – Result<String>Result<String?>

if/else 두 분기에서 반환 타입이 달라 async{} 블럭의 공통 타입을 맞추지 못해 컴파일이 실패할 수 있습니다.

  • runCatching { … }Result<String>
  • Result.success(privacyPolicyLink)Result<String?>

Result 는 불공변(invariant)이므로 Result<String>Result<String?> 로 승격할 수 없습니다. 이후 await().getOrNull() 결과를 String? 으로 받을 때도 타입 불일치가 발생합니다.

아래와 같이 Result 대신 최종 값(String?)만 반환하도록 수정하면 타입 문제가 사라지고 코드도 간결해집니다.

-private fun updateUrl() = viewModelScope.launch {
-    val privacyPolicyDeferred = async {
-        if (privacyPolicyLink == null) {
-            runCatching { operationsRepository.getPrivacyPolicyLink() }
-        } else {
-            Result.success(privacyPolicyLink)
-        }
-    }
+private fun updateUrl() = viewModelScope.launch {
+    val privacyPolicyDeferred = async {
+        privacyPolicyLink ?: runCatching { operationsRepository.getPrivacyPolicyLink() }.getOrNull()
+    }
-    val termsDeferred = async {
-        if (termsLink == null) {
-            runCatching { operationsRepository.getTermsOfServiceLink() }
-        } else {
-            Result.success(termsLink)
-        }
-    }
+    val termsDeferred = async {
+        termsLink ?: runCatching { operationsRepository.getTermsOfServiceLink() }.getOrNull()
+    }
-    val inquiryDeferred = async {
-        if (inquiryLink == null) {
-            runCatching { operationsRepository.getUsageInquiryLink() }
-        } else {
-            Result.success(inquiryLink)
-        }
-    }
+    val inquiryDeferred = async {
+        inquiryLink ?: runCatching { operationsRepository.getUsageInquiryLink() }.getOrNull()
+    }
-
-    privacyPolicyLink = privacyPolicyDeferred.await().getOrNull()
-    termsLink = termsDeferred.await().getOrNull()
-    inquiryLink = inquiryDeferred.await().getOrNull()
+    privacyPolicyLink = privacyPolicyDeferred.await()
+    termsLink = termsDeferred.await()
+    inquiryLink = inquiryDeferred.await()
 }

Likely an incorrect or invalid review comment.

jinukeu added 2 commits May 1, 2025 12:56
url 업데이트 로직의 coroutine scope를 viewModelScope에서 coroutineScope로 변경합니다.
@jinukeu
Copy link
Member Author

jinukeu commented May 1, 2025

@coderabbitai review

Copy link

coderabbitai bot commented May 1, 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
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 2dd931c into develop May 1, 2025
1 check passed
@jinukeu jinukeu deleted the feature/#144-url-fail branch May 1, 2025 13:46
@jinukeu jinukeu changed the title Feature/#144 : 운영 Url 불러오기 실패 처리 #144 url fail Feature/#144 : 운영 Url 불러오기 실패 처리 May 2, 2025
@jinukeu jinukeu self-assigned this May 4, 2025
@jinukeu jinukeu added the Feature 기능 추가, 개발 label May 4, 2025
@jinukeu jinukeu restored the feature/#144-url-fail branch May 4, 2025 14:27
@jinukeu jinukeu mentioned this pull request May 4, 2025
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.

[Feature] 운영 Url 불러오기 실패 처리
2 participants