Skip to content

[Fix] 계정 전환 시 이전 계정의 로컬 캐시가 남는 문제 #593

Description

@edv-Shin

어떤 기능인가요?

계정이 바뀔 때 이전 계정의 로컬 캐시가 기기에 남습니다. 오프라인 설계 문서의 목표 6은 "로그아웃하거나 다른 계정으로 로그인하면 기기에 남은 데이터가 모두 지워집니다"인데, 지금은 로그아웃 경로만 캐시를 지우고 계정 전환 경로에는 정리가 없습니다.

정리 경로는 ClearSessionUseCase 하나이고 호출부는 두 곳입니다. SettingFragment.performLogoutclearLocalSession()MainViewModel.transitionToLogin()입니다. 로그아웃을 거치지 않고 다른 계정으로 로그인하면 AuthRepositoryImpl.checkIsRegistered()saveMemberId()로 회원ID만 덮어씁니다. 조회 쿼리에 memberId 조건이 걸려 있어 이전 계정의 행이 화면에 보이지는 않지만, 기기에는 계속 남습니다.

삭제 순서도 지금 뒤집혀 있습니다. ClearSessionUseCaseauthRepository.clearSession()으로 회원ID를 먼저 지우고 그다음 sessionDataCleaner.clearAll()을 부릅니다. 현재 구현이 clearAllTables()라 회원ID가 필요 없어 문제가 드러나지 않지만, 계정 스코프 삭제(DELETE WHERE memberId = ?)로 좁히는 순간 아무것도 지우지 못합니다. 타이머와 운동 기록 쓰기가 들어오면 전송 대기 행이 계정별로 남으므로 그때 반드시 좁혀야 하는 쿼리입니다.

이 이슈는 정리 시점과 순서까지입니다. 앱 전용 이미지 파일 정리는 파일 보관을 도입하는 이슈에서 같은 경로에 붙입니다. checkIsRegistered의 errorCode 분기 계약 테스트는 #590에서 다룹니다.

작업 상세 내용

  • ClearSessionUseCase에서 로컬 캐시 삭제를 회원ID 소거보다 먼저 실행
  • 캐시 삭제가 실패해도 세션 정리와 워커 취소는 반드시 수행
  • 계정 전환 감지 후 정리. checkIsRegistered()가 회원ID를 저장할 때 이전 값과 다르면 캐시를 먼저 지움
  • 이전 회원ID가 없는 경우도 정리 대상에 포함. 로그아웃이 중간에 실패해 캐시만 남은 상태를 흡수
  • 같은 계정으로 다시 로그인하면 캐시를 유지
  • 호출 순서 검증 테스트 추가
  • 계정 전환 정리 테스트 추가 (다른 계정이면 삭제, 같은 계정이면 유지, 이전 값이 없으면 삭제)
  • 계정 A로 기록 조회 후 로그아웃 없이 계정 B 로그인 시 A의 캐시가 남지 않는지 수동 확인
  • 새 예약 작업을 추가할 때 이 경로에 취소를 연결하는 규칙을 문서에 남길지 PR에서 선택

참고할만한 자료(선택)

오프라인 기능 지원 설계 문서의 목표 6, 설계 규칙 D9(로그아웃·탈퇴 시 전부 지움), 위험 요소 1(계정 전환 시 이전 사용자 데이터 노출)이 기준입니다. #581에서 SessionDataCleaner를 도입했고 그 KDoc이 계정 전환을 대상으로 적었지만 호출부가 없습니다.

회원 탈퇴는 현재 외부 구글 폼을 웹뷰로 여는 경로여서 로컬 정리 시점이 없습니다. 별도 논의가 필요합니다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions