- 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>
- parent_id 추가(CREATE + ALTER IF NOT EXISTS 멱등 마이그레이션)
- 도메인/DTO/매퍼에 parentId 노출, 2단계 검증(대분류 아래만 소분류)
- 자식 있는 대분류는 소분류화·삭제 차단(countChildren)
- 통계/예산/내역은 소분류 이름 기준 그대로(무변경)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 앱은 출처가 localhost 라 /api/images/{id} 상대경로가 백엔드로 안 감 → 안 보임
- app.public-url(기본 https://app.sblog.kr) 기준 절대 URL 반환 → 웹/PC/APK 모두 로드
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- board_image 테이블 + BoardImageController/Service/Mapper
· POST /api/board/images(로그인) → {url:/api/images/{id}}
· GET /api/images/{id}(공개, img src 로 로드) — 1년 캐시
- 본문엔 짧은 URL 만 들어가 글이 비대해지지 않음
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- InvestController/Service/Mapper: updateTrade 추가
- 수정 결과를 시점별로 시뮬레이션해 보유수량이 음수가 되면 거부(매도 과다 방지)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- POST /auth/verify-password, PUT /auth/profile(세션 표시 이름 동기화)
- MemberMapper.updateProfile, AuthSessionMapper.updateName
- 단위테스트(24): CardNotificationParser(8), AuthService(16, Mockito)
- CI(.gitea): 테스트 리포트 아티팩트 업로드(clean build가 곧 테스트 게이트)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 관리자 회원가입 허용 토글(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>
- 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>
- 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>
- 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>
- 예상 수입: budget_income(연·월별) 로 변경, GET/PUT 에 year·month
- 계좌: wallet.sort_order + reorder 엔드포인트, 생성 시 맨 뒤 배치
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Initial commit: SB 백엔드 (Spring Boot + MyBatis)
- 사용자 CRUD REST API (/api/users)
- MariaDB(MyBatis) + Redis 캐싱 구성
- CORS 설정 및 헬스 체크 엔드포인트
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@