Skip to content

Conversation

@m6z1
Copy link
Member

@m6z1 m6z1 commented Jan 31, 2026

📌𝘐𝘴𝘴𝘶𝘦𝘴

📎𝘞𝘰𝘳𝘬 𝘋𝘦𝘴𝘤𝘳𝘪𝘱𝘵𝘪𝘰𝘯

  • 사진을 여러개 첨부해도, 개수가 1로 뜸
  • 오래된순/최신순 필터 안됨
  • 피드 별점 ‘내 별점’으로 수정
  • 서재 > 필터 클릭 시 앱 다운
  • 터치 영역 수정
  • 글 작성 그만두기 모달 크기 수정
  • 피드 상세글 > 작품 제목 > title2
  • 마이페이지 > 작품 분석 간격
  • 글 수정 시, 글 새로 생김+장르 카테고리 초기화
  • [소소피드] 글 반영 안됨
  • 추천글 반영 안됨
  • 내 피드 > 글 찾기 필터 반영X
  • 내 피드 날짜 반영 안됨

📷𝘚𝘤𝘳𝘦𝘦𝘯𝘴𝘩𝘰𝘵

💬𝘛𝘰 𝘙𝘦𝘷𝘪𝘦𝘸𝘦𝘳𝘴

Summary by CodeRabbit

릴리스 노트

  • 새 기능

    • 편집 취소 확인 팝업 추가
    • SOSO 피드 탭에서 ALL/RECOMMENDED 선택 기능 추가
    • 피드 정렬 옵션 네이밍/기본 정렬 변경(표시 및 동작 개선)
  • 버그 수정 / 동작 개선

    • 피드 항목 클릭 반응성 개선(디바운스 처리)
    • 댓글/로딩 상태 및 페이징/새로고침 처리 개선
  • 스타일

    • 피드 상세 레이아웃 단순화(리사이클러뷰 사용)
    • 마이페이지 구분선 및 제목 스타일 조정
    • 하단 시트 해제 동작 개선

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions github-actions bot requested review from devfeijoa and s9hn January 31, 2026 12:39
@m6z1 m6z1 changed the base branch from develop to release/1.6.0 January 31, 2026 12:39
@coderabbitai
Copy link

coderabbitai bot commented Jan 31, 2026

Walkthrough

다수의 피드 관련 로직과 UI를 리팩터링합니다. 다이얼로그 바인딩과 다이얼로그 레이아웃 추가, FeedDetail에서 새로고침 래퍼 제거, FeedOrder 열거형 및 MyFeedFilter API 변경, FeedRepository 캐시 구조 재설계와 FeedViewModel의 상태/페이징 로직 추가 등이 포함됩니다. (50단어 이내)

Changes

