어떤 기능인가요?
운동 기록 화면(캘린더·목록·상세)이 서버 응답을 직접 보지 않고 Room을 거치게 바꿉니다. 온라인과 오프라인의 화면 경로가 같아져 화면 코드에 오프라인 분기가 생기지 않습니다.
읽기 방식은 스냅샷 1회 읽기입니다 (설계 문서 3) 읽기 갱신 방식, 설계 규칙 2·3).
- 온라인: 진입 → 서버 조회를 기다림 → 응답을 Room에 저장 → Room에서 1회 읽기 → 표시
- 오프라인이거나 조회 실패: 진입 → Room에서 1회 읽기 → 표시
- 서버 응답이 화면으로 직접 가지 않고 항상 Room을 거칩니다
- 한 번 그린 화면이 저절로 바뀌지 않습니다. 화면은 지속
Flow를 구독하지 않습니다
서버 조회 트리거는 둘뿐입니다. 화면 최초 진입(ViewModel이 처음 만들어질 때)과 수동 새로고침입니다. 회전, 백스택 복귀, 앱 포그라운드 복귀, 온라인 전환은 조회 트리거가 아닙니다. 다만 복귀할 때 Room 값은 다시 읽어 그립니다(내 쓰기 반영).
오프라인 캐시 플래그(Remote Config, #582)가 꺼져 있으면 기존 네트워크 경로 그대로 동작합니다.
오프라인 진입 시 시작 화면이 운동 기록 탭이므로(#557, PR #564) 이 이슈가 끝나면 그 화면에 캐시가 채워집니다.
작업 상세 내용
화면 표기 규칙
- 온라인인데 서버 갱신 실패: "최신 정보를 가져오지 못했습니다"를 한 번 띄우고 화면은 로컬 값 유지
- 오프라인: 갱신 실패를 따로 표기하지 않음
- 캐시가 없고 오프라인: 기존 네트워크 오류 문구
#583에서 넘어온 것
CREATE_PENDING 기록이 지금은 목록에 보이지 않습니다. ExerciseListItemEntity.toModel()이 serverId가 없으면 null을 돌려주고 getListByDate가 걸러냅니다. 화면이 서버 ID(Long)로 기록을 식별하는 동안은 서버 ID 없는 기록을 표시할 방법이 없기 때문입니다.
문서 UI 규칙은 "로컬에만 있는 기록은 목록·캘린더에 즉시 보이고 동기화 대기를 표시합니다"이므로, 이 이슈에서 기록 식별을 로컬 ID로 바꿀 때 필터를 걷어내고 표시까지 처리합니다. 관련 위치에 주석으로 표시해 뒀습니다.
ExerciseRecordLocalDataSource.getListByDate의 mapNotNull
ExerciseCacheMapper.toModel()의 nullable 반환
ExerciseRecordDao.getDetailByServerId (로컬 ID 진입으로 바뀌면 삭제)
참고할만한 자료(선택)
오프라인 1단계 디자인 문서의 읽기 갱신 방식(후보 2 채택)과 설계 규칙 2·3 기준입니다. #583과 #582가 선행입니다. #557(PR #564) 후속.
어떤 기능인가요?
운동 기록 화면(캘린더·목록·상세)이 서버 응답을 직접 보지 않고 Room을 거치게 바꿉니다. 온라인과 오프라인의 화면 경로가 같아져 화면 코드에 오프라인 분기가 생기지 않습니다.
읽기 방식은 스냅샷 1회 읽기입니다 (설계 문서 3) 읽기 갱신 방식, 설계 규칙 2·3).
Flow를 구독하지 않습니다서버 조회 트리거는 둘뿐입니다. 화면 최초 진입(ViewModel이 처음 만들어질 때)과 수동 새로고침입니다. 회전, 백스택 복귀, 앱 포그라운드 복귀, 온라인 전환은 조회 트리거가 아닙니다. 다만 복귀할 때 Room 값은 다시 읽어 그립니다(내 쓰기 반영).
오프라인 캐시 플래그(Remote Config, #582)가 꺼져 있으면 기존 네트워크 경로 그대로 동작합니다.
오프라인 진입 시 시작 화면이 운동 기록 탭이므로(#557, PR #564) 이 이슈가 끝나면 그 화면에 캐시가 채워집니다.
작업 상세 내용
Flow구독을 두지 않음exercise_nav_graph.xml의recordId: long7곳과 관련 ViewModelCREATE_PENDING기록을 목록·캘린더에 표시하고 "동기화 대기"를 붙임 (아래 참고)화면 표기 규칙
#583에서 넘어온 것
CREATE_PENDING기록이 지금은 목록에 보이지 않습니다.ExerciseListItemEntity.toModel()이serverId가 없으면 null을 돌려주고getListByDate가 걸러냅니다. 화면이 서버 ID(Long)로 기록을 식별하는 동안은 서버 ID 없는 기록을 표시할 방법이 없기 때문입니다.문서 UI 규칙은 "로컬에만 있는 기록은 목록·캘린더에 즉시 보이고 동기화 대기를 표시합니다"이므로, 이 이슈에서 기록 식별을 로컬 ID로 바꿀 때 필터를 걷어내고 표시까지 처리합니다. 관련 위치에 주석으로 표시해 뒀습니다.
ExerciseRecordLocalDataSource.getListByDate의mapNotNullExerciseCacheMapper.toModel()의 nullable 반환ExerciseRecordDao.getDetailByServerId(로컬 ID 진입으로 바뀌면 삭제)참고할만한 자료(선택)
오프라인 1단계 디자인 문서의 읽기 갱신 방식(후보 2 채택)과 설계 규칙 2·3 기준입니다. #583과 #582가 선행입니다. #557(PR #564) 후속.