# Slim Budget — 변경 내역 (2026-06-06 배포) 이번 작업 세션에서 추가·수정한 기능 정리. (프론트 `sb_pt`, 백엔드 `sb_bt`, 안드로이드 앱 포함) --- ## 1. 홈 대시보드 - **일별 수입·지출 캘린더** 추가 (예산 대비 지출 아래). 날짜를 **탭하면 그 날의 내역을 팝업(모달)으로** 표시(시인성 개선·단일 탭 동작). ## 2. 투자 / 계좌 - **시세 자동조회**: 종목코드(6자리)로 네이버 금융에서 현재가 자동 갱신. 투자 탭 진입·포트폴리오 펼침 시 자동, "↻ 시세 갱신" 버튼도 제공. - **퇴직연금·연금 등 평가액 직접입력형 계좌**: 종목 없이 현재 평가액만 입력해 관리(누적 적립원금 대비 손익% 표시). - 보유 종목 표기 2줄 정리(수량 / 평단·현재가). - **계좌번호 암호화**: DB에 AES-256-GCM으로 저장(키는 서버 `.env` `ACCOUNT_CRYPTO_KEY`). 화면에서는 **끝 4자리만 노출 + 👁 전체보기 토글**로 마스킹. ## 3. 가계부 내역 / 고정 지출 - "정기 거래" → **"고정 지출"** 명칭 변경, 월간/년간 분리·카테고리 소계/합계. - 내역·고정지출 추가 시 계좌 종류 **라디오 + 셀렉트** 패턴, 저장 버튼 sticky. ## 4. 카드 결제 알림 자동인식 (버그 수정) - **현금으로 잘못 선택되던 문제**: 알림 자동인식(pending) 건은 매칭 실패해도 계좌 종류를 **'카드'로 기본 선택**. 백엔드 카드 매칭을 양방향 부분일치(`KB국민↔국민`) + 카드가 1개뿐이면 자동 매칭으로 개선. - **광고 푸시 오인식 차단**: 강한 승인신호(승인/출금/취소/환불) 없이 광고성 표현(이벤트·할인·적립·포인트·캐시백·쿠폰 등)이 있으면 결제로 보지 않음. 네이티브 1차 필터에서 '카드' 키워드 제거. - 확인(확정) 실패 시 **HTTP 상태코드 노출** + 즉시 UI 반영. ## 5. 게시판 - "자유게시판" → **커뮤니티 / 짠테크 수다방 / 재테크 팁** 3개 게시판으로 분리(카테고리). - 사이드바를 **가계부 / 게시판 / 관리자 영역 구분선**으로 정리. - 글 번호 컬럼 미노출. ## 6. 회원가입 / 인증 - **이용약관·개인정보 수집 동의**(필수 체크) 추가. - **관리자 회원가입 제한 토글**: 회원 관리 화면에서 신규 가입 on/off. 제한 시 가입 진입(랜딩·로그인·가입 팝업)부터 차단. - **봇 가입 차단**: 허니팟(숨김 필드) + IP 레이트리밋(Redis, 1시간 5회). *Cloudflare Turnstile은 앱 환경 제약으로 제외.* - **모바일 웹 새로고침 시 로그아웃 버그 수정**: 세션 복원을 localStorage 우선으로(Preferences 예외에 견고). - **세션 유실(주기적 로그아웃) 해결**: Redis AOF 활성화로 재시작에도 세션 영속(서버 설정). ## 7. 웹 접근 정책 - **PC·모바일 웹은 안내 페이지만** 노출(앱 다운로드 안내). 실제 이용은 **앱(Capacitor)에서만**. 개발 모드(`npm run dev`)는 예외로 전체 앱 표시. --- # (이어진 작업) 앱 UX · 보안 · 품질 강화 ## 8. 앱 하단 내비게이션 - 화면 **하단 고정 아이콘 바**(뒤로 · 앞으로 · 홈 · 새로고침 · 설정). 스크롤과 무관하게 항상 노출, **안드로이드 소프트키 위** 안전영역에 배치. - 사이드바의 '홈' 메뉴 제거(하단 내비로 대체). 로그인 전에는 햄버거 메뉴·네이버 로그인 버튼 숨김. ## 9. 설정 / 계정정보 - **설정 화면**(하단 내비 → 설정): 계정정보 · 앱 버전(`v1.0.0`) · **App Data 삭제**(로그인/캐시 초기화 후 재시작). - **계정정보 상세 → 정보변경**: 비밀번호 재인증 후 **이름 · 이메일 · 비밀번호를 한 화면에서** 변경. 헤더의 비밀번호 변경 아이콘·모달은 제거(진입점 일원화). - **로그인 후 대시보드(`/`)로 이동** 통일. ## 10. 투자 매매내역 - 종목별 매매이력을 **인라인 최근 5건 + "전체 N건 보기" 스크롤 모달**로 정리(길어짐 방지). - **매매 수정 기능** 추가(`PUT /api/account/invest/trades/{id}`). 수정 시 시점별 시뮬레이션으로 **보유수량 음수 방지** 검증. ## 11. 보안 / 인증 (백엔드) - **세션 DB 이중 저장**(`auth_session`): Redis 유실·재시작에도 로그인 유지(Redis 미스 시 DB에서 복원·재수화). - **무차별 대입 방지**: 실패한 시도만 카운트 — 로그인 IP당 10회/10분, 비밀번호 재인증 회원당 5회/10분 초과 시 429. - **인터셉터 보호 경로 누락 수정**: `verify-password`·`profile`이 인증 없이 500 나던 문제 → 401 정상화. - **전역 예외 처리 강화**: 미처리 500 로그에 메서드+경로 기록(추적성), 잘못된 JSON은 400. ## 12. 품질 / 배포 파이프라인 - **자동화 테스트 도입**: 프론트 **Vitest 32**(스토어·API·로그인 플로우), 백엔드 **JUnit 34**(단위 + `@WebMvcTest` 통합). - **테스트 게이트**: CI와 **배포 워크플로 모두 테스트 실패 시 배포 중단**. 백엔드 배포에 CI와 동일한 MariaDB/Redis 서비스 추가. - 번들: 마크다운 에디터는 라우트 지연 청크임을 명시(경고 한도 현실화). ## 13. 안드로이드 - 에지투에지(`targetSdk 36`) 대응: **콘텐츠 루트에 시스템 바 인셋 패딩** 적용 → 헤더는 상태바 아래, 하단 내비는 소프트키 위. ## 14. PC 데스크톱 클라이언트 (Electron) - **Windows 설치형 `.exe`** — 번들 dist 대신 **라이브 사이트(app.sblog.kr) 직접 로드** → 프론트 변경이 **재설치 없이** 앱 재시작만으로 반영. 시작 시 `clearCache()`로 옛 HTML 캐시 방지. - 창 크기/위치/최대화 상태 **기억**(다음 실행 복원). 로그인 전 빈 사이드바 숨김(콘텐츠 중앙 정렬). - 웹 안내페이지에 **PC 버전 다운로드 링크**(`/download/SlimBudget-Setup.exe`). - ⚠️ 게시판 위지윅 에디터는 **Windows IME 첫 자음 중복**(tui.editor 업스트림 버그) — PC에선 감수(일반 입력칸은 정상). ## 15. 브랜드 앱 아이콘 - 기본 Capacitor 아이콘 → **브랜드(초록 #00bc7e + 흰 막대 차트) 적응형 아이콘**(전 해상도, `@capacitor/assets`). ## 16. 홈 캘린더 · 계좌 · 카드 - **홈 일별 캘린더**: 하단 인라인 패널 → **탭 시 팝업(모달)** 표시(시인성·단일 탭). - **계좌 이용내역 월별 표시**: 계좌 펼치면 `◀ YYYY.MM ▶` + 그 달 합계, 데이터 있는 달만 이동(긴 스크롤 해소). - **카드 알림 계좌 자동매칭 유연화**: 카드사 표기 차이 흡수(`KB/국민/국민카드/KB카드`, `농협/NH`, `비씨/BC`, `씨티/시티`) — 어떻게 등록해도 매칭. ## 17. 게시판 이미지 / 에디터 - **인라인 이미지 = base64 → 서버 업로드(DB 저장)**: `POST /api/board/images`(로그인) → `GET /api/images/{id}`(공개). **절대 URL** 반환(앱은 출처가 localhost 라 상대경로 불가). 업로드 전 1280px·JPEG 압축. - **에디터 이미지 버튼**: Toast UI 기본 팝업 제거 → 클릭 시 **바로 파일선택→업로드**(작은 댓글창에서 팝업 OK 잘림 회피). - **모바일 에디터 팝업(표·링크 등)**: 화면 **중앙 모달**로(Toast UI 의 `margin-left:-150px` 로 좌측 잘리던 문제 해결). --- ## 운영 반영 시 체크 - 서버 `/opt/sb-backend/.env` - `ACCOUNT_CRYPTO_KEY` — 계좌번호 암호화를 켤 때만(미설정 시 평문, 깨지지 않음). - `app_setting` · `auth_session` · `board_image` 테이블 — 배포 시 `member.sql`/`board.sql` 초기화로 자동 생성(가입 허용 / 세션 DB 백업 / 게시글 이미지). - Redis `appendonly yes` — 세션 영속(이미 적용). 단, 세션 DB 이중 저장으로 Redis 유실에도 로그인 유지. - 서버 `.env`/환경변수 `PUBLIC_URL`(기본 `https://app.sblog.kr`) — 업로드 이미지 절대 URL 베이스(앱에서 이미지 로드에 필요). - **nginx**(`deploy/nginx-sb-front.conf` 참고): `location /` 에 `Cache-Control no-cache`(진입 HTML 최신화), `location /download/` → `/var/www/sb-downloads`(설치파일, 배포에 안 지워지는 영속 경로). - 앱 버전 표기는 `package.json` 의 `version`(현재 `1.0.0`)을 단일 출처로 사용. - **PC 설치파일**: `npm run electron:build` → `release-desktop/SlimBudget-Setup.exe`(서명 없음, SmartScreen 경고 정상). - 배포는 `main` 푸시 → CI·Deploy 워크플로 모두 **테스트 통과해야 진행**(Gitea Actions).