Cohort / File(s) Summary
Dialog / UI 리소스
app/src/main/java/com/into/websoso/ui/createFeed/CreatingFeedDialogFragment.kt, app/src/main/res/layout/dialog_editing_cancel_feed.xml
CreatingFeedDialogFragment의 뷰 바인딩 및 레이아웃을 DialogReportPopupMenuBinding/dialog_report_popup_menu에서 DialogEditingCancelFeedBinding/dialog_editing_cancel_feed로 교체; 새 다이얼로그 레이아웃 추가
FeedDetail UI / 액티비티
app/src/main/java/com/into/websoso/ui/feedDetail/FeedDetailActivity.kt, app/src/main/res/layout/activity_feed_detail.xml, app/src/main/java/com/into/websoso/ui/feedDetail/FeedDetailViewModel.kt
SSPullToRefreshLayout 제거 및 내부 RecyclerView를 직접 사용하도록 레이아웃/Activity 조정; 관련 setupRefreshView/스테이트 관련 호출 제거; ViewModel에서 댓글 관련 로딩 플로우 수정
Feed 기능·모델 변경
feature/feed/src/main/java/com/into/websoso/feature/feed/model/FeedOrder.kt, feature/feed/src/main/java/com/into/websoso/feature/feed/model/MyFeedFilter.kt, feature/feed/src/main/java/com/into/websoso/feature/feed/FeedUiState.kt
FeedOrder 열거형 항목명 변경(NEWEST→RECENT, OLDEST→OLD), MyFeedFilter의 isPublicisVisibleisUnVisible 추가, FeedSourceData.sort 기본값 RECENT로 변경
Feed ViewModel·화면·컴포넌트
feature/feed/src/main/java/com/into/websoso/feature/feed/FeedViewModel.kt, feature/feed/src/main/java/com/into/websoso/feature/feed/FeedScreen.kt, feature/feed/src/main/java/com/into/websoso/feature/feed/component/.../FeedSection.kt, .../MyFeedFilterModal.kt
FeedViewModel에 MutableStateFlow 기반 uiState 및 페이징/갱신/필터/좋아요/신고/삭제 관련 공개 메서드 대거 추가; FeedScreen 정렬 매핑 및 FeedSection 클릭/이미지/평점 표시 변경; MyFeedFilterModal 가시성 플래그 분리
Repository 및 데이터 레이어
data/feed/src/main/java/com/into/websoso/data/feed/repository/FeedRepository.kt, core/network/src/main/java/com/into/websoso/core/network/datasource/user/UserApi.kt
FeedRepository를 생성자 주입형으로 재구성하고 내부 캐시(일반/추천)를 도입하여 페이징/중복 병합 로직 추가; UserApi의 쿼리 파라미터 키 genresgenreNames 변경
기타 레이아웃·사소 변경
app/src/main/res/layout/fragment_my_page.xml, app/src/main/res/layout/item_feed_detail_header.xml, feature/library/src/main/java/com/into/websoso/feature/library/LibraryScreen.kt, app/src/main/java/com/into/websoso/ui/main/feed/FeedFragment.kt
MyPage에 프로필 구분선 추가 및 제목 여백/패딩 조정, item_feed_detail_header 텍스트 스타일 조정, 라이브러리 바텀시트 confirmValueChange 변경, FeedFragment 일부 브랜치 포맷 변경

Sequence Diagram(s)

sequenceDiagram
    participant UI as FeedScreen / UI
    participant VM as FeedViewModel
    participant Repo as FeedRepository
    participant API as FeedApi (네트워크)
    participant DB as LibraryLocalDataSource

    UI->>VM: fetchNextPage(feedId?)
    VM->>Repo: fetchFeeds(params...)
    Repo->>API: GET /feeds (쿼리: lastFeedId,size,...)
    API-->>Repo: FeedsResponse
    Repo->>DB: syncNovelEntities(removed/updated)
    DB-->>Repo: OK
    Repo-->>VM: FeedsEntity(merged 캐시)
    VM-->>UI: uiState 업데이트 (feeds, loading, isLoadable)
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

Suggested labels

🔨 [FIX], ♻️ [REFACTOR], 🏹 궁사 명지

Suggested reviewers

  • s9hn

Poem

🐰 토끼가 말하네, 깡충깡충 변화 왔네,
바인딩 바뀌고 정렬이 새 이름 입었네,
캐시가 정리되고 뷰모델이 분주해,
필터는 두 갈래, 레이아웃은 한층 단정해,
삐약—피드가 더 반짝반짝해!

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.63% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 '마이페이지 및 피드소소 QA 반영'이며, 이는 변경 사항의 주요 내용과 관련이 있습니다.
Linked Issues check ✅ Passed 변경 사항이 연결된 이슈 #796의 모든 목표를 충족합니다: 사진 개수 표시 수정, 정렬 필터 복구, 별점 라벨 변경, 앱 크래시 해결, 터치 영역 조정, 모달 크기 수정, 타이포그래피 업데이트, 간격 조정.
Out of Scope Changes check ✅ Passed 모든 변경 사항이 연결된 이슈 #796의 QA 반영 목표와 관련이 있으며 범위 내에 있습니다.
Description check ✅ Passed PR 설명이 필수 템플릿 섹션(이슈, 작업 설명, 스크린샷, 검토자 의견)을 모두 포함하고 있으며, 작업 설명에 13개의 구체적인 QA 항목이 명시되어 있습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/796

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

Comment @coderabbitai help to get the list of available commands and usage tips.

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
feature/feed/src/main/java/com/into/websoso/feature/feed/FeedScreen.kt (1)

231-234: ⚠️ Potential issue | 🟡 Minor

디버그 로그를 제거해주세요.

