Skip to content

[Refactor] 타이머 읽기와 쓰기를 Room 기준으로 전환 #587 - #601

Merged
edv-Shin merged 2 commits into
devfrom
refactor/timer-room-read-write-587
Sep 7, 2026
Merged

[Refactor] 타이머 읽기와 쓰기를 Room 기준으로 전환 #587#601
edv-Shin merged 2 commits into
devfrom
refactor/timer-room-read-write-587

Conversation

@edv-Shin

@edv-Shin edv-Shin commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

#️⃣연관된 이슈

Closes #587

📝작업 내용

타이머의 읽기와 쓰기를 Room 기준으로 옮겼습니다. 도메인 식별자를 서버 ID(Long)에서 localId(UUID)로 바꿨고, 화면은 진입 시 서버 목록을 반영한 뒤 로컬 스냅샷을 한 번 읽습니다. 쓰기는 로컬에 먼저 반영하고 재조회로 화면을 갱신합니다.

도메인

  • SimpleTimer, CustomTimerlocalId(필수)와 serverId(nullable)를 갖습니다. 오프라인에서 만든 행은 서버 ID를 받기 전입니다
  • Step에서 서버 스텝 id를 제거했습니다. 서버 수정이 전체 교체(PUT)라 스텝 ID가 왕복에서 유지된다는 보장이 없어 order로 식별합니다
  • GetLocalSimpleTimersUseCase, GetLocalCustomTimerListUseCase를 추가했습니다. 내 쓰기 직후에는 서버를 보지 않습니다
  • EditCustomTimerNameUseCase를 삭제했습니다. 로컬이 원본이면 이름만 바뀐 경우를 나눌 이유가 없고, 전송 방식은 워커가 정합니다

데이터

  • 읽기: 온라인 성공이면 서버 목록을 Room에 반영한 뒤 스냅샷을 읽고, NETWORK_ERROR면 로컬 스냅샷을 Success로 돌립니다. 그 밖의 오류는 그대로 전달합니다
  • 서버 목록 반영은 serverId로 항목별 매칭합니다. syncState != SYNCED 행은 대체하지 않고 기존 localId를 이어 씁니다
  • 회원ID가 없을 때는 생성 2개만 NO_MEMBER_ID를 냅니다. 수정과 삭제는 대상 행을 특정할 수 없어 조용히 no-op입니다

화면

  • nav 인자를 customTimerId(long)customTimerLocalId(string)으로 바꿨습니다. 생성 모드는 참조할 행이 없어 -1L 같은 sentinel 대신 nullable로 표현합니다
  • 조회 실패 토스트를 걷었습니다. 로컬 스냅샷이 이미 화면에 있어 알릴 것이 없습니다. 심플 타이머의 GET_ERRORTimerListViewModel.errorToast를 제거했습니다. 쓰기 실패 토스트는 남깁니다
  • 동기화 대기 배지를 넣지 않습니다. isSyncPending도 소비 지점이 없어 도메인 모델에서 제거했습니다. 동기화 상태를 화면에 드러낼 필요가 생기면 소비 지점과 함께 다시 넣습니다
  • 그리드에 스크롤을 넣었습니다. 워커([Feat] TimerSyncWorker 추가 #588)가 없는 동안 전송 대기 행과 서버 목록이 함께 있어 개수 상한을 넘는 창이 있습니다. 스크롤이 없으면 초과분이 화면 밖으로 나가 정렬 버튼과 겹칩니다

이 PR은 #586 위에 쌓았다가 base를 dev로 옮겼습니다.

💬리뷰 요구사항(선택)

커스텀 타이머 목록을 읽을 때 항목마다 상세 GET을 부릅니다. 목록 GET이 스텝을 주지 않고 오프라인 실행에는 스텝이 필요해서인데, 지금 개수에서는 감수할 만하다고 봤습니다. 서버에 편집 시각이 붙는 api-server #574 이후 변경분만 받는 식으로 줄일 수 있습니다. 이 판단이 갈릴 것 같아 봐주시면 좋겠습니다.

타이머는 offline_cache_enabled 플래그 대상이 아닙니다. 로컬이 원본이라 플래그를 끄면 전송 대기 행이 화면에서 사라집니다.

심플 타이머 개수 상한(최대 6)은 이 PR에서 그대로 뒀습니다. 서버 정책이 살아 있어 앱이 먼저 풀면 워커가 초과 생성을 올릴 때 거부됩니다. 상한과 하한 제거는 서버 배포와 함께 별도 이슈로 진행합니다.

✅검증

ktlintCheck, :domain:test, :data:testDebugUnitTest, :feature:timer:testDebugUnitTest, :app:assembleDebug 로컬 통과. base가 dev이므로 dev-ci도 함께 돕니다.

@edv-Shin edv-Shin self-assigned this Sep 6, 2026
@edv-Shin
edv-Shin changed the base branch from feat/timer-local-source-586 to dev September 6, 2026 17:55
@edv-Shin edv-Shin closed this Sep 6, 2026
@edv-Shin edv-Shin reopened this Sep 6, 2026
@edv-Shin
edv-Shin merged commit cbfe28a into dev Sep 7, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Refactor] 타이머 읽기와 쓰기를 Room 기준으로 전환

1 participant