Skip to content

[#608] Mac에서 앱이 온그라운드 상태가 될 때 FCM 토큰이 과도하게 업데이트되는 현상을 해결한다#668

Merged
opficdev merged 4 commits into
developfrom
fix/#608-fcmtoken
Jul 2, 2026
Merged

[#608] Mac에서 앱이 온그라운드 상태가 될 때 FCM 토큰이 과도하게 업데이트되는 현상을 해결한다#668
opficdev merged 4 commits into
developfrom
fix/#608-fcmtoken

Conversation

@opficdev

@opficdev opficdev commented Jul 2, 2026

Copy link
Copy Markdown
Owner

🔗 연관된 이슈

🎯 의도

FCM token 동기화가 앱 온그라운드 전환마다 반복되면서 Firestore update 요청이 불필요하게 발생하던 문제 해결

📝 작업 내용

📌 요약

  • 온그라운드 전환 기반 FCM token sync 트리거 제거
  • 로컬 token hash 비교를 통한 중복 Firestore 저장 방지
  • 로그인/로그아웃 세션 전이에 따른 FCM token sync 및 로컬 hash 정리 처리

🔍 상세

  • UIScene.didActivateNotification에서 .didRequestFCMTokenSync를 발행하던 흐름 제거
  • uid, FirebaseConfiguration.databaseID, fcmToken 기반 hash를 UserDefaultsStore에 저장하도록 변경
  • 동일 사용자와 동일 FCM token이면 UserService.updateFCMToken 호출 생략
  • 같은 FCM token이어도 사용자 또는 Firestore database가 달라지면 다시 저장되도록 처리
  • 로그인 세션 진입 시 현재 FCM token sync 요청
  • 로그아웃 세션 진입 시 로컬 FCM token hash 제거
  • FCM token 중복 저장, 사용자 변경, 로그인/로그아웃 세션 전이 테스트 추가

📸 영상 / 이미지 (Optional)

없음

@opficdev opficdev self-assigned this Jul 2, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

이번 PR에서는 FCMTokenSyncHandler에 AuthService와 UserDefaultsStore를 도입하여 로그인 세션 상태를 감지하고, FCM 토큰 해시 비교를 통해 불필요한 중복 토큰 업데이트를 방지하도록 개선했습니다. 또한 AppDelegate에서 불필요한 Scene 활성화 옵저버를 제거하고 관련 테스트 코드를 추가했습니다. 리뷰어는 Swift 6 동시성 환경에서의 데이터 레이스 및 경쟁 조건(Race Condition)을 방지하기 위해 FCMTokenSyncHandler 클래스 전체를 @mainactor로 격리하고, 중복 동기화 요청을 방지하기 위해 inFlightHash 프로퍼티를 도입할 것을 권장했습니다. 또한 비동기 API 호출 중 발생하는 경쟁 조건을 막기 위해 syncFCMTokenIfNeeded 메서드에 진행 중인 해시 검사 로직을 추가하고, Combine 퍼블리셔에 .receive(on: DispatchQueue.main)을 추가하여 메인 스레드에서의 안전한 이벤트 수신을 보장하며 테스트 코드에도 @mainactor를 적용할 것을 제안했습니다.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread Application/App/Sources/App/Handler/FCMTokenSyncHandler.swift
Comment thread Application/App/Sources/App/Handler/FCMTokenSyncHandler.swift
Comment thread Application/App/Sources/App/Handler/FCMTokenSyncHandler.swift
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

❌ iOS CI failed.

Tests failed

Failed schemes:

  • Presentation (ios-test-Presentation)
✔ Test "loadNextPage는 다음 커서로 조회한 Todo를 기존 목록 뒤에 추가한다" passed after 3.176 seconds.
◇ Test "새 목록 조회는 이전 요청을 취소하고 마지막 응답만 반영한다" started.
✘ Test "새 목록 조회는 이전 요청을 취소하고 마지막 응답만 반영한다" recorded an issue at TodoListFeatureTests.swift:88:9: Expectation failed: (cancelledCalls → []) == [0]
± removed [0]
✘ Test "새 목록 조회는 이전 요청을 취소하고 마지막 응답만 반영한다" failed after 20.119 seconds with 1 issue.
◇ Test "필터와 정렬 액션은 query와 적용 필터 수를 갱신한다" started.
✔ Test "필터와 정렬 액션은 query와 적용 필터 수를 갱신한다" passed after 4.275 seconds.
◇ Test "setSearchText는 표시 범위를 초기화하고 디바운스 후 검색 결과를 반영한다" started.
✔ Test "setSearchText는 표시 범위를 초기화하고 디바운스 후 검색 결과를 반영한다" passed after 1.638 seconds.
◇ Test "setIsSearching false는 검색 상태와 검색 결과 표시 상태를 초기화한다" started.
✔ Test "setIsSearching false는 검색 상태와 검색 결과 표시 상태를 초기화한다" passed after 2.113 seconds.
◇ Test "fullScreenCover 상태를 설정하고 dismiss 할 수 있다" started.
✔ Test "fullScreenCover 상태를 설정하고 dismiss 할 수 있다" passed after 0.702 seconds.
◇ Test "Todo 조회 실패 시 공통 에러 알림 상태를 표시한다" started.
✔ Test "Todo 조회 실패 시 공통 에러 알림 상태를 표시한다" passed after 0.464 seconds.
✘ Suite TodoListFeatureTests failed after 46.650 seconds with 1 issue.
✘ Test run with 137 tests in 16 suites failed after 66.119 seconds with 1 issue.
Test session results, code coverage, and logs:
/Users/runner/Library/Developer/Xcode/DerivedData/DevLog-dtgllwgostbreabkgrzgvbsdezcv/Logs/Test/Test-Presentation-2026.07.02_00-30-54-+0000.xcresult
Testing started

Check the uploaded test log artifacts for full diagnostics.

@opficdev opficdev merged commit ed3f71a into develop Jul 2, 2026
6 checks passed
@opficdev opficdev deleted the fix/#608-fcmtoken branch July 2, 2026 01:13
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.

Mac에서 앱이 온그라운드 상태가 될 때 FCM 토큰이 과도하게 업데이트되는 현상을 해결한다

1 participant