Commit Graph

164 Commits

Author SHA1 Message Date
sb 0780546d4f feat(recurring): 고정지출 무료 2건 허용(써보고 업셀) — 유료전용 해제
Deploy / deploy (push) Failing after 13m57s
WebConfig에서 /recurrings 유료 게이트 제거, 무료는 생성 시 종류무관 2건 한도(초과 400).
유료·관리자 무제한, 복원은 한도 미적용. RecurringMapper.countByMember 추가.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 21:22:31 +09:00
sb 489c3aacb7 fix(ai): 빠른입력 금액 — 한글 수(오만원·삼만원·십만원 등) 해석 예시 추가
Deploy / deploy (push) Failing after 12m54s
아라비아 숫자만 예시라 '오만원' 등 한글 표기 금액을 놓치던 문제. 한글 수 예시 보강.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 22:28:36 +09:00
sb 4132a17c6a feat(ai): 빠른입력 이체(TRANSFER) 지원 — 출금/입금 계좌 분리 추출
Deploy / deploy (push) Failing after 14m51s
스키마에 TRANSFER 타입 + toWallet(받는 계좌) 추가. 이체 시 wallet=출금·toWallet=입금 계좌를
후보 중에서 매칭, 분류는 비움. 기존엔 이체가 EXPENSE로 뭉개지던 문제 해결.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 22:16:38 +09:00
sb 29b14a5464 feat(wallet): 무료 회원 계좌 종류별 2개 한도 (유료 무제한)
Deploy / deploy (push) Failing after 11m4s
- createWallet 에 premium 여부 전달, 무료는 종류별 countByType >= 한도면 400
- 한도 계산을 freeWalletLimit 한 곳에 모음(추후 포인트 상점의 영구 보너스 슬롯 최대 5까지 확장 지점)
- 복원(BackupService)은 본인 데이터 복구라 한도 우회

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 01:40:25 +09:00
sb cc36f9e939 revert(point): 개근 보너스 전월 제한 복구 — 현재 월만 인정
Deploy / deploy (push) Failing after 13m56s
테스트(6월 검증) 완료 후 원래 규칙으로 복구. 전월 소급 파밍 방지.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 17:07:35 +09:00
sb 56197c2689 test(point): 개근 보너스 전월 제한 임시 해제 — 6월 데이터 검증용
Deploy / deploy (push) Failing after 15m31s
테스트 후 되돌릴 예정(현재 월만 인정으로 복구).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 17:01:00 +09:00
sb 45bb025247 feat(point): 한 달 개근(모든 날 기록) 랜덤 보너스 1~100P
Deploy / deploy (push) Failing after 14m42s
내역 저장 시 현재 월 모든 날에 기록이 있으면 월 1회 랜덤 1~100P 지급.
전월 소급 입력 파밍 방지(현재 월만 인정), 화면 안내 없음(포인트 내역에만).
- AccountEntryMapper.countDistinctEntryDays, PointMapper.countByReason
- PointService.awardMonthComplete(reason=MONTH_COMPLETE_yyyyMM 로 월 1회)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 16:56:48 +09:00
ByungCheol a0509099f7 feat(budget): 1회성 예산 API 추가
Deploy / deploy (push) Failing after 11m13s
- BudgetOnetime 도메인/DTO/Mapper/Service 신규
- BudgetController: GET/POST/PUT/DELETE /api/account/budgets/onetime 엔드포인트 추가
- account.sql: budget_onetime 테이블 CREATE TABLE IF NOT EXISTS 추가
- WalletRequest: MINUS 유형 허용 추가
- CategoryService: importDefaults, validateParent, ensureCategory 추가

