Commit Graph
33 Commits
Author SHA1 Message Date
sbandClaude Opus 4.8 b3b42f0db6 fix(ai): 모델이 설명문 섞어 반환해도 JSON만 추출 — 파싱 견고성
첫 '{'~마지막 '}' 구간만 추출해 파싱, 중괄호 없으면 조용히 규칙 폴백(WARN 대신 INFO)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 12:57:50 +09:00
sbandClaude Opus 4.8 d65dd88bba chore(ai): 파싱 전과정 진단 로그(요청텍스트·모델원문·결과) 추가
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 12:36:40 +09:00
sbandClaude Opus 4.8 30cb68c003 chore(ai): 시작 시 AI 파서 활성/키로딩 진단 로그 추가
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 12:12:04 +09:00
sbandClaude Opus 4.8 811cc1b391 feat(ai): 자연어 한 줄 입력 파싱 — Claude Haiku 프록시(키 서버보관·실패 시 규칙 폴백)
- 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
ByungCheol 1d90f065e5 feat(point): 가계부 내역 작성 포인트 — 건당 10p, 일 50p 한도
AccountService.create() 호출 시 PointService.awardAccountEntry() 적립.
ACCOUNT_ENTRY reason, 일 5회(50p) 초과 시 미지급.
2026-07-04 23:14:46 +09:00
ByungCheolandClaude Sonnet 4.6 511843f1b6 fix(account): findTagsByEntryIds Map key 소문자로 통일 + null guard
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
ByungCheolandClaude Sonnet 4.6 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
ByungCheolandClaude Sonnet 4.6 947c7a1f68 feat(account): 대출 계좌 loan_amount/loan_rate/loan_method/loan_months/loan_start 필드 추가
- 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
ByungCheolandClaude Opus 4.8 24e235404b feat: 월별 예산 + 전월/다음달 복사
- 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
ByungCheolandClaude Opus 4.8 10f51976d9 feat: 외화 결제 입력 — 통화+환율→원화 환산, 원본 보존 + 환율 API
- 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
ByungCheolandClaude Opus 4.8 629ab1f811 feat: 기본 분류 초기 시드 — default_category 비어있으면 기본 세트 생성
- 기동 시 1회(ApplicationRunner), 데이터 없을 때만 생성(운영 데이터 미간섭)
- 지출 10대분류(+소분류)·수입 3대분류(+소분류) 기본 템플릿
- 관리자가 이후 수정/정렬/삭제 가능

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 14:44:23 +09:00
ByungCheolandClaude Opus 4.8 f130d53f62 fix: 복구 - 계좌를 이름 대신 원본 ID 기준 매핑 + 잘못된 이체 스킵
- 같은 이름 계좌가 있어도 정확히 매핑(이름 충돌로 '출금=입금' 오류 해결)
- 이체인데 계좌 없거나 같으면 해당 항목만 건너뜀(전체 롤백 방지)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 09:03:11 +09:00
ByungCheolandClaude Opus 4.8 3b46d2ba09 feat: 데이터 가져오기(복구) — 엑셀 백업으로 전체 교체 (트랜잭션)
- POST /api/account/restore: 기존 데이터 전부 삭제 후 이름 기준 재생성
  (계좌→태그→분류(대/소)→내역→고정→예산→자주내역), 한 트랜잭션(실패 시 롤백)
- 빈 데이터 안전장치, 투자 종목/매매는 복구 대상 외(삭제됨)
- BackupMapper(deleteByMember), RestoreRequest DTO, BackupService/Controller

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 08:38:21 +09:00
ByungCheolandClaude Opus 4.8 a1697a7a22 feat: 자주 쓰는 내역(빠른등록) + 문자/푸시 텍스트 파싱 API
- quick_entry 테이블 + 도메인/매퍼/서비스/컨트롤러 (/account/quick-entries CRUD)
- /account/entries/parse: 문자·푸시 텍스트를 파서로 분석해 결과만 반환(저장X)
  → iPhone 등 알림 자동수집 불가 시 복사→붙여넣기 자동채움용

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 14:47:00 +09:00
ByungCheolandClaude Opus 4.8 63b3ffea24 feat: 기본(디폴트) 분류 — 관리자 설정 + 사용자 불러오기
- default_category 테이블(전체 공용) + 도메인/매퍼/서비스
- 관리자 API /api/admin/default-categories (CRUD·reorder, ADMIN 보호)
- 사용자 /account/categories/import: 기존 내역 기반 → 기본분류 복사로 변경
  (대/소분류 계층 유지, 같은 이름은 건너뜀; CategoryMapper.findByMemberTypeName 추가)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 23:03:38 +09:00
