[Fix] 계정 전환 시 이전 계정의 로컬 캐시 삭제 #593 - #594
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
#️⃣연관된 이슈
Closes #593
📝작업 내용
로그아웃을 거치지 않은 계정 전환에서 이전 계정의 캐시가 기기에 남는 문제를 고쳤습니다. 설계 문서의 목표 6과 설계 규칙 D9, 위험 요소 1이 근거입니다.
ClearSessionUseCaseclearAllTables()라 순서가 드러나지 않지만, 계정 스코프 삭제(DELETE WHERE memberId = ?)로 좁히는 순간 회원ID가 없어 지울 대상을 특정할 수 없습니다. 타이머와 운동 기록 쓰기가 들어오면 좁혀야 하는 쿼리입니다try/finally로 감쌌습니다. 캐시 삭제가 실패해도 워커 취소와 세션 정리는 실행됩니다. 호출부 두 곳(SettingFragment.performLogout,MainViewModel.transitionToLogin)이runCatching으로 감싸 예외를 삼키기 때문에, 순서만 바꾸고 예외를 방치하면 로그아웃을 눌렀는데 세션이 남아 다음 진입에서 자동 로그인되는 상태가 생깁니다AuthRepositoryImpl.checkIsRegistered()mapper밖으로 옮겼습니다.apiCallBuilder의mapper가 suspend가 아니라 그 안에서는 캐시 삭제를 호출할 수 없습니다.mapper는 가입 확인된 경우의memberId만 반환하고, 저장과 정리는replaceMemberId()가ioDispatcher위에서 처리합니다replaceMemberId()는 이전 회원ID와 다르면 캐시를 지운 뒤 저장합니다. 같은 계정 재로그인은 캐시를 유지합니다. 앱 진입마다 호출되지만 값이 같으면 아무 일도 하지 않습니다previous != memberId하나로 뒀습니다. 이전 값이null인 경우도 포함되는데, 로그아웃 도중 캐시 삭제만 실패해 행이 남은 상태를 흡수하려는 것입니다errorCode분기는 그대로입니다.AUTHENTICATION_FAILED는Unregistered, 나머지는Indeterminate입니다. 이 계약의 테스트는 #590에서 다룹니다테스트
ClearSessionUseCaseTest에 두 개 추가.coVerifyOrder로 캐시 삭제가 세션 정리보다 먼저인지, 캐시 삭제가 실패해도 예약 취소와 세션 정리가 실행되는지 검증합니다AuthRepositoryImplTest신설. 다른 계정이면 삭제, 같은 계정이면 유지, 이전 값이 없으면 삭제, 미가입이면 저장도 삭제도 하지 않음 네 가지입니다이슈에 적힌 항목 중 다음은 이 PR 범위가 아닙니다.
TimerSyncWorker와ExerciseSyncWorker가 생길 때 같은 자리에 추가합니다검증은
ktlintCheck,:domain:test(ClearSessionUseCaseTest 5건),:data:testDebugUnitTest(AuthRepositoryImplTest 4건),:app:assembleDebug통과입니다. 계정 A에서 계정 B로 바꿔 넣는 수동 확인은 아직 하지 않았습니다.스크린샷 (선택)
UI 변경이 없습니다.
💬리뷰 요구사항(선택)
두 가지 판단을 봐주세요.
첫째, 계정 전환 감지를
AuthRepositoryImpl에 둔 위치입니다. 회원ID 저장이 이 함수 안에서 일어나고RegistrationStatus에memberId가 없어서, UseCase 계층으로 올리려면 반환 타입을 바꿔야 합니다. 그래서 Repository 안에 뒀습니다. 진입 시점에 저장된 회원ID와 토큰의 사용자 식별자를 비교하는 방식도 가능한데, 그건 매 진입에 검사가 붙습니다.둘째, 이전 회원ID가
null일 때도 캐시를 지우는 선택입니다. 로그아웃이 정상 완료됐다면 캐시가 이미 비어 있어 무해하지만, 로그아웃 후 같은 계정으로 다시 들어오는 흐름에서 캐시가 남아 있었다면 그것도 지웁니다. 안전을 택했는데 캐시 보존을 우선한다면 조건을previous != null && previous != memberId로 좁히면 됩니다.