※ 최초 배포 시 서버 .env에 SQL_INIT_MODE=always 추가 후 재시작 필요 (budget_onetime 테이블 생성)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-05 16:15:15 +09:00
sb 24858f23e8 style(ai): 재무 코멘트·절약가이드 말투를 정중한 종결어미로 통일
Deploy / deploy (push) Failing after 14m37s
'~입니다/~합니다/~할 수 있습니다' 합쇼체 강제, 반말·음슴체 금지 + 예시 추가.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 15:45:25 +09:00
sb 7d15f06390 revert(ai): 예상 지출을 AI에서 제거 — 비결정성으로 매 접속 값 변동
Deploy / deploy (push) Failing after 12m44s
AI 예상지출은 호출마다 40만~500만으로 흔들려 신뢰성 부족. 코멘트/팁만 AI 유지.
예상 지출은 프론트에서 결정적 계산으로 대체.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 15:43:44 +09:00
sb 2802ec9d5a feat(ai): 월말 예상 지출을 AI 추정으로 — 일회성 큰 지출 왜곡 제거
Deploy / deploy (push) Failing after 12m37s
선형 run-rate는 노트북 등 일회성 지출을 남은 날에 곱해 비현실적 값(2천만) 생성.
AI가 분류를 보고 일회성을 일평균에서 제외해 추정 + 근거 문장 반환(경과일/총일수 전달).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 15:28:53 +09:00
sb a34a8250a4 feat(ai): 재무 코멘트에 절약 가이드(tips) 추가
Deploy / deploy (push) Failing after 13m20s
집계 기반으로 현황 코멘트(bullets)에 더해 지출 패턴 맞춤 절약 제안(tips) 2~3개 생성.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 15:13:09 +09:00
sb 4aeac2ac0f feat(ai): 통계 화면 AI 재무 코멘트
Deploy / deploy (push) Failing after 10m59s
이번 달 집계(수입·지출·전월대비·예산·분류별)만 Claude Haiku에 보내 2~3개 코멘트 생성.
POST /account/ai-comment(유료 게이트), 거래 원문 미전송. 미설정/실패 시 빈 코멘트→카드 숨김.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 15:05:32 +09:00
ByungCheol 655af7af63 feat(fx): 환율 캐시 시각 노출 — updatedAt 응답 추가
Deploy / deploy (push) Failing after 15m14s
- FxService: Cached 레코드에 fetchedAt(Instant) 추가, getCachedAt() 공개
- FxController: GET /api/fx/rate 응답에 updatedAt(ISO 문자열) 포함

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-05 14:51:14 +09:00
sb c5f16795ef fix(ai): 영수증 AI 멀티파트 파트수 초과(500) 수정
Deploy / deploy (push) Failing after 15m18s
Tomcat 기본 파트 수 제한(10)에 categoryHints/walletHints를 이름마다 파트로 보내 초과 → 500.
힌트를 줄바꿈으로 합친 단일 필드로 받아 파트 3개로 축소.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 14:46:14 +09:00
sb 28670b69a1 feat(ai): 영수증 사진 → Claude Vision 구조화
Deploy / deploy (push) Successful in 57s
/account/ocr/receipt-ai — 이미지를 Haiku 비전에 보내 금액·상호·날짜·분류·계좌를 한 번에 추출.
AI 미설정/실패 시 recognized=false → 프론트가 기존 Google Vision OCR 로 폴백.
Claude 호출/응답파싱 공통화(callClaude), 프롬프트 힌트주입 공통화(withHints).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 14:18:50 +09:00
sb 53326f089b feat(ai): 자연어 입력 시 분류·결제수단 자동 추천
Deploy / deploy (push) Failing after 12m30s
사용자의 실제 카테고리·계좌 후보를 AI에 전달해 그 중에서 선택(할루시네이션 방지 검증).
라면→식비, 삼성카드→해당 계좌 등 폼 자동 채움 확장.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 13:47:52 +09:00
ByungCheol 82eea0b908 feat(board): 스팸 키워드 자동 블라인드 및 관리자 신고 목록 노출
Deploy / deploy (push) Failing after 14m15s
- BoardService: create/addComment에서 isSpam 감지 시 자동 블라인드 처리, 포인트 미지급
- ReportMapper: listReported 쿼리 확장 — 신고 누적 OR 스팸 감지 블라인드 항목 모두 포함
- ReportedItem: blockReason 필드 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-05 13:47:13 +09:00
sb b3b42f0db6 fix(ai): 모델이 설명문 섞어 반환해도 JSON만 추출 — 파싱 견고성
Deploy / deploy (push) Failing after 13m39s
첫 '{'~마지막 '}' 구간만 추출해 파싱, 중괄호 없으면 조용히 규칙 폴백(WARN 대신 INFO)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 12:57:50 +09:00
ByungCheol 32da57e0e0 feat(point): 게시판 포인트 정책 개편
Deploy / deploy (push) Failing after 12m48s
작성: 10P, 일 50P 한도(5회), 스팸 키워드 포함 시 미지급
추천 받음(작성자): +5P, 일 50P 한도
비추천 받음(작성자): -1P
남의 글 추천(투표자): +1P, 일 10P 한도
추천 취소(투표자): -1P
addPoints에 GREATEST(0,...) 적용 — 잔액 음수 방지
2026-07-05 12:38:40 +09:00
sb d65dd88bba chore(ai): 파싱 전과정 진단 로그(요청텍스트·모델원문·결과) 추가
Deploy / deploy (push) Failing after 14m50s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 12:36:40 +09:00
sb 30cb68c003 chore(ai): 시작 시 AI 파서 활성/키로딩 진단 로그 추가
Deploy / deploy (push) Failing after 14m25s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 12:12:04 +09:00
sb 811cc1b391 feat(ai): 자연어 한 줄 입력 파싱 — Claude Haiku 프록시(키 서버보관·실패 시 규칙 폴백)
Deploy / deploy (push) Failing after 13m20s
- 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>
2026-07-05 11:24:14 +09:00
sb 0082e647c2 ci: setup-java 캐시 제거 — 'Save cache' 후처리 hang 회피
Deploy / deploy (push) Successful in 49s
Gitea 캐시 서버 미연결 시 cache:gradle 저장 후처리가 수 분 hang → 가짜 실패 유발.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 09:56:10 +09:00
sb 9b5abedd40 ci(deploy): 배포 잡에서 테스트/서비스 제거 — bootJar 만 빌드
Deploy / deploy (push) Has been cancelled
서비스 컨테이너(MariaDB/Redis) 후처리 cleanup 이 러너에서 멈춰 15분 타임아웃 →
'가짜 실패'로 표시되던 문제 회피. 배포 잡은 clean bootJar 로 jar 만 만들어 ship.
테스트 게이트는 ci.yaml(같은 push 에서 실행)이 담당.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 09:48:20 +09:00
sb 9fdec36758 fix(ci): SQL_INIT_MODE=always 추가 — 컨텍스트 테스트 스키마 초기화
Deploy / deploy (push) Failing after 15m48s
@SpringBootTest(contextLoads) 시작 시 DefaultCategorySeeder 가 테이블을 조회하는데
CI 는 SQL_INIT_MODE 미설정(never)이라 스키마가 없어 BadSqlGrammarException 으로 실패했음.
운영과 동일하게 always 로 초기화 → 애플 로그인 커밋(a10e16c) 배포도 함께 통과.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 00:00:43 +09:00
ByungCheol 1d90f065e5 feat(point): 가계부 내역 작성 포인트 — 건당 10p, 일 50p 한도
Deploy / deploy (push) Failing after 11m31s
AccountService.create() 호출 시 PointService.awardAccountEntry() 적립.
ACCOUNT_ENTRY reason, 일 5회(50p) 초과 시 미지급.
2026-07-04 23:14:46 +09:00
sb a10e16c1af feat(auth): 애플 로그인 API — Sign in with Apple identity token 검증(JWKS)
Deploy / deploy (push) Failing after 12m48s
- 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>
2026-07-04 17:01:31 +09:00
sb 2f376e6f77 feat(board): 신고 목록 조회 API + 신고 무시(관리자)
Deploy / deploy (push) Failing after 11m22s
- GET /api/board/reports — 글/댓글 신고 대상별 집계(UNION, 신고 많은 순)
- POST /api/board/reports/dismiss — 블라인드 없이 신고 기록만 초기화
- 관리자 신고 관리 화면 백엔드

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 12:11:58 +09:00
sb 11d1655261 docs: BACKEND.md 현행화(신규 API·스키마·투자 모델·구글로그인)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 12:11:58 +09:00
ByungCheol 8ced77480e fix(cors): localhost:5174 허용 추가 — Vite 포트 충돌 시 자동 증가 대응
Deploy / deploy (push) Failing after 11m11s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-03 00:45:14 +09:00
ByungCheol 9ed80f7085 fix(config): 로컬 기동 시 SQL 초기화 스킵(never) — 운영은 SQL_INIT_MODE=always 환경변수로 제어
Deploy / deploy (push) Failing after 13m10s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-03 00:07:24 +09:00
ByungCheol 9b04ad3310 fix(logging): 로그 파일 경로를 상대경로(logs/)로 변경 — 절대경로 디렉토리 미존재 문제 해결
Deploy / deploy (push) Failing after 12m18s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 23:49:02 +09:00
ByungCheol f62889ac62 chore: 일별 롤링 로그 추가 (/opt/sb-backend/logs/app.YYYY-MM-DD.log, 30일 보관)
Deploy / deploy (push) Failing after 15m43s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 23:25:46 +09:00
ByungCheol 511843f1b6 fix(account): findTagsByEntryIds Map key 소문자로 통일 + null guard
Deploy / deploy (push) Failing after 14m54s
JDBC driver마다 column alias의 대소문자를 다르게 반환할 수 있어
entryId → entry_id, tagName → tag_name 으로 소문자 통일.
NPE 방지를 위한 null 체크도 추가.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 23:20:55 +09:00
ByungCheol 79fc8fea16 Merge branch 'dev'
Deploy / deploy (push) Failing after 13m49s
2026-07-02 01:47:29 +09:00
ByungCheol 190fbe835f perf(account): 내역 목록 태그 조회 N+1 → 배치 단일 쿼리로 개선
list() 에서 항목마다 findTagNamesByEntryId() 를 개별 호출하던 N+1 을
findTagsByEntryIds() 배치 쿼리 1회로 대체.
항목 수가 많을 때 타임아웃/과부하 방지.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 01:47:08 +09:00
ByungCheol 3ceb3c4253 Merge branch 'dev'
Deploy / deploy (push) Failing after 13m44s
2026-07-02 00:45:44 +09:00
ByungCheol 947c7a1f68 feat(account): 대출 계좌 loan_amount/loan_rate/loan_method/loan_months/loan_start 필드 추가
CI / build (push) Failing after 15m38s
- wallet 테이블: loan_amount(실행금액), loan_rate(연이자율%), loan_method(상환방식),
  loan_months(기간), loan_start(시작일) ALTER TABLE 추가
