Skip to content

Conversation

@Nico1eKim
Copy link
Member

@Nico1eKim Nico1eKim commented Nov 12, 2025

Summary by CodeRabbit

주요 변경사항

  • 새로운 기능

    • 푸시 알림 시스템 추가 (FCM 기반 실시간 알림)
    • 독서모임 AI 도서 리뷰 기능
    • 알림 설정 관리 (활성화/비활성화)
    • 최근 모임 추천 섹션
    • 전체 모임 탐색 기능
    • 만료된 모임 상태 표시
    • 검색 시 카테고리 필터링 개선
  • 개선사항

    • 모임 상태 관리 개선 (진행 중/모집 중/종료)
    • 알림 처리 최적화
    • 사용자 경험 향상

Nico1eKim and others added 28 commits October 9, 2025 17:11
[FEAT] 미확인 알림 여부 확인 api 연결
@coderabbitai
Copy link

coderabbitai bot commented Nov 12, 2025

Caution

Review failed

The pull request is closed.

📋 코드 리뷰 요약

Walkthrough

파이어베이스 클라우드 메시징(FCM) 통합, 푸시 알림 시스템 구현, AI 도서 리뷰 기능, 그리고 만료된 방 관련 UI 상태 처리를 추가합니다. 새로운 알림 서비스 계층, 토큰 관리자, 그리고 여러 UI 및 네비게이션 업데이트를 도입합니다.

Changes