Log.d("123123", tab.toString())는 개발 중 디버깅 목적으로 추가된 것으로 보입니다. 프로덕션 코드에서는 제거하거나 의미 있는 태그로 변경해야 합니다.

🗑️ 디버그 로그 제거
                     onClick = {
-                        Log.d("123123", tab.toString())
                         onTabClick(tab)
                     },
🤖 Fix all issues with AI agents
In `@app/src/main/res/layout/dialog_editing_cancel_feed.xml`:
- Around line 11-19: The ImageView with id iv_editing_cancel_feed is missing
accessibility info; decide if it's decorative or meaningful: if decorative, add
android:contentDescription="@null" and android:importantForAccessibility="no" on
iv_editing_cancel_feed to hide it from screen readers; if it conveys meaning,
add a descriptive contentDescription referencing a string resource (e.g.,
`@string/`...), and ensure it is not set focusable or clickable for unintended
traversal.

In
`@feature/feed/src/main/java/com/into/websoso/feature/feed/component/MyFeedFilterModal.kt`:
- Around line 138-140: 비공개글 토글의 상태 반전 로직이 역으로 되어 있습니다; in MyFeedFilterModal
(variable tempIsUnVisible) update the onClick handler to mirror 공개 로직: keep
isSelected = tempIsUnVisible == true, and change the onClick assignment from
using `tempIsUnVisible == false` to check `tempIsUnVisible == true` so that
clicking sets tempIsUnVisible = if (tempIsUnVisible == true) null else true
(i.e., select -> true, deselect -> null).
- Around line 156-158: onApplyFilterClick 호출에서 MyFeedFilter 생성자에 비공개 글 필터 값이
누락되어 있으니 .debouncedClickable 블록 내에서 MyFeedFilter(tempGenres, tempIsVisible) 대신
MyFeedFilter에 세 번째 인자로 tempIsUnVisible을 추가해 호출하도록 수정하세요; 대상 심볼은
onApplyFilterClick, MyFeedFilter, tempIsUnVisible, tempGenres, tempIsVisible입니다.

In `@feature/feed/src/main/java/com/into/websoso/feature/feed/FeedViewModel.kt`:
- Line 68: Remove the debug Log.d call introduced for development; locate the
Log.d("123123 카테고리", category.toString()) inside FeedViewModel (the method where
category is handled) and delete that statement (or replace it with a proper
production-level logger if persistent logging is required, e.g., using Timber or
a structured logger and an appropriate tag/message).
🧹 Nitpick comments (4)
app/src/main/res/layout/dialog_editing_cancel_feed.xml (1)

36-70: 버튼 터치 피드백(리플) 추가를 권장합니다.
현재 TextView 버튼에 시각적 클릭 피드백이 없어 UX가 약할 수 있습니다.

✨ 제안 수정
 <TextView
     android:id="@+id/tv_editing_cancel_feed_cancel_button"
+    android:foreground="?attr/selectableItemBackground"
+    android:clickable="true"
+    android:focusable="true"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     ... />

 <TextView
     android:id="@+id/tv_editing_cancel_feed_alert_cancel_button"
+    android:foreground="?attr/selectableItemBackground"
+    android:clickable="true"
+    android:focusable="true"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     ... />
app/src/main/res/layout/activity_feed_detail.xml (1)

69-74: WebsosoLoadingLayout에 constraint가 누락되었습니다.

ConstraintLayout 내에서 WebsosoLoadingLayout이 constraint 없이 match_parent로 설정되어 있습니다. ConstraintLayout에서는 0dp와 함께 constraint를 명시하는 것이 권장됩니다. 현재 동작에는 문제가 없을 수 있지만, 명시적인 constraint 추가를 고려해 주세요.

🔧 제안된 수정
 <com.into.websoso.core.common.ui.custom.WebsosoLoadingLayout
     android:id="@+id/wll_feed"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
+    android:layout_width="0dp"
+    android:layout_height="0dp"
     android:elevation="100dp"
-    android:visibility="invisible" />
+    android:visibility="invisible"
+    app:layout_constraintBottom_toBottomOf="parent"
+    app:layout_constraintEnd_toEndOf="parent"
+    app:layout_constraintStart_toStartOf="parent"
+    app:layout_constraintTop_toTopOf="parent" />
app/src/main/java/com/into/websoso/ui/feedDetail/FeedDetailActivity.kt (1)

