Skip to content

release: dev → main 배포 (날씨 폴백·작물검증·음성지침 외) - #58

Merged
Kimseungin0529 merged 30 commits into
mainfrom
dev
Jul 21, 2026
Merged

release: dev → main 배포 (날씨 폴백·작물검증·음성지침 외)#58
Kimseungin0529 merged 30 commits into
mainfrom
dev

Conversation

@Kimseungin0529

Copy link
Copy Markdown
Collaborator

변경 내용

dev에 누적된 변경을 main으로 배포합니다. (main 대비 30 커밋, 충돌 없음 / fast-forward 가능)

백엔드

프론트엔드

  • feat/voice: 음성 대화 지침에 완료 확인·ETC 폴백·예외 인지 보강 및 회귀 테스트 (feat(voice): 음성 대화 지침에 완료 확인·예외 인지 보강 #54)
  • fix(onboarding): 재배지 주소 조회가 해외 네트워크에서 응답 없어도 진행, 작도 후 조회 실패 시 직접 입력 전환, 지도 하단 카드 키보드 겹침 수정, 개인정보처리방침 추가
  • fix(home): 홈 날씨 카드 간헐적 실패 자동 재시도 및 재시도 버튼
  • fix(record): 이미지 업로드 중 완료 버튼 비활성화, 목록 뱃지 workType별 상세값 표시
  • fix(auth): 갱신 실패 시 네트워크 오류로 세션이 풀리는 문제 수정
  • fix(farm): 재배지 주소 수정 400·빈 주소 저장·첫 진입 미표시 수정
  • fix(mypage): 회원탈퇴 확인 다이얼로그 문구 개선
  • design(report): 리포트 도넛 디자인

변경 이유

정기 릴리스. 앱 심사 QA 차단 요인(날씨 API 실패로 기록 저장 불가) 해소와 온보딩·인증·기록 안정화 개선을 배포한다.

영향 범위

  • 백엔드 API: 날씨 조회(/weather/*) 장애 응답이 503→200+폴백으로 변경(계약 필드 불변), 기록 생성 시 작물-농장 검증 추가
  • 프론트엔드: 온보딩/홈/기록/인증/마이페이지/음성 다수 개선
  • DB 스키마 변경 없음

검증

배포 및 호환성

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

체크리스트

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

🤖 Generated with Claude Code

Kimseungin0529 and others added 30 commits July 20, 2026 13:15
기록 작물이 해당 농장에 등록되지 않았을 때 사용할 FARMING_RECORD_CROP_NOT_IN_FARM(400)을 추가한다. 사용처는 후속 커밋에서 연결한다.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
create/update에서 농장 소유(findFarm)와 전역 작물 존재(findCrop) 확인에 더해,
(회원,농장,작물) 조합이 MemberCrop에 등록됐는지 existsByMemberIdAndFarmIdAndCropId로
확인하고, 미등록이면 FARMING_RECORD_CROP_NOT_IN_FARM(400)을 던진다. 음성 기록도 confirm이
같은 create를 타므로 함께 커버된다.

기존 create/update 해피패스 테스트는 등록 조합을 전제하므로 setUp에 기본 stub(lenient)만
추가해 그린을 유지한다. 미등록 거부 회귀 테스트는 후속 커밋에서 추가한다.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
create/update 시 (회원,농장,작물)이 MemberCrop에 등록되지 않았으면
FARMING_RECORD_CROP_NOT_IN_FARM을 던지고 저장하지 않음을 검증한다.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
하나의 큰 문자열에 모여 있던 대화 지침을 역할·성격별 명명 섹션(인사, 페이싱, 요약규칙,
마무리규칙, 현재시각, 농지·작물 맥락, 작업유형 필수항목, 농약목록, memo·저장규칙)으로
나눠 build()에서 순서대로 조립한다. 출력 문구는 동일하며, 특정 규칙을 추가·수정할 때 해당
섹션만 손대도록 하기 위한 구조 변경이다.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
음성 기록이 텍스트보다 불편하거나 사용자가 모르는 오류가 생기지 않도록 지침을 보강한다.

- 완료 확인: 필수값을 다 모아도 바로 저장하지 않고 "더 기록할 내용 있으신가요"를 물어
  사용자가 마쳤다고 해야 저장 도구를 호출한다. 넘어가기 전 확인 화면에서 검토·수정 후
  저장됨(자동 저장 아님)을 알린다.
- 예외 인지: 작업 유형 유추 불가 시 ETC로 분류, 선택지에 없는 값·단위 불명확·목록 밖 농약·
  한 발화 다중 작업·비영농 발화를 조용히 넘기지 말고 항상 사용자에게 말로 알리도록 규정.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
완료 확인(더 기록할 내용 질문 후 저장), 확인 화면 안내(자동 저장 아님), 작업유형 유추 불가 시
ETC 분류, 예외 상황 인지(농약 화면 선택·다중 작업 안내) 문구가 지침에 포함되는지 검증한다.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
RecordSummaryResponse에 plantingMethod/materialName이 신규 추가되고
irrigationMethod/pesticideName/weedingMethod/harvestAmount가 유지되어,
2번째 뱃지를 활동유형 라벨 대신 활동유형별 상세값(파종방법/관수방식/
비료명/농약명/제초방식/수확량)으로 바꾼다. PRUNING/ETC는 값이 없어
2번째 뱃지 자체를 숨긴다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
TokenRefreshCoordinator가 토큰 재발급 실패를 모두 unauthorized로 처리해
네트워크 오류·서버 5xx·응답 파싱 실패에도 세션을 지우고 로그아웃시켰다.
서버가 실제로 401/403을 응답할 때만 세션을 종료하도록 수정하고 회귀 테스트를 추가했다.

fix(onboarding): 이전 온보딩 재개 알림이 닫히지 않고 반복 노출되는 문제 수정

alert의 isPresented 바인딩 setter가 no-op이라 버튼 외 방식으로 닫아도
다시 떴다. 실제 상태를 갖는 바인딩으로 교체했다.
또한 로그아웃/탈퇴 시 온보딩 임시저장(OnboardingDraftStore)이 지워지지 않아
다른 계정으로 로그인해도 이전 계정의 재개 알림이 노출되던 문제를 함께 수정했다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 주소 수정 시 도로명 없는 지번 주소가 roadAddress: ""로 전송돼 백엔드
  @notblank 400이 나던 문제 수정. 밭 추가/온보딩과 동일하게 지번 폴백 적용.
- canProceed가 내용 없는(도로명·지번 모두 빈) selectedAddress를 "주소 없음"으로
  취급하도록 하여, 레거시 빈-주소 밭도 저장 버튼이 검증으로 막히게 함.
- 프로필 수정→농경지 수정 첫 진입 시 기존 주소·지도 카메라가 안 채워지고
  두 번째 진입에야 채워지던 타이밍 버그 수정. farm+location을 단일 cover
  item으로 묶고, 주소 채우기를 picker의 .task로 이동해 실제 바인딩된
  인스턴스를 채우도록 변경.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
로그인/회원가입 직후 등 간헐적으로 날씨 조회가 실패하는 사례가 있었다.
재시도 가능한 에러(network/server/decoding/apiError)는 최대 2회 짧은
지연 후 조용히 재시도하고, 그래도 실패하면 카드에 "다시 시도" 버튼을
노출해 사용자가 직접 복구할 수 있게 했다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
96c2ca20에서 추가한 지도 팬/탭 대한민국 바운딩박스 제한만 되돌린다.
같은 커밋의 작도 진입 버튼, 필지 스냅샷/복원, 주소 노출·재시도 기능은 유지한다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
RecordComposeViewModel.canSubmit이 isUploadingImage를 반영하지 않아
사진 업로드가 끝나기 전에도 완료 버튼이 활성 상태로 보였다.
같은 뷰모델을 쓰는 기록 작성/수정 화면 모두에 적용된다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
복구 불가 사실을 명시하고 확인 버튼 문구를 명확히 해 되돌릴 수 없는 액션에 대한
사용자 인지를 높인다. BR-USER-004 탈퇴 후 미복구 규칙 반영.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
키보드가 올라올 때 하단 파셀 카드가 위로 밀려 상단 입력 필드·에러
텍스트 및 우측 지도 툴바와 겹치는 문제. mapOverlaySection이 .container만
무시하면 서브트리가 바닥까지 늘어나 키보드 회피가 이 안쪽에 재적용된다.
.all(컨테이너+키보드)로 바꿔 서브트리 전체를 고정한다.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
App Store Guideline 2.1(a) 리젝(iPad 심사) 대응. V-World/JUSO는 국내 전용 공공
API라 해외 네트워크 경로에서 아예 응답하지 않는 경우가 있는데, 지금까지는 요청에
타임아웃이 없고(기본 60초) 실패해도 빠져나갈 방법이 없어 "다음" 버튼이 멈춰 있는
것처럼 보였다(App Store 리뷰에서 관측, 미국 VPN으로 재현 확인).

- JUSO/V-World/토지특성정보 3개 서비스의 모든 네트워크 호출에 8초 타임아웃 추가
- geocode()의 도로명·지번 순차 조회를 병행 호출로 바꿔 최악 대기 시간을 절반으로 줄임
- .failed 상태에도 "지도에 직접 그리기" 복구 버튼을 추가(기존엔 안내 문구만 있고
  탈출구가 없었음)
- 작도 후 역지오코딩이 실패해도 주소를 직접 입력해 진행할 수 있는 경로 추가
- 위 실패 문구들을 "오류/확인 못함" 톤에서 정상 안내 톤으로 통일(리뷰어에게 고장난
  것처럼 보이지 않도록)

이제 V-World/JUSO가 완전히 응답하지 않아도: 지도 탭 → 지도에 직접 그리기 → 폴리곤
작도 → 주소 직접 입력까지 네트워크 의존 없이 온보딩을 끝낼 수 있다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
이전 커밋(6d88e71)에서 작도 완료 후 역지오코딩 실패 시 지도 카드 안에 별도
텍스트필드·버튼을 새로 추가했으나, 지도 하단 카드는 키보드 회피 이슈가 있었던
영역(dfa1aae)이라 더 복잡하게 만들지 않는 방향으로 수정한다.

- FarmLocationMapSection: 추가했던 인라인 텍스트필드/버튼 제거, "주소 다시 확인"
  버튼 하나로 원복
- FarmLocationViewModel: needsManualAddressEntry(sticky) 플래그 추가 — 작도 완료 후
  역지오코딩이 실패하면 켜지고, 새 작도 시작/취소 또는 자동 재시도 성공 시에만 꺼짐
- FarmLocationView(온보딩)/FarmLocationPickerView(마이페이지): 기존 상단 주소
  필드(검색 시트를 여는 버튼)를 needsManualAddressEntry일 때만 같은 자리에서 직접
  타이핑 가능한 TextField로 전환

새 UI 없이 기존 필드 하나를 버튼↔텍스트필드로 바꾸는 것만으로, V-World/JUSO가
해외 네트워크에서 전혀 응답하지 않아도 다음 버튼을 활성화할 수 있다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…validation

# Conflicts:
#	backend/application/src/main/kotlin/com/chamchamcham/application/farming/FarmingRecordService.kt
해외 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>
fix(weather): 외부 날씨 API 실패 시 고정 폴백 반환으로 서비스 중단 방지
feat(farming): 기록 작물이 해당 농장 등록 작물인지 검증
feat(voice): 음성 대화 지침에 완료 확인·예외 인지 보강
@Kimseungin0529
Kimseungin0529 marked this pull request as ready for review July 21, 2026 05:31
@Kimseungin0529
Kimseungin0529 merged commit 56b2602 into main 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.

2 participants