Commit Graph

81 Commits

Author SHA1 Message Date
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
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
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 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 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 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 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 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 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 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 a47b8405f4 feat(billing): 구매 복원 + RTDN 수신 스캐폴드 + 만료 강등 정합성
CI / build (push) Failing after 12m15s
- 만료 강등 스케줄러: 해지(자동갱신 off) 건만 강등(자동갱신은 마켓/RTDN 관리)
- POST /api/billing/restore: 최근 결제 기준 멤버십 복원(기기변경·재설치)
- POST /api/billing/google/rtdn: Google Play 실시간 알림 수신 스캐폴드(비인증, 로깅)
- 실연동 지점(영수증 검증·RTDN 처리)은 TODO 로 표시

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 17:29:15 +09:00
ByungCheol 8142b8b518 feat: 회원 탈퇴(자기 계정 삭제) — Play 정책 대응
CI / build (push) Failing after 15m7s
- DELETE /api/auth/me: 본인 계정과 모든 데이터 영구 삭제
- 게시판(글/댓글/추천/이미지)·가계부 전체·포인트·결제기록·세션 → 회원 순 삭제
- WithdrawMapper(게시판/포인트/결제/세션) + BackupMapper(가계부) 재사용
- AuthServiceTest 생성자 보강

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 16:56:23 +09:00
ByungCheol be15f5b85d feat: 정기결제 관리 — 구독 현황/해지/재개/플랜변경 백엔드
CI / build (push) Failing after 12m10s
- member.plan_product, plan_auto_renew 컬럼(구독 상품·자동갱신)
- GET /api/billing/subscription: 플랜·만료일·다음결제일·자동갱신
- POST /api/billing/cancel: 자동갱신 중단(만료일까지 이용), /resume: 재개
- verify 시 상품·자동갱신 기록, 만료 강등·관리자 변경 시 구독정보 정리

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 16:04:20 +09:00
ByungCheol a4b6c3fd2d fix: 목록 태그 필터도 게시판별로 — /board/tags?category 로 매핑된 그룹 태그만
CI / build (push) Failing after 12m6s
- 게시판 목록 화면의 태그 필터가 전체 태그를 보여주던 문제(매핑 무시) 수정
- 글쓰기와 동일한 listWritableGroups 기준으로 일관 적용

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 15:44:24 +09:00
ByungCheol d5366e8e72 feat: 태그 그룹 게시판 매핑 엄격 모드 — 미체크 그룹은 어디에도 미노출
CI / build (push) Failing after 12m19s
- listWritableGroups: 명시적으로 매핑된 게시판에만 노출(boards.contains)
- 게시판 미지정 그룹은 글쓰기에서 숨김 (수정 화면은 기존 글 태그 유실 방지로 전체 표시 유지)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 15:24:12 +09:00
ByungCheol 1e93280140 feat: 인앱 결제(Google Play) 스캐폴드 + 멤버십 만료 처리
CI / build (push) Failing after 13m46s
- member.plan_expires_at + iap_purchase 테이블(중복 결제 방지)
- POST /api/billing/google/verify: 구매 검증 후 PREMIUM 부여/갱신(만료 연장), 세션 plan 즉시 동기화
- GET /api/billing/products: 구독 상품(월간/연간)
- 테스트 모드(billing.test-mode=true): test- 토큰 검증 없이 승인 → 전 과정 테스트 가능
- GooglePlayVerifier 인터페이스 + 스텁(실연동 지점), 실연동 시 구현체 교체
- 관리자 수동 plan 변경은 만료일 없이(영구), 결제는 만료일 부여
- 만료 자동 강등 스케줄러(매시), MemberResponse.planExpiresAt 노출

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 15:12:45 +09:00
ByungCheol d1c13e7cc1 feat: 포인트 적립내역 조회 — GET /auth/point-history
CI / build (push) Failing after 12m7s
- point_history 최신순 조회(최대 100건), PointHistoryResponse
- PointService.getHistory, 인터셉터 경로 등록

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 14:44:24 +09:00
ByungCheol 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
ByungCheol b94f162f7e refactor: 게시판별 태그 매핑 도입으로 불필요해진 board_setting 제거
CI / build (push) Failing after 11m32s
- BoardSettingMapper(+XML)/BoardSettingRequest/Response 삭제
- TagService board_setting 의존 제거, /admin/board-setting 엔드포인트 제거
- board_setting 테이블 DDL 제거
- 글 수정 시 전체 그룹 조회(기존 글 태그 유실 방지): listWritableGroups(blank)=전체

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 14:04:59 +09:00
ByungCheol caaad65ca2 feat: 태그 그룹을 게시판별로 매핑 — 게시판 성격에 맞는 태그만 노출
CI / build (push) Failing after 12m11s
- tag_category_board 매핑 테이블 추가(그룹 ↔ community/saving/tips)
- TagCategory 응답에 boards 추가, 생성/수정 시 매핑 저장(유효 게시판만)
- listWritableGroups(category): 해당 게시판에 매핑된 그룹만(매핑 없으면 전체=하위호환)
- GET /board/tag-groups?category=... 로 게시판별 필터

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 13:34:19 +09:00
ByungCheol b4344f5270 feat: 게시판 인기글/블라인드/자기글 추천차단 + 프로필 전역 동기화
CI / build (push) Failing after 15m11s
- GET /api/auth/profile: 아바타·포인트 포함 전체 프로필(재로그인 없이 최신화)
- 자기 글/댓글 추천·비추천 차단(400)
- 인기 글: 등록 1일 이내 + 추천 50건 이상이면 목록 상단 최대 3건 노출(hot)
- 인기 댓글: 동일 조건으로 댓글 목록 상단 정렬(hot)
- PostSummary 에 downCount 추가(비추천 20+ 블라인드 판정용)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 13:21:19 +09:00
ByungCheol ef9dace1df feat: 게시판 추천/비추천 + 작성자 아바타 + 추천자 + 활동 포인트
CI / build (push) Failing after 12m4s
- 작성자 아바타: post/comment 조회 시 member JOIN(google_picture/profile_image),
  목록·상세·댓글 응답에 노출