- Wallet 도메인/DTO/Mapper/Service 동기화
- WalletResponse.from()에 대출 필드 반영

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 00:45:42 +09:00
ByungCheol 186aec7bb4 Merge branch 'dev'
Deploy / deploy (push) Failing after 13m59s
2026-06-30 22:35:35 +09:00
ByungCheol 24e235404b feat: 월별 예산 + 전월/다음달 복사
CI / build (push) Failing after 15m52s
- budget 테이블에 year/month 추가, (member,category)→(member,category,year,month) 유니크 교체
  기존 상시 예산은 현재 월로 1회 이관
- 예산 조회/생성/현황/기간차트를 월별로(findByMember에 year/month)
- copyMonth: 다른 월 예산을 대상 월로 복사(같은 분류 덮어씀) + POST /budgets/copy
- 백업 복구 시 예산은 현재 월로 등록

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 22:35:32 +09:00
ByungCheol 3535c2e220 Merge branch 'dev'
Deploy / deploy (push) Failing after 12m21s
2026-06-30 21:37:07 +09:00
ByungCheol 10f51976d9 feat: 외화 결제 입력 — 통화+환율→원화 환산, 원본 보존 + 환율 API
CI / build (push) Failing after 14m19s
- account_entry에 currency/original_amount/exchange_rate 컬럼 추가(멱등 ALTER)
  amount는 환산 원화(표준값) 유지 → 통계·예산 무변경
