[#621] 로그아웃, 회원탈퇴 이후 앱 배지가 그대로 남아있는 현상을 해결한다#646
Conversation
There was a problem hiding this comment.
Code Review
이번 풀 request는 로그아웃 또는 로그인 실패(didLogined(false)) 시 앱 배지 카운트를 초기화하는 clearApplicationBadgeCountEffect()를 추가하고 이에 대한 테스트 코드를 작성했습니다. 리뷰에서는 테스트 코드 실행 시 RootApplicationBadgeCountSpy에서 발생할 수 있는 데이터 레이스(Data Race) 문제를 지적하며 스레드 안전성 확보를 권장하였고, 로그아웃 시점에 화면에 열려있는 시트나 알림창 등의 UI 상태(state.sheet, state.alert)를 안전하게 초기화하도록 제안했습니다.
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.
| await waitUntil { | ||
| badgeSpy.counts == [0] | ||
| } | ||
|
|
||
| #expect(badgeSpy.counts == [0]) |
There was a problem hiding this comment.
현재 RootApplicationBadgeCountSpy는 @unchecked Sendable로 선언되어 있으나, 내부 counts 배열에 대한 동기화 처리가 없어 Data Race가 발생할 수 있습니다.
clearApplicationBadgeCountEffect()의 .run 블록은 협력 스레드 풀(Cooperative Thread Pool)에서 비동기적으로 실행되어 setBadgeCount를 호출하는 반면, 테스트 코드는 @MainActor에서 badgeSpy.counts를 읽기 때문에 동시 접근이 발생합니다.
이 문제를 해결하려면 RootFeatureTestSupport.swift 파일에 정의된 RootApplicationBadgeCountSpy를 @MainActor로 격리하거나, 내부적으로 NSLock 또는 OSAllocatedUnfairLock 등을 사용하여 스레드 안전성을 확보해야 합니다.
🔗 연관된 이슈
🔗 연관된 이슈
🎯 의도
📝 작업 내용
📌 요약
RootFeature의 auth session 관찰 결과가 로그아웃 상태로 전환될 때 앱 badge count를0으로 초기화하도록 처리didLogined(false)처리 시 badge 초기화를 요청하는 테스트 추가🔍 상세
clearApplicationBadgeCountEffect()를 재사용해 Root 진입 시점뿐 아니라 auth session이false로 바뀌는 시점에도 badge 초기화 수행didLogined(false)흐름으로 수렴하므로 동일 경로에서 badge 제거 처리RootFeature didLogined(false)는 앱 badge 초기화를 요청한다테스트로 badge count0요청 검증📸 영상 / 이미지 (Optional)