Skip to content

[Refactor] 운동 기록 읽기를 Room 경유로 전환 #584

Description

@edv-Shin

어떤 기능인가요?

운동 기록 화면(캘린더·목록·상세)이 서버 응답을 직접 보지 않고 Room을 거치게 바꿉니다. 온라인과 오프라인의 화면 경로가 같아져 화면 코드에 오프라인 분기가 생기지 않습니다.

읽기 방식은 스냅샷 1회 읽기입니다 (설계 문서 3) 읽기 갱신 방식, 설계 규칙 2·3).

  • 온라인: 진입 → 서버 조회를 기다림 → 응답을 Room에 저장 → Room에서 1회 읽기 → 표시
  • 오프라인이거나 조회 실패: 진입 → Room에서 1회 읽기 → 표시
  • 서버 응답이 화면으로 직접 가지 않고 항상 Room을 거칩니다
  • 한 번 그린 화면이 저절로 바뀌지 않습니다. 화면은 지속 Flow를 구독하지 않습니다

서버 조회 트리거는 둘뿐입니다. 화면 최초 진입(ViewModel이 처음 만들어질 때)과 수동 새로고침입니다. 회전, 백스택 복귀, 앱 포그라운드 복귀, 온라인 전환은 조회 트리거가 아닙니다. 다만 복귀할 때 Room 값은 다시 읽어 그립니다(내 쓰기 반영).

오프라인 캐시 플래그(Remote Config, #582)가 꺼져 있으면 기존 네트워크 경로 그대로 동작합니다.

오프라인 진입 시 시작 화면이 운동 기록 탭이므로(#557, PR #564) 이 이슈가 끝나면 그 화면에 캐시가 채워집니다.

작업 상세 내용

  • Repository 읽기 메서드가 Room을 거치도록 변경. 서버 조회는 Room 갱신만 담당
  • 캘린더·목록·상세 ViewModel을 스냅샷 1회 읽기로 전환. Flow 구독을 두지 않음
  • 서버 조회 트리거를 최초 진입과 수동 새로고침으로 제한. 회전·백스택 복귀·온라인 전환에서 조회하지 않음
  • 기록 식별을 서버 ID에서 로컬 ID로 전환. exercise_nav_graph.xmlrecordId: long 7곳과 관련 ViewModel
  • CREATE_PENDING 기록을 목록·캘린더에 표시하고 "동기화 대기"를 붙임 (아래 참고)
  • 플래그가 꺼져 있으면 기존 경로 유지
  • 화면 표기 규칙 세 가지 반영
  • Repository 테스트 (네트워크 오류면 로컬 값만, 그 밖의 오류는 오류로 전달)
  • 같은 화면에 두 번 들어가도 다시 그려지지 않고 스크롤 위치가 유지되는지 수동 확인
  • 온라인에서 조회 후 비행기 모드로 재진입 시 캐시가 보이는지 수동 확인

화면 표기 규칙

  • 온라인인데 서버 갱신 실패: "최신 정보를 가져오지 못했습니다"를 한 번 띄우고 화면은 로컬 값 유지
  • 오프라인: 갱신 실패를 따로 표기하지 않음
  • 캐시가 없고 오프라인: 기존 네트워크 오류 문구

#583에서 넘어온 것

CREATE_PENDING 기록이 지금은 목록에 보이지 않습니다. ExerciseListItemEntity.toModel()serverId가 없으면 null을 돌려주고 getListByDate가 걸러냅니다. 화면이 서버 ID(Long)로 기록을 식별하는 동안은 서버 ID 없는 기록을 표시할 방법이 없기 때문입니다.

문서 UI 규칙은 "로컬에만 있는 기록은 목록·캘린더에 즉시 보이고 동기화 대기를 표시합니다"이므로, 이 이슈에서 기록 식별을 로컬 ID로 바꿀 때 필터를 걷어내고 표시까지 처리합니다. 관련 위치에 주석으로 표시해 뒀습니다.

  • ExerciseRecordLocalDataSource.getListByDatemapNotNull
  • ExerciseCacheMapper.toModel()의 nullable 반환
  • ExerciseRecordDao.getDetailByServerId (로컬 ID 진입으로 바뀌면 삭제)

참고할만한 자료(선택)

오프라인 1단계 디자인 문서의 읽기 갱신 방식(후보 2 채택)과 설계 규칙 2·3 기준입니다. #583과 #582가 선행입니다. #557(PR #564) 후속.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    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