579-579: 사용되지 않는 상수 LOTTIE_IMAGE 제거를 권장합니다.

이 상수는 파일 내에서 전혀 사용되지 않으므로, pull-to-refresh 제거 시 함께 삭제하는 것이 좋습니다.

feature/feed/src/main/java/com/into/websoso/feature/feed/model/MyFeedFilter.kt (1)

5-6: isUnVisible 네이밍이 일관적이지 않습니다.

isVisible과 쌍을 이루는 속성으로 isUnVisible 대신 isInvisible 또는 isHidden이 더 자연스러운 네이밍입니다. "UnVisible"은 표준 영어 단어가 아닙니다.

💡 네이밍 개선 제안
 data class MyFeedFilter(
     val selectedGenres: Set<NovelCategory> = emptySet(),
     val isVisible: Boolean? = null,
-    val isUnVisible: Boolean? = null,
+    val isInvisible: Boolean? = null,
 )

Comment on lines +11 to +19
<ImageView
android:id="@+id/iv_editing_cancel_feed"
android:layout_width="46dp"
android:layout_height="46dp"
android:layout_marginHorizontal="102dp"
android:src="@drawable/ic_novel_detail_warning"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

경고 아이콘 접근성 설정이 필요합니다.
장식용 이미지라면 스크린리더 노출을 막고, 의미가 있다면 설명을 추가하세요.

✅ 제안 수정
 <ImageView
     android:id="@+id/iv_editing_cancel_feed"
+    android:contentDescription="@null"
+    android:importantForAccessibility="no"
     android:layout_width="46dp"
     android:layout_height="46dp"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<ImageView
android:id="@+id/iv_editing_cancel_feed"
android:layout_width="46dp"
android:layout_height="46dp"
android:layout_marginHorizontal="102dp"
android:src="@drawable/ic_novel_detail_warning"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/iv_editing_cancel_feed"
android:contentDescription="@null"
android:importantForAccessibility="no"
android:layout_width="46dp"
android:layout_height="46dp"
android:layout_marginHorizontal="102dp"
android:src="@drawable/ic_novel_detail_warning"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
🤖 Prompt for AI Agents
In `@app/src/main/res/layout/dialog_editing_cancel_feed.xml` around lines 11 - 19,
The ImageView with id iv_editing_cancel_feed is missing accessibility info;
decide if it's decorative or meaningful: if decorative, add
android:contentDescription="@null" and android:importantForAccessibility="no" on
iv_editing_cancel_feed to hide it from screen readers; if it conveys meaning,
add a descriptive contentDescription referencing a string resource (e.g.,
`@string/`...), and ensure it is not set focusable or clickable for unintended
traversal.

@m6z1
Copy link
Member Author

m6z1 commented Jan 31, 2026

@coderabbitai full review

@coderabbitai
Copy link

coderabbitai bot commented Jan 31, 2026

✅ Actions performed

Full review triggered.

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: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
core/network/src/main/java/com/into/websoso/core/network/datasource/user/UserApi.kt (1)

18-26: ⚠️ Potential issue | 🟡 Minor

쿼리 파라미터 키와 변수명 불일치를 변수명 변경으로 개선하세요.

Line 22의 @Query("genreNames") 어노테이션과 genres 변수명이 일치하지 않습니다. Retrofit이 올바르게 "genreNames"를 백엔드에 전송하므로 기능상 문제는 없지만, 가독성과 유지보수성을 위해 변수명을 genreNames로 변경하는 것을 권장합니다. 이렇게 하면 쿼리 파라미터와 변수명이 일치하여 코드의 의도가 더 명확해집니다.

