- 기존 대출 수정 시 월 상환금(loanPayment)이 저장되지 않던 문제
(create 는 toWallet 로 반영됐으나 update 는 개별 setter 에서 누락)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 원리금균등 상환표를 은행 조회액과 정확히 맞추기 위한 고정 월 상환금 선택 저장
- wallet.loan_payment 컬럼(ALTER IF NOT EXISTS), 도메인·DTO·매퍼 반영
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
WebConfig에서 /recurrings 유료 게이트 제거, 무료는 생성 시 종류무관 2건 한도(초과 400).
유료·관리자 무제한, 복원은 한도 미적용. RecurringMapper.countByMember 추가.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
스키마에 TRANSFER 타입 + toWallet(받는 계좌) 추가. 이체 시 wallet=출금·toWallet=입금 계좌를
후보 중에서 매칭, 분류는 비움. 기존엔 이체가 EXPENSE로 뭉개지던 문제 해결.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- createWallet 에 premium 여부 전달, 무료는 종류별 countByType >= 한도면 400
- 한도 계산을 freeWalletLimit 한 곳에 모음(추후 포인트 상점의 영구 보너스 슬롯 최대 5까지 확장 지점)
- 복원(BackupService)은 본인 데이터 복구라 한도 우회
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
내역 저장 시 현재 월 모든 날에 기록이 있으면 월 1회 랜덤 1~100P 지급.
전월 소급 입력 파밍 방지(현재 월만 인정), 화면 안내 없음(포인트 내역에만).
- AccountEntryMapper.countDistinctEntryDays, PointMapper.countByReason
- PointService.awardMonthComplete(reason=MONTH_COMPLETE_yyyyMM 로 월 1회)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
선형 run-rate는 노트북 등 일회성 지출을 남은 날에 곱해 비현실적 값(2천만) 생성.
AI가 분류를 보고 일회성을 일평균에서 제외해 추정 + 근거 문장 반환(경과일/총일수 전달).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
이번 달 집계(수입·지출·전월대비·예산·분류별)만 Claude Haiku에 보내 2~3개 코멘트 생성.
POST /account/ai-comment(유료 게이트), 거래 원문 미전송. 미설정/실패 시 빈 코멘트→카드 숨김.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Tomcat 기본 파트 수 제한(10)에 categoryHints/walletHints를 이름마다 파트로 보내 초과 → 500.
힌트를 줄바꿈으로 합친 단일 필드로 받아 파트 3개로 축소.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
/account/ocr/receipt-ai — 이미지를 Haiku 비전에 보내 금액·상호·날짜·분류·계좌를 한 번에 추출.
AI 미설정/실패 시 recognized=false → 프론트가 기존 Google Vision OCR 로 폴백.
Claude 호출/응답파싱 공통화(callClaude), 프롬프트 힌트주입 공통화(withHints).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- AiEntryParser: /v1/messages(Haiku) 호출로 '어제 스타벅스 5천원'→{type,amount,merchant,date} 추출
- AccountService.parseText: AI 우선 시도, 미설정/실패/미인식 시 기존 규칙기반 파서로 폴백(무중단)
- app.anthropic-api-key/anthropic-model 설정(키 없으면 AI 비활성)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
서비스 컨테이너(MariaDB/Redis) 후처리 cleanup 이 러너에서 멈춰 15분 타임아웃 →
'가짜 실패'로 표시되던 문제 회피. 배포 잡은 clean bootJar 로 jar 만 만들어 ship.
테스트 게이트는 ci.yaml(같은 push 에서 실행)이 담당.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@SpringBootTest(contextLoads) 시작 시 DefaultCategorySeeder 가 테이블을 조회하는데
CI 는 SQL_INIT_MODE 미설정(never)이라 스키마가 없어 BadSqlGrammarException 으로 실패했음.
운영과 동일하게 always 로 초기화 → 애플 로그인 커밋(a10e16c) 배포도 함께 통과.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- POST /api/auth/apple — nimbus-jose-jwt 로 애플 공개키(JWKS) 서명 검증 + iss/aud(번들ID)/exp 확인
- member.apple_id 컬럼(멱등 ALTER) + findByAppleId/linkApple, 구글과 동일한 이메일 자동연결 로직
- app.apple-client-id 설정(기본 kr.sblog.slimbudget)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>