ByungCheolandClaude Opus 4.8 5f21cc4474 feat: 분류 대/소분류(2단계) — account_category.parent_id
- parent_id 추가(CREATE + ALTER IF NOT EXISTS 멱등 마이그레이션)
- 도메인/DTO/매퍼에 parentId 노출, 2단계 검증(대분류 아래만 소분류)
- 자식 있는 대분류는 소분류화·삭제 차단(countChildren)
- 통계/예산/내역은 소분류 이름 기준 그대로(무변경)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 23:16:03 +09:00
ByungCheolandClaude Opus 4.8 3fc233d697 feat: 순자산 추이 주간 집계 추가 (/networth/trend?unit=WEEK)
- weeklyWalletFlow(월요일 기준 주별 순현금흐름) + netWorthTrendWeekly(기본 13주)
- 컨트롤러에 unit=WEEK&weeks=N 지원(기존 월별은 그대로)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 22:38:06 +09:00
ByungCheolandClaude Opus 4.8 7de643022b feat: 고정지출 생성분을 '확인 필요(pending)'로 — 실제 처리 여부 확인
- RecurringService.buildEntry: pending=true로 생성 → 가계부 '확인 필요' 목록에 노출,
  사용자가 실제 결제·이체 확인 후 확정(빈 body confirm은 분류/계좌 유지)
- 메모 없으면 제목으로 채워 확인 목록에서 식별 쉽게

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 17:13:14 +09:00
ByungCheolandClaude Opus 4.8 6eef6cbd29 feat: 계좌 관리에 현금(CASH) 유형 추가
- WalletRequest 유형 검증에 CASH 허용
- netWorth: CASH를 자산으로 합산(기존 else 분기에서 부채로 잡히던 것 방지)
- 추이(trend)는 부호있는 openingBalance+흐름이라 CASH 자동 반영(변경 불필요)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 15:43:29 +09:00
ByungCheolandClaude Opus 4.8 553855b31c feat: 상환/납부에 연회비(카드) 추가 — 지출(분류 연회비)로 분리 저장
- RepaymentRequest.annualFee 추가, repay()에서 연회비>0이면 EXPENSE(분류=연회비) 생성
- 연회비는 카드 대상에만 허용(대출 입력 시 400)
- 원금/이자/연회비 중 하나는 필수로 완화

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 22:52:23 +09:00
ByungCheolandClaude Opus 4.8 a0fc546ad8 feat: 자동인식 분류 학습 — 같은 메모 키워드는 과거 분류로 자동 채움
- 알림 자동등록 시 memo(가맹점) 키워드로 과거에 '확정'한 내역의 분류를
  찾아(가장 많이 쓴 분류) pending 내역에 미리 채운다.
- 메모 포함관계 매칭('스타벅스' ↔ '스타벅스 강남점'), 같은 type(수입/지출)만.
- 안전상 '확인 필요' 상태는 유지(분류만 선반영) — 무검토 오확정 방지.
- AccountEntryMapper.findLearnedCategory 추가.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 22:22:54 +09:00
ByungCheolandClaude Opus 4.8 120e042971 fix: 광고 푸시·문자 오등록 차단 강화 (죽은 코드 수정)
- 기존 광고 차단(if !strong && AD_HINT)은 강신호가 보장된 지점이라
  항상 false → 한 번도 실행되지 않는 죽은 코드였음. 광고어가 섞여도
  승인/입금 등 신호가 있으면 그대로 등록되던 원인.
- 광고어를 2단계로 분리:
  - AD_BLOCK(이벤트·쿠폰·혜택·당첨 등): 거래신호가 있어도 무조건 제외
  - AD_WEAK(적립·포인트·할인 등): '결제'만 있고 명확한 거래신호가 없을 때 제외
    (실거래 영수증의 '포인트 적립'은 보존)
- '결제'는 광고 문구에도 흔해 약신호(weakApproval)로 강등
- 파서 단위테스트 +4 (광고+강신호 차단, 실거래 포인트 보존, 결제단독 광고/정상)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 22:15:54 +09:00
ByungCheolandClaude Opus 4.8 31590343cf feat: 알림 분류 — 카드 승인/취소 + 은행 입금/출금·이체 구분
- 파서: 입금→수입, 출금/이체→지출, 카드 승인→지출, 카드 취소/환불→수입(환불)
  은행 거래는 은행(BANK) 지갑에, 카드는 카드(CARD) 지갑에 매칭(matchWalletId 일반화)
- createFromNotification: 파싱된 수입/지출 타입·지갑종류로 생성
- 파서 테스트 갱신(은행 입금/출금 케이스 포함)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 22:47:32 +09:00
ByungCheolandClaude Opus 4.8 2da43b2f77 feat: 카드 알림 계좌 자동선택 - 카드사 표기 차이 유연 매칭
- CardIssuerMatcher: 공백·접미사(카드/은행/페이/뱅크) 제거 + 별칭 통합(KB↔국민, 농협↔NH, 비씨↔BC, 씨티↔시티)
  · KB카드/국민카드/KB국민/국민 어떻게 등록해도 KB국민카드 알림에 자동 매칭