- 추천/비추천: post_vote/comment_vote 테이블 + 토글 API
  (POST /board/posts|comments/{id}/vote), 게시글/댓글 응답에 up/down/myVote
- 추천자 목록: GET /board/posts/{id}/recommenders + PostDetail.recommenders
- 포인트: member.points + point_history. 글/댓글 작성 시 10P, 하루 3회 한도(합산).
  PointService, GET /auth/points, MemberResponse.points 노출
- @MapperScan 에 point.mapper 추가, AuthController WebMvc 테스트 MockBean 보강

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 12:27:35 +09:00
ByungCheol 98f5f51112 feat: 프로필 사진 — 구글 아바타 동기화 + 사용자 지정 이미지
- member.google_picture(구글 아바타 URL), profile_image(사용자 지정 data URL) 컬럼 추가(멱등)
- 구글 로그인 시 picture 클레임 추출 → 신규 저장, 기존은 변경 시 동기화
- PUT /api/auth/profile-image: 사용자 지정 사진 설정/해제(빈값=해제→구글 폴백), data URL·용량 검증
- MemberResponse 에 googlePicture/profileImage 노출(표시 우선순위 프론트 처리)
- 관리자 목록(findAll)은 무거운 profile_image 제외해 가볍게 조회

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 11:39:35 +09:00
ByungCheol 6256d3e63d feat: 멤버십(무료/유료) 게이팅 — 백엔드
CI / build (push) Failing after 13m40s
- member.plan(FREE/PREMIUM) 컬럼 추가 + SessionUser/MemberResponse 노출
- auth_session 백업에 plan 저장(세션 복원 시 유료 상태 유지)
- 관리자 회원 plan 변경 API (PUT /api/admin/members/{id}/plan)
- PremiumInterceptor 로 유료 전용 경로 차단(통계/예산/고정지출/태그/OCR/투자/카드알림/백업)
  · 관리자는 플랜과 무관하게 허용, 무료 회원은 403 PREMIUM_REQUIRED
- WebConfigTest: 유료 경로 등록 회귀 가드 추가

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

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 09:03:11 +09:00
ByungCheol 3b46d2ba09 feat: 데이터 가져오기(복구) — 엑셀 백업으로 전체 교체 (트랜잭션)
CI / build (push) Failing after 12m39s
- 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
ByungCheol bf6fb97ed8 feat: 게시글 수정 시에도 공지 체크박스 반영 (관리자)
CI / build (push) Failing after 11m18s
- BoardService.update: 관리자면 req.notice 로 공지 갱신
  (작성/수정 체크박스로 공지 on/off, 상세 토글 버튼 제거 대응)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 22:59:04 +09:00
ByungCheol 8d8d26ec3a feat: 게시판 공지 기능 (관리자) — 목록 최상단 고정
CI / build (push) Failing after 14m19s
- post.notice 컬럼 추가(멱등 ALTER)
- 목록 정렬 ORDER BY notice DESC, id DESC (공지 최상단)
- 작성 시 공지 설정(관리자만 반영) + /posts/{id}/notice·unnotice 토글
- Post/PostSummary/PostDetail/PostRequest 에 notice 반영

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 22:06:48 +09:00
ByungCheol b48d8c667c feat: 구글 로그인 — 같은 이메일이면 기존 계정에 자동 연결
CI / build (push) Failing after 14m59s
- member.google_id 컬럼 추가(멱등 ALTER) + 기존 GOOGLE 계정 sub 백필
- googleLogin: google_id 조회 → 없으면 검증된 동일 이메일 계정(LOCAL 우선)에
  연결 → 그래도 없으면 신규 생성. provider 는 유지(아이디 로그인/프로필 편집 보존)
- MemberMapper: findByGoogleId/findByEmailForLink/linkGoogle 추가, google_id 매핑

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 19:01:57 +09:00
ByungCheol 09efd65fa9 feat: 구글 로그인/가입 — ID 토큰 검증 후 세션 발급
CI / build (push) Failing after 14m2s
- AuthService.googleLogin: 구글 tokeninfo 로 ID 토큰 검증(aud==클라이언트 ID)
  후 provider=GOOGLE 회원 조회/자동가입 → 세션 발급(login 과 동일 경로)
- GoogleLoginRequest DTO, /api/auth/google·/google-client-id 엔드포인트
- application.yml: app.google-client-id=${GOOGLE_CLIENT_ID:}

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 18:02:19 +09:00
ByungCheol a1697a7a22 feat: 자주 쓰는 내역(빠른등록) + 문자/푸시 텍스트 파싱 API
CI / build (push) Failing after 15m21s
- 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