응집도 / 파일(들) 변경 요약
FCM 토큰 관리
app/build.gradle.kts, app/src/main/java/com/texthip/thip/data/manager/FcmTokenManager.kt, gradle/libs.versions.toml
Firebase Messaging 의존성 추가 및 FCM 토큰 생명주기 관리 기능 구현
알림 서비스 계층
app/src/main/java/com/texthip/thip/data/service/NotificationService.kt, app/src/main/java/com/texthip/thip/data/di/ServiceModule.kt, app/src/main/java/com/texthip/thip/data/repository/NotificationRepository.kt
NotificationService 인터페이스, 요청/응답 모델 및 Repository 구현 추가
알림 데이터 모델
app/src/main/java/com/texthip/thip/data/model/notification/request/*, app/src/main/java/com/texthip/thip/data/model/notification/response/*
FcmTokenRequest/DeleteRequest, NotificationCheck/Enable/List 요청/응답 모델 정의
FCM 메시징 서비스
app/src/main/java/com/texthip/thip/service/MyFirebaseMessagingService.kt, app/src/main/AndroidManifest.xml
Firebase 메시지 수신 처리, 토큰 갱신, 알림 표시 기능 및 매니페스트 설정
메인 액티비티 알림 처리
app/src/main/java/com/texthip/thip/MainActivity.kt, app/src/main/java/com/texthip/thip/MainScreen.kt
알림 의도 처리, NotificationData 상태 관리, 네비게이션 통합
알람 화면 리팩토링
app/src/main/java/com/texthip/thip/ui/common/alarmpage/screen/AlarmScreen.kt, app/src/main/java/com/texthip/thip/ui/common/alarmpage/viewmodel/AlarmViewModel.kt, app/src/main/java/com/texthip/thip/ui/common/alarmpage/viewmodel/AlarmUiState.kt
상태 기반 MVU 패턴 도입, 페이지네이션/당겨서새로고침 추가
AI 도서 리뷰 기능
app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteAiScreen.kt, app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupNoteAiViewModel.kt
AI 리뷰 생성 화면, 로딩/복사 기능, ViewModel 상태 관리
방 만료 상태 처리
app/src/main/java/com/texthip/thip/ui/group/done/*, app/src/main/java/com/texthip/thip/ui/group/room/screen/*, app/src/main/java/com/texthip/thip/ui/group/note/component/*
만료 방 처리, GroupDone 제거, isExpired 플래그 추가, 읽기 전용 UI 렌더링
RoomsService/Repository 확장
app/src/main/java/com/texthip/thip/data/service/RoomsService.kt, app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt, app/src/main/java/com/texthip/thip/data/model/rooms/response/*
getRoomsAiUsage/postRoomsAiReview 엔드포인트, isAllCategory 매개변수, 신규 응답 모델
피드 UI 컴포넌트
app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt, app/src/main/java/com/texthip/thip/ui/feed/screen/*
followerNum 매개변수 추가, 알림 상태 연동
방 검색 및 필터
app/src/main/java/com/texthip/thip/ui/group/search/screen/GroupSearchScreen.kt, app/src/main/java/com/texthip/thip/ui/group/search/viewmodel/GroupSearchViewModel.kt
isAllCategory 지원, 전체 보기 기능, 필터 로직 개선
그룹 화면 네비게이션
app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt, app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt, app/src/main/java/com/texthip/thip/ui/navigator/extensions/*
GroupRoutes 확장 (viewAll, isExpired, postId, NoteAi), 알림 네비게이션 확장 기능
로그인/인증 뷰모델
app/src/main/java/com/texthip/thip/ui/signin/viewmodel/*
FcmTokenManager 통합, 로그인 후 토큰 전송 로직
계정 관리 및 권한
app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/*, app/src/main/java/com/texthip/thip/utils/permission/NotificationPermissionUtils.kt, app/src/main/java/com/texthip/thip/utils/auth/DeviceUtils.kt
계정 삭제 시 FCM 토큰 정리, 알림 권한 요청 유틸리티, 기기 ID 관리
TokenManager 업데이트
app/src/main/java/com/texthip/thip/data/manager/TokenManager.kt
리프레시 토큰 기능 비활성화(주석 처리)
FeedRepository 최적화
app/src/main/java/com/texthip/thip/data/repository/FeedRepository.kt
동시 업로드 제한(MAX_CONCURRENT_UPLOADS=3), Semaphore 기반 순서 보존 병렬 업로드
사용자 리포지토리 에러 처리
app/src/main/java/com/texthip/thip/data/repository/UserRepository.kt
updateProfile 에러 처리 강화
리소스 및 문자열
app/src/main/res/values/strings.xml, app/src/main/res/drawable/*
AI 리뷰/알림/방 관련 문자열 추가, 버전 1.3.0 업데이트, 아이콘 리소스 추가/수정
앱 설정 및 매니페스트
.idea/appInsightsSettings.xml, app/src/main/AndroidManifest.xml, app/build.gradle.kts
Firebase 설정 업데이트, POST_NOTIFICATIONS/AD_ID 권한 추가, 버전/의존성 업데이트
기타 UI 컴포넌트
app/src/main/java/com/texthip/thip/ui/common/*, app/src/main/java/com/texthip/thip/ui/group/myroom/*
LogoTopAppBar leftIcon 선택사항화, SearchBookTextField backgroundColor, CardItemRoom isExpired, RoomType.ALL 개명

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant MainActivity
    participant FCMService as MyFirebaseMessagingService
    participant NotifRepo as NotificationRepository
    participant MainScreen
    participant NavController

    User->>FCMService: 알림 수신
    FCMService->>NotifRepo: onNotificationReceived()
    NotifRepo->>NotifRepo: _notificationRefreshFlow 발행
    FCMService->>MainActivity: 알림 표시 & Intent 전송
    MainActivity->>MainActivity: onNewIntent() 호출
    MainActivity->>MainActivity: handleNotificationIntent()
    MainActivity->>MainActivity: notificationData 업데이트
    MainScreen->>NotifRepo: checkNotification(id)
    NotifRepo->>NavController: navigateFromNotification()
    NavController->>User: 대상 화면으로 이동
Loading
sequenceDiagram
    participant App
    participant SplashViewModel
    participant FcmTokenManager
    participant NotificationRepository
    participant Server

    App->>SplashViewModel: 앱 시작
    SplashViewModel->>FcmTokenManager: sendFcmToken()
    FcmTokenManager->>FcmTokenManager: 저장된 토큰 확인
    alt 토큰 없음
        FcmTokenManager->>FcmTokenManager: Firebase에서 새 토큰 조회
    end
    FcmTokenManager->>NotificationRepository: registerFcmToken()
    NotificationRepository->>Server: FCM 토큰 등록 API
    Server-->>NotificationRepository: 성공
    FcmTokenManager->>FcmTokenManager: 로컬에 토큰 저장
    SplashViewModel->>App: Home 화면 네비게이션
Loading
sequenceDiagram
    participant User
    participant AlarmScreen
    participant AlarmViewModel
    participant NotificationRepository
    participant MainScreen

    User->>AlarmScreen: 알람 화면 진입
    AlarmScreen->>AlarmViewModel: loadNotifications(reset=true)
    AlarmViewModel->>NotificationRepository: getNotifications()
    NotificationRepository-->>AlarmViewModel: 알림 목록
    AlarmViewModel->>AlarmViewModel: uiState 업데이트
    AlarmScreen->>AlarmScreen: 알림 렌더링
    User->>AlarmScreen: 알림 클릭
    AlarmScreen->>AlarmViewModel: checkNotification(id, onNavigate)
    AlarmViewModel->>NotificationRepository: checkNotification()
    NotificationRepository-->>AlarmViewModel: NotificationCheckResponse
    AlarmViewModel->>MainScreen: onNavigate(response) 콜백
    MainScreen->>MainScreen: navigateFromNotification()
    rect rgb(200, 150, 255)
        MainScreen->>MainScreen: 경로에 따라 대상 화면으로 이동
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 분

검토 시 특별히 주의할 사항:

  • FCM 토큰 생명주기 관리: FcmTokenManager, MainActivity onNewIntent, 로그인/가입 흐름에서의 토큰 등록/갱신 로직 일관성 확인
  • 알림 네비게이션: NotificationCheckResponse의 route 매핑, navigateFromNotification 확장 기능의 정확성 (파라미터 파싱, 타입 변환)
  • 상태 관리 리팩토링: AlarmScreen/ViewModel의 페이지네이션, 당겨서새로고침, 로딩 상태 처리 로직
  • AI 리뷰 기능: GroupNoteAiViewModel의 에러 처리, JSON 파싱 로직, UI 상태 전이
  • 방 만료(isExpired) 플래그: 여러 화면(GroupRoom, GroupNote, GroupChat 등)에서 일관된 적용, 읽기 전용 UI 처리
  • ConcurrentUpload 제한: FeedRepository의 Semaphore 기반 병렬 업로드 순서 보존 로직
  • 데이터 모델 확장: RoomMainResponse.recentRoomList, JoinedRoomListResponse.deadlineDate 추가에 따른 기존 코드 호환성
  • 권한 및 매니페스트: POST_NOTIFICATIONS 권한 요청 시점, NotificationPermissionUtils 사용 일관성

Possibly related PRs

Suggested labels

🍀 refactor, 🧹 chore

Suggested reviewers

  • JJUYAAA
  • rbqks529

Poem

🐰 모닥불 앞에서 깡충깡충,
FCM 토큰을 춤 추며 전송하네,
알림이 폭폭 울려 퍼지고,
AI가 도서를 평가하며,
만료된 방은 조용하고,
우리 앱은 한 발 더 자라간다! ✨

✨ 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 develop

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Jira integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 108c660 and f491719.

📒 Files selected for processing (91)
  • .idea/appInsightsSettings.xml (2 hunks)
  • app/build.gradle.kts (3 hunks)
  • app/src/main/AndroidManifest.xml (3 hunks)
  • app/src/main/java/com/texthip/thip/MainActivity.kt (4 hunks)
  • app/src/main/java/com/texthip/thip/MainScreen.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ThipApplication.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/data/di/ServiceModule.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/data/manager/FcmTokenManager.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/manager/Genre.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/manager/TokenManager.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/data/model/notification/request/FcmTokenDeleteRequest.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/model/notification/request/FcmTokenRequest.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/model/notification/request/NotificationCheckRequest.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/model/notification/request/NotificationEnabledRequest.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/model/notification/response/NotificationCheckResponse.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/model/notification/response/NotificationEnabledResponse.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/model/notification/response/NotificationExistsUncheckedResponse.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/model/notification/response/NotificationListResponse.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/model/rooms/response/JoinedRoomListResponse.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomMainResponse.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsAiReviewResponse.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsAiUsageResponse.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/repository/BookRepository.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/data/repository/FeedRepository.kt (6 hunks)
  • app/src/main/java/com/texthip/thip/data/repository/NotificationRepository.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/repository/RecentSearchRepository.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt (7 hunks)
  • app/src/main/java/com/texthip/thip/data/repository/UserRepository.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/data/service/NotificationService.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/data/service/RoomsService.kt (5 hunks)
  • app/src/main/java/com/texthip/thip/service/MyFirebaseMessagingService.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/alarmpage/component/AlarmFilterRow.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/alarmpage/mock/NotificationType.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/alarmpage/screen/AlarmScreen.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/alarmpage/viewmodel/AlarmUiState.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/alarmpage/viewmodel/AlarmViewModel.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/forms/SearchBookTextField.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/feed/component/MySubscribelistBar.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/feed/screen/FeedMyScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/feed/screen/FeedOthersScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt (9 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/done/mock/MyRoomCardData.kt (0 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/done/screen/GroupDoneScreen.kt (0 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/done/viewmodel/GroupDoneUiState.kt (0 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/done/viewmodel/GroupDoneViewModel.kt (0 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupBookSearchBottomSheet.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMainCard.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMyRoomFilterRow.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/mock/RoomType.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt (4 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/viewmodel/GroupMyUiState.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/note/component/CommentBottomSheet.kt (6 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/note/component/CommentSection.kt (4 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteAiScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt (16 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupNoteAiViewModel.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupNoteViewModel.kt (9 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomChatScreen.kt (6 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomScreen.kt (5 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt (7 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/search/component/GroupFilteredSearchResult.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/search/component/GroupRecentSearch.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/search/screen/GroupSearchScreen.kt (6 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/search/viewmodel/GroupSearchViewModel.kt (7 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageLeavethipScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageNotificationEditScreen.kt (5 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/DeleteAccountViewModel.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/MypageNotificationEditViewModel.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt (4 hunks)
  • app/src/main/java/com/texthip/thip/ui/navigator/extensions/NotificationNavigationExtensions.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/navigator/navigations/CommonNavigation.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt (12 hunks)
  • app/src/main/java/com/texthip/thip/ui/navigator/navigations/MyPageNavigation.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/search/screen/SearchBookScreen.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/signin/screen/SignupGenreScreen.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/signin/viewmodel/LoginViewModel.kt (5 hunks)
  • app/src/main/java/com/texthip/thip/ui/signin/viewmodel/SignupViewModel.kt (4 hunks)
  • app/src/main/java/com/texthip/thip/ui/signin/viewmodel/SplashViewModel.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/utils/auth/DeviceUtils.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/utils/image/ImageUploadHelper.kt (6 hunks)
  • app/src/main/java/com/texthip/thip/utils/permission/NotificationPermissionUtils.kt (1 hunks)
  • app/src/main/res/drawable/ic_ai_book_review.xml (1 hunks)
  • app/src/main/res/drawable/ic_plusfriend.xml (1 hunks)
  • app/src/main/res/values/strings.xml (8 hunks)
  • gradle/libs.versions.toml (2 hunks)

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.

@Nico1eKim Nico1eKim merged commit 7dd5c03 into main Nov 12, 2025
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants