Skip to content

fix(weather): 외부 날씨 API 실패 시 고정 폴백 반환으로 서비스 중단 방지 - #57

Merged
Kimseungin0529 merged 4 commits into
devfrom
feat/weather-fallback
Jul 21, 2026
Merged

fix(weather): 외부 날씨 API 실패 시 고정 폴백 반환으로 서비스 중단 방지#57
Kimseungin0529 merged 4 commits into
devfrom
feat/weather-fallback

Conversation

@Kimseungin0529

Copy link
Copy Markdown
Collaborator

변경 내용

외부 날씨 API(KMA) 호출이 실패하면 요청 전체를 실패시키는 대신 고정 폴백 데이터(흐림/20℃ + 중립 수치: 습도 50·풍속 0·강수확률 0·자외선 0·최저/최고 20)를 반환하도록 변경합니다.

  • WeatherFallback 상수/팩토리 신설
  • WeatherParallelFetcher: 필수 소스(실황 current) 실패 시 joinRequired가 던지던 503을 제거하고, 이를 provider 전체 장애의 카나리로 보아 나머지 소스도 폴백으로 채움 → /weather/home, /weather/detail 항상 정상 응답
  • FarmWeatherService.getDaily: provider 장애 시 폴백 반환
  • RecordFeedbackContextAssembler: AI 코칭 라이브 날씨도 장애 시 폴백(source=FALLBACK) 사용
  • 폴백을 반환해도 partial.degraded=truemissing 목록은 정직하게 유지

변경 이유

해외 VPN 환경(및 기상청 자체 장애) 시 날씨 API 호출이 실패한다. 현재 기록하기 플로우는 날씨를 필수로 요구해, 필수 소스(실황) 실패 시 WEATHER_PROVIDER_UNAVAILABLE(503)로 요청 전체가 죽고 기록 저장이 차단된다 → 앱 심사 중 QA 불가. 서비스 중단을 막고 항상 정상 흐름을 제공하기 위함이다. (BR-EXCEPTION-002)

영향 범위

  • 엔드포인트: GET /api/v1/weather/home, /detail, /daily — provider 장애 시 503 대신 200 + 폴백
  • AI 기록 피드백(코칭) 컨텍스트 — 장애 시 null 대신 폴백 날씨 사용(사용자 정책상 허용)
  • KMA 외부 API 6개 어댑터(초단기실황·단기예보·중기예보·자외선·ASOS·코칭 라이브) 전부 커버
  • 응답 필드명/구조 불변 → 프론트엔드 변경 없음. partial.missing"current" 값이 추가될 수 있음(필드 추가 아님)
  • current가 살아있는 부분 결측은 기존대로 null 유지 → 최저/최고를 지어내지 않는 기존 동작 보존

검증

  • ./gradlew test 전체 통과 (2026-07-21)
  • 추가/수정 테스트: WeatherParallelFetcherTest(실황 실패→상세/홈 폴백, missing에 current), FarmWeatherServiceTest(getDaily 오늘/과거 provider 장애 폴백), RecordFeedbackContextAssemblerTest(business/runtime 장애→폴백)
  • 미실행: 실제 앱에서 VPN 상태 end-to-end 확인(로컬 Xcode/시뮬레이터 필요) — 별도 검증 필요

배포 및 호환성

  • DB 스키마 변경 없음
  • API 계약: 응답 필드명/타입 불변, provider 장애 시 상태코드가 503→200으로 바뀜(동작 개선). 클라이언트 호환 유지
  • 설정/마이그레이션/별도 배포 작업: 해당 없음

체크리스트

  • 관련 테스트를 추가하거나 수정했습니다.
  • 로컬 검증을 완료했습니다. (./gradlew test)
  • API·설정·DB 호환성 영향을 확인했습니다.
  • 민감한 정보가 포함되지 않았습니다.

🤖 Generated with Claude Code

Kimseungin0529 and others added 4 commits July 21, 2026 13:37
해외 VPN·기상청 장애로 KMA 호출이 실패할 때 서비스가 멈추지 않도록
반환할 고정 폴백 값(흐림/20도 + 중립 수치)을 정의한다.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
필수 소스(current) 실패를 provider 전체 장애의 카나리로 보고 나머지
소스도 폴백으로 채운다. joinRequired 제거로 요청 전체가 503으로 죽지
않는다. current가 살아있는 부분 결측은 기존대로 null 유지하고,
degraded=true는 그대로 표기한다. (BR-EXCEPTION-002)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
일자별 날씨 조회도 외부 API 장애면 흐림/20도 폴백을 반환한다.
입력 검증(미래/과거)과 실데이터 부재(404)는 그대로 전파한다.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
외부 날씨 API 장애 시 null 대신 고정 폴백(source=FALLBACK)을 제공해
AI 코칭이 중단되지 않게 한다. degraded 사유는 유지한다.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@Kimseungin0529
Kimseungin0529 marked this pull request as ready for review July 21, 2026 04:44
@Kimseungin0529
Kimseungin0529 merged commit 9f1cd37 into dev Jul 21, 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