🤖 Fix all issues with AI agents
In
`@data/feed/src/main/java/com/into/websoso/data/feed/repository/FeedRepository.kt`:
- Line 13: Remove the lingering TODO comment in FeedRepository.kt ("// TODO: 이
부분 확인 후 수정 후 주석 모두 제거"): inspect the surrounding code in the FeedRepository
class or relevant methods, implement the intended fix or confirmation (or
create/attach a tracking ticket if work remains), run tests/validation, then
delete the TODO line; if the change is non-trivial, replace the TODO with a
clear actionable comment referencing the ticket ID and owner instead of leaving
a generic TODO.
- Around line 22-23: The two mutable lists _cachedFeeds and
_cachedRecommendedFeeds are not thread-safe in the `@Singleton` FeedRepository;
add a Mutex (e.g., cacheMutex = Mutex()) and wrap every read/write access to
_cachedFeeds and _cachedRecommendedFeeds with cacheMutex.withLock to serialize
concurrent coroutine access, or alternatively convert them into
MutableStateFlow<List<FeedEntity>> and update via immutable copies to ensure
atomic updates; ensure all repository methods that currently touch
_cachedFeeds/_cachedRecommendedFeeds (reads, adds, removes, clears) are updated
to use the chosen synchronization approach so no unsynchronized access remains.
- Around line 89-91: The onFailure block inside FeedRepository.saveRemovedFeed
currently swallows exceptions and logs with Log.d; change it to propagate the
error (either rethrow the exception or change saveRemovedFeed to return a
Result/Outcome type) so callers (ViewModel) can handle deletion failures, and
replace Log.d with Log.e (or include throwable) for proper error logging; update
callers to handle the returned Result or catch the rethrown exception.

In
`@feature/feed/src/main/java/com/into/websoso/feature/feed/component/FeedSection.kt`:
- Around line 188-195: Remove the temporary TODO comments around the
onFirstItemClick and onSecondItemClick invocations in FeedSection.kt; ensure the
calls pass feed.id and feed.isMyFeed as currently implemented
(onFirstItemClick(feed.id, feed.isMyFeed) and onSecondItemClick(feed.id,
feed.isMyFeed)), delete both TODO lines and any related explanatory comments
left for reviewers, and keep only the necessary code invoking these handlers.

In `@feature/feed/src/main/java/com/into/websoso/feature/feed/FeedViewModel.kt`:
- Around line 241-259: The issue is that FeedRepository.saveRemovedFeed swallows
API errors so FeedViewModel's runCatching always treats the call as success and
removes the UI item; fix by making the failure propagate and updating the
ViewModel to only mutate _uiState on real success: either change
FeedRepository.saveRemovedFeed to rethrow the exception (or return a
Result/boolean indicating success) instead of just logging, and in FeedViewModel
(inside viewModelScope.launch where runCatching calls saveRemovedFeed) rely on
the thrown exception or the returned Result to enter onFailure before calling
_uiState.update; ensure the symbols involved are FeedRepository.saveRemovedFeed,
FeedViewModel.runCatching (the lambda in viewModelScope.launch), and
_uiState.update so the UI removal happens exclusively in the confirmed-success
path.
🧹 Nitpick comments (1)
feature/feed/src/main/java/com/into/websoso/feature/feed/FeedViewModel.kt (1)

79-86: 빠른 연속 호출 시 중복 데이터 가능성이 있습니다.

loading 가드와 _uiState.update { it.copy(loading = true) } 사이에 경합 조건이 존재합니다. 두 번의 빠른 fetchNextPage() 호출이 둘 다 가드를 통과할 수 있습니다.

♻️ 원자적 가드 패턴 적용
         fun fetchNextPage(feedId: Long? = null) {
-            val state = uiState.value
-            val current = state.currentData
-            val lastFeedId = feedId ?: current.lastId
-
-            if (state.loading || !current.isLoadable) return
-
-            _uiState.update { it.copy(loading = true) }
+            val snapshot = _uiState.updateAndGet { state ->
+                if (state.loading || !state.currentData.isLoadable) return
+                state.copy(loading = true)
+            }
+            val lastFeedId = feedId ?: snapshot.currentData.lastId

또는 별도의 AtomicBoolean 플래그를 사용하여 동기화할 수 있습니다.

Comment on lines 22 to 23
private val _cachedFeeds = mutableListOf<FeedEntity>()
private val _cachedRecommendedFeeds = mutableListOf<FeedEntity>()
Copy link

@coderabbitai coderabbitai bot Jan 31, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

@singleton에서 mutableListOf 사용은 스레드 안전하지 않습니다.

여러 코루틴이 동시에 _cachedFeeds_cachedRecommendedFeeds에 접근할 수 있습니다. mutableListOf는 스레드 안전하지 않아 동시 수정 시 데이터 불일치나 ConcurrentModificationException이 발생할 수 있습니다.

🔒 스레드 안전한 구조로 변경
-        private val _cachedFeeds = mutableListOf<FeedEntity>()
-        private val _cachedRecommendedFeeds = mutableListOf<FeedEntity>()
+        private val _cachedFeeds = Collections.synchronizedList(mutableListOf<FeedEntity>())
+        private val _cachedRecommendedFeeds = Collections.synchronizedList(mutableListOf<FeedEntity>())

또는 Mutex를 사용한 동기화나 StateFlow/MutableSharedFlow 기반 구조를 고려해주세요.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
private val _cachedFeeds = mutableListOf<FeedEntity>()
private val _cachedRecommendedFeeds = mutableListOf<FeedEntity>()
private val _cachedFeeds = Collections.synchronizedList(mutableListOf<FeedEntity>())
private val _cachedRecommendedFeeds = Collections.synchronizedList(mutableListOf<FeedEntity>())
🤖 Prompt for AI Agents
In
`@data/feed/src/main/java/com/into/websoso/data/feed/repository/FeedRepository.kt`
around lines 22 - 23, The two mutable lists _cachedFeeds and
_cachedRecommendedFeeds are not thread-safe in the `@Singleton` FeedRepository;
add a Mutex (e.g., cacheMutex = Mutex()) and wrap every read/write access to
_cachedFeeds and _cachedRecommendedFeeds with cacheMutex.withLock to serialize
concurrent coroutine access, or alternatively convert them into
MutableStateFlow<List<FeedEntity>> and update via immutable copies to ensure
atomic updates; ensure all repository methods that currently touch
_cachedFeeds/_cachedRecommendedFeeds (reads, adds, removes, clears) are updated
to use the chosen synchronization approach so no unsynchronized access remains.

Copy link
Member Author

Choose a reason for hiding this comment

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

@s9hn 참고하면 좋을 듯용

Copy link

Choose a reason for hiding this comment

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

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

Comment on lines +89 to 91
}.onFailure {
Log.d("FeedRepository", "saveRemovedFeed 함수 failed : ${it.message}")
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

삭제 실패 시 에러가 전파되지 않습니다.

onFailure에서 로그만 남기고 예외를 무시하면, 호출자(ViewModel)는 삭제 실패 여부를 알 수 없습니다. UI에서는 피드가 삭제된 것처럼 보이지만 실제로는 삭제되지 않은 상태가 될 수 있습니다.

또한 Log.d는 에러 로깅에 적합하지 않습니다.

🐛 에러 전파 및 로그 레벨 수정
             }.onFailure {
-                Log.d("FeedRepository", "saveRemovedFeed 함수 failed : ${it.message}")
+                Log.e("FeedRepository", "saveRemovedFeed 함수 failed : ${it.message}", it)
+                throw it
             }

또는 Result 타입을 반환하여 호출자가 에러를 처리할 수 있도록 해주세요.

🤖 Prompt for AI Agents
In
`@data/feed/src/main/java/com/into/websoso/data/feed/repository/FeedRepository.kt`
around lines 89 - 91, The onFailure block inside FeedRepository.saveRemovedFeed
currently swallows exceptions and logs with Log.d; change it to propagate the
error (either rethrow the exception or change saveRemovedFeed to return a
Result/Outcome type) so callers (ViewModel) can handle deletion failures, and
replace Log.d with Log.e (or include throwable) for proper error logging; update
callers to handle the returned Result or catch the rethrown exception.

@m6z1 m6z1 added the 🏹 궁사 명지 웹소소 공주의 은밀한 사냥생활 label Feb 1, 2026
@m6z1 m6z1 added the 🔨 [FIX] 버그를 수정합니다. label Feb 1, 2026
Copy link
Member

@s9hn s9hn left a comment

Choose a reason for hiding this comment

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

고생하셨습니다!

@s9hn s9hn merged commit 4230792 into release/1.6.0 Feb 1, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🏹 궁사 명지 웹소소 공주의 은밀한 사냥생활 🔨 [FIX] 버그를 수정합니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix: 마이페이지 및 피드소소 QA 반영

3 participants