- AccountService.overlaps 가 CardIssuerMatcher 사용
- 단위테스트 4 추가

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 17:33:33 +09:00
ByungCheolandClaude Opus 4.8 eded44a476 feat: 투자 매매내역 수정 API (PUT /trades/{id})
- InvestController/Service/Mapper: updateTrade 추가
- 수정 결과를 시점별로 시뮬레이션해 보유수량이 음수가 되면 거부(매도 과다 방지)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 16:42:33 +09:00
ByungCheolandClaude Opus 4.8 c05be0880c feat: 회원가입 제한·봇차단(허니팟/레이트리밋)·카드 자동인식 보정
- 관리자 회원가입 허용 토글(app_setting), 공개 GET /auth/signup-enabled
- 회원가입 봇차단: 허니팟(website) + IP 레이트리밋(Redis, 1h 5회)
- 카드 알림: 현금 오선택 보정(카드 양방향 매칭+단일카드 자동), 광고 푸시 차단(승인신호 없는 광고성 표현 무시)
- @MapperScan 에 admin.mapper 추가
- account.sql: 매 기동 wallet MODIFY 제거(라이브 락 위험) — CREATE 정의에 255 반영됨

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 00:15:57 +09:00
ByungCheolandClaude Opus 4.8 fb94df8112 feat: 시세 자동조회·퇴직연금 평가액·게시판 카테고리·태그 정렬·계좌번호 암호화
- 투자: 종목코드로 현재가 시세 자동조회(StockQuoteService, 투자탭/포트폴리오 진입 시 갱신)
- 투자: 퇴직연금 등 평가액 직접입력형 계좌(currentValue 활성화, manualValuation)
- 게시판: community/saving/tips 카테고리 분리(post.category + 목록 필터)
- 태그: 순서 변경(account_tag.sort_order, /tags/reorder)
- 보안: 계좌번호 AES-256-GCM 암호화 저장/복호화(EncryptedStringTypeHandler, account_number VARCHAR(255))
  키는 서버 .env ACCOUNT_CRYPTO_KEY 로 주입(미설정 시 평문 통과)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 05:00:18 +09:00
ByungCheolandClaude Opus 4.8 8fec057752 feat: 카드 결제 알림 자동인식(미확인 내역) 백엔드
- account_entry pending/notif_key 컬럼 추가(멱등 마이그레이션)
- CardNotificationParser: 카드사·금액·가맹점·승인/취소 파싱
- POST /entries/notification(미확인 지출 생성, 중복방지, 카드 자동매칭)
- POST /entries/{id}/confirm(확정), GET /entries/pending/count

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 18:51:30 +09:00
ByungCheolandClaude Opus 4.8 c1f97364aa feat: 영수증 OCR Google Vision 연동
- VisionOcrService: 이미지→Google Vision DOCUMENT_TEXT_DETECTION 호출, 전체 텍스트 반환
- OcrController: POST /api/account/ocr/receipt (멀티파트, 로그인 필요)
- API 키는 GOOGLE_VISION_API_KEY 환경변수(.env)로만 주입 — 미설정 시 503
- multipart 업로드 10MB 허용

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 17:37:17 +09:00
ByungCheolandClaude Opus 4.8 bd0a0f7776 feat: 투자 소수점 매매 + 카드 할부(installment_months)
- invest_trade.quantity BIGINT→DECIMAL(18,6): 평단·원가·평가/실현손익 계산을 BigDecimal로 전환 (금액은 원단위 정수 유지)
- account_entry.installment_months 추가: 카드 지출 2~24개월 할부 기록(일시불 null), 응답에 포함

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 16:41:58 +09:00
ByungCheolandClaude Opus 4.8 f5e9b78a14 feat: 예상 수입 월별 저장 + 계좌 순서변경 API
- 예상 수입: budget_income(연·월별) 로 변경, GET/PUT 에 year·month
- 계좌: wallet.sort_order + reorder 엔드포인트, 생성 시 맨 뒤 배치

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 22:54:23 +09:00
ByungCheolandClaude Opus 4.8 cac9919cc5 feat: 분류 순서변경(reorder) + 월 예상 수입 설정 API
- 분류: sort_order reorder 엔드포인트, 생성 시 맨 뒤 배치
- 예산: account_setting 테이블 + 월 예상 수입 GET/PUT

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 22:37:41 +09:00
ByungCheolandClaude Opus 4.8 2a2f81dc32 feat: 가계부·게시판 백엔드 API 구현
- com.sb.web 패키지로 재구성: account / auth / board / user / admin / common
- 가계부(account): 내역(필터), 계좌·순자산, 예산, 분류, 정기 거래, 투자 포트폴리오
  (종목·매매 이력, 이동평균 평단·실현/평가손익)
- MyBatis + MariaDB + Redis 세션, BCrypt
- 스키마 자동 초기화(db/*.sql, 멱등), 사용자별 데이터 격리(member_id)
- 문서: docs/BACKEND.md, .env.example

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 15:43:09 +09:00