Skip to content

fix: 서버의 "등록된 알람 없음"(URT_001)을 실패가 아닌 정상 상태로 - #375

Merged
YuGeonHui merged 1 commit into
env/devfrom
fix/v2-urt001-not-registered
Sep 24, 2026
Merged

YuGeonHui merged 1 commit into
env/devfrom
fix/v2-urt001-not-registered

Conversation

@YuGeonHui

Copy link
Copy Markdown
Collaborator

문제

refresh()가 돌려줄 수 있는 답은 셋인데 둘로 뭉개져 있었다.

답 의미 예전 처리 올바른 처리
서버에 세션이 있다 — AlarmInfo 병합·재스케줄
서버가 "없다"고 답했다 404 URT_001 throw ← 문제 로컬 기록까지 정리
못 물어봤다 실패·오프라인 throw 세션을 지킨다

가운데가 오른쪽과 같은 취급을 받으면서 두 가지가 생겼다.

  1. 평상시(알람 미등록) 매 실행마다 알람 동기화 실패(상태 유지) 에러 로그
  2. 더 나쁜 것 — 서버에서 세션이 사라져도 앱이 낡은 세션을 계속 붙들었다. 다른 기기에서 해제했거나 서버가 정리한 경우, 사용자는 울리지 않을 알람을 믿고 잔다.

서버 실측 (2026-09-25)

GET /api/routes/user-routes/refresh
404 {"responseCode":"URT_001",
     "message":"id(1010) 유저가 등록한 경로를 찾을 수 없습니다."}

CLAUDE.md와 코드에 TODO: [미확정] 서버의 "등록된 알람 없음" 표현이 확정되면…으로 남아 있던 항목의 답이다.

변경

Domain에 AlarmRefreshOutcome { registered / notRegistered }를 두고 refresh()의 반환을 바꿨다. AlarmRepositoryImpl은 URT_001만 .notRegistered로 매핑하고 나머지 코드는 그대로 throw한다.

AlarmSessionReconciler가 이제 셋을 구분한다 — server: nil이 "못 물어봤다", .notRegistered가 "없다고 답했다"다.

테스트 +9

  • Repository 매핑 3 — URT_001 / 성공 / 다른 코드는 여전히 throw
  • Reconciler 표 4 — 같은 세션에 .notRegistered와 nil을 각각 넣어 결과가 갈리는 것을 나란히 고정
  • UseCase 통과 1 — .notRegistered면 스케줄러를 건드리지 않는다
  • SyncService 통합 2 — .notRegistered는 로컬 정리 / 실패는 세션 유지

검증

항목 결과
AtchaV2 Debug / Stage / Release 3구성 통과
Domain 117 · AtchaData 67 · AtchaV2 41 전부 통과 (+9)
CoreStorage 44 · DesignSystem 73 · Home 80 · Search 26 · Settings 18 전부 통과
시뮬레이터 신규 설치 실행 알람 동기화 실패 로그 0건 (이전 매 실행 1건)

참고: 네트워크 계층 진단 로그(GET …/refresh → unacceptableStatus(404))는 그대로 남는다. 서버가 실제로 404를 주는 것이 맞고, 그 로거는 HTTP 수준 진단이라 특정 responseCode를 알면 안 된다. 바뀐 것은 도메인이 그 응답을 어떻게 해석하는가다.

🤖 Generated with Claude Code

refresh가 돌려줄 수 있는 답은 셋인데 둘로 뭉개져 있었다.

- 서버에 세션이 있다        → AlarmInfo
- 서버가 **없다고 답했다**   → 404 URT_001 → **throw로 흘렀다**  ← 문제
- 못 물어봤다(실패·오프라인) → throw

가운데가 오른쪽과 같은 취급을 받으면서 두 가지가 생겼다. 평상시(알람 미등록)
매 실행마다 "알람 동기화 실패(상태 유지)" 에러 로그가 남았고, 더 나쁘게는
**서버에서 세션이 사라져도 앱이 낡은 세션을 계속 붙들었다** — 다른 기기에서
해제했거나 서버가 정리한 경우, 사용자는 울리지 않을 알람을 믿고 자게 된다.

Domain에 AlarmRefreshOutcome(registered/notRegistered)을 두고 refresh의
반환을 바꿨다. AlarmRepositoryImpl은 responseCode == "URT_001"만
.notRegistered로 매핑하고 나머지는 그대로 throw한다.

Reconciler가 이제 셋을 구분한다:
- server: .registered → 기존 병합 규칙 그대로
- server: .notRegistered → .ended (로컬 기록 정리)
- server: nil → 기존대로 세션 유지 + 로컬 만료만 판정

서버 응답값은 2026-09-25 실측으로 확인했다:
404 {"responseCode":"URT_001","message":"id(1010) 유저가 등록한 경로를 찾을 수 없습니다."}

테스트 +9: Repository 매핑 3(URT_001 / 성공 / 다른 코드는 여전히 throw),
Reconciler 표 4(확정 vs 미조회를 같은 세션으로 대조), UseCase 통과 1,
SyncService 통합 2(.notRegistered는 정리 / 실패는 유지).

검증: 3구성 빌드 + 전 스킴 통과. 시뮬레이터 신규 설치 실행에서
"알람 동기화 실패" 로그 0건 확인(이전에는 매 실행 1건).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@YuGeonHui
YuGeonHui merged commit 3dbd748 into env/dev Sep 24, 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.

1 participant