- AccountEntry/Request/Response·매퍼·서비스에 외화 필드 전달
- FxService(open.er-api.com 무료·무인증, 통화별 일자 캐시) + FxController
  GET /api/fx/rate?from=USD&to=KRW → { from, to, rate }
- WebConfig: /api/fx/** 인증 보호
- (.gitignore: 로컬 시드 스크립트 제외 규칙)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 21:37:04 +09:00
ByungCheol 204c5ce430 Merge branch 'dev'
Deploy / deploy (push) Failing after 13m50s
2026-06-28 18:25:50 +09:00
ByungCheol b969ba6104 feat: 내 글/댓글 모아보기 API
CI / build (push) Successful in 59s
- GET /board/my/posts, /board/my/comments (페이징)
- PostSummary 에 category 추가, MyCommentResponse(글 제목·카테고리 포함)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 18:25:48 +09:00
ByungCheol 706deb057e Merge branch 'dev'
Deploy / deploy (push) Successful in 53s
2026-06-28 18:16:58 +09:00
ByungCheol ddcd6f4335 feat: 신고 블라인드 관리자 해제 + 해제 시 신고기록 초기화
CI / build (push) Failing after 14m33s
- POST /board/comments/{id}/unblock (관리자) — 댓글 블라인드 해제
- 글/댓글 블라인드 해제 시 신고 기록 삭제(재블라인드 방지)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 18:16:56 +09:00
ByungCheol e5d1b5d40c Merge branch 'dev'
Deploy / deploy (push) Failing after 14m27s
2026-06-28 18:05:13 +09:00
ByungCheol ba75613e1c feat: 게시판 신고 — 누적 5건 시 블라인드(관리자만 열람)
CI / build (push) Failing after 11m17s
- report 테이블(회원당 대상별 1회), comment.blocked 컬럼
- POST /board/posts|comments/{id}/report, 본인 글/댓글 신고 불가
- 글: 5건이면 blocked(기존 열람제한 재사용) / 댓글: blocked → 비관리자 본문 숨김
- 삭제·탈퇴 시 신고 정리

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 18:05:10 +09:00
ByungCheol d028d957b6 Merge branch 'dev'
Deploy / deploy (push) Failing after 15m25s
2026-06-28 17:29:17 +09:00