Skip to content

dev에서 main 브랜치로 이관 - #184

Merged
rlatjddms merged 107 commits into
mainfrom
dev
Sep 8, 2026
Merged

rlatjddms merged 107 commits into
mainfrom
dev

Conversation

@chaewoo-kim

Copy link
Copy Markdown
Contributor

dev 브랜치에서 main 브랜치로 이관 처리

rlatjddms and others added 30 commits May 30, 2026 18:35
[feat] #45 공동구매 entity, enum 구현
[feat] #11 일반 회원가입 및 로그인 기능 구현
* [feat] #48 공동구매 controller, repository, service구현
* [feat] #21 Board entity 구현

* [docs] #21 SwaggerConfig 수정

* [feat] #21 도메인별 ErrorCode 분리 인프라 구축

* [feat] #21 게시판 CRUD API 구현

* [test] #21 BoardService 테스트 코드 작성

* [chore] JaCoCo 커버리지 게이트 도입
검색에 기본값 설정
토큰 발급에 userId 포함되도록 수정
관리자 삭제 기능 구현
관리자 삭제 기능 경로 설정
관리자 삭제 기능 구현
관리자 권한 게시물 삭제 테스트 코드 작성
comment API 추가
comment CRUD 구현
comment CRUD 테스트 코드 작성
userId 포함되도록 수정
관리자 삭제 기능 구현
관리자 삭제 기능 구현
- 소셜 로그인 및 자동 회원가입 API 구현
- 동일 이메일 가입 시 기존 로컬 계정과의 연동 구현
- 예외 처리 및 테스트 코드 작성
공동구매 전체 조회 기능 구현
rlatjddms and others added 28 commits July 21, 2026 11:40
* [fix] #128 prefilght 요청 허용

* [fix] #128 로컬 환경 secret 파일 경로 설정 추가

* [test] #128 테스트를 위한 빌드 브랜치 변경

* [refactor] #128 백엔드를 도커에 추가

* [refactor] #128 elasticsearch 메모리 낮추기

* [fix] #128 depends_on 조건 완화

* [fix] #128 Dockerfile 수정

* [fix] #128 strip_components 제거

* [fix] #128 도커 이미지 이름 오류 수정

* [fix] #128 도커 이미지 이름 오류 수정

* [fix] #128 elasticsearch 환경변수 추가

* [fix] #128 deploy 브랜치 dev로 변경
* [feat] #130 서버에 nginx 컨테이너 추가 및 설정 파일 작성

* [feat] #130 https 적용

* [feat] #130 deploy 코드에 nginx.conf 추가

* [feat] #130 cors에 프론트엔드 주소 추가

* [feat] #130 프록시 신뢰 설정 추가

* [refactor] #130 환경에 따라 리다이렉트 주소 동적으로 바꾸기

* [fix] #130 deploy 브랜치 dev로 변경

* [refactor] #130 커넥션 및 톰캣 스레드 제한

* [refactor] #130 도커 메모리 제한 설정 및 es 리포지토리 스캔 범위 최적화

* [refactor] #130 도커 메모리 제한 설정 해제
* [fix] #133 회원가입/프로필 저장 시 서버 사이드 지오코딩 처리 및 위치 상태 코드 정합화
* [docs] claude.md 후속 작업 우선순위 및 배포 전 보안 감사 항목 정리
* [fix] #133 workflow 수정
* [feat] #130 fcm 토큰 삭제 api 추가

* [feat] #130 배포 시 fcm 시크릿 json 파일 생성

* [fix] #130 탈퇴 후 간편로그인 재가입 문제 해결

* [fix] #130 탈퇴 시 관심 카테고리 전부 삭제

* [fix] #130 탈퇴 시 알림 내역 및 설정 초기화

* [fix] #130 비밀번호 설정 문구 수정

* [refactor] #130 구글smtp 메일에서 resend로 변경

* [fix] #130 이메일 전송 시 이름 MODI로 수정

* [test] #130 빌드 테스트

* [test] #130 테스트 후 dev 브랜치로 변경
* [feat] #65 공동구매 어드민 분리 및 에러 수정
* feat: Admin user automatic redirect to Admin Frontend
* [perf] #139 es VM 분리 및 prod/local docker-compose 정리

* [perf] #139 연속 push 문제 해결 및 dns 주기적으로 다시 조회

* [perf] #139 런타임 개선을 위한 prod 파일 추가 및 스레드풀 설정

* [perf] #139 대시보드 Redis 캐시와 Hikari 커넥션 풀 적용

* [fix] #139 캐시 직렬화 방식 수정

* [fix] #139 거래내역 내보내기 최대 기간 설정 및 템플릿 변경

* [fix] #139 삭제된 계좌는 스냅샷으로 가져오도록 수정

* [fix] #139 dev 브랜치로 변경
* chore: Remove unused frontend folder from Backend
* [feat] #143 어드민 공동구매 오류수정 및 기능추가
* [fix] 예산 비교 사용자 집합을 종합 비교와 일치하도록 수정

종합 비교에는 나오지만 예산 비교에는 안 보이던 공개 사용자 노출.
Budget 레코드 유무와 무관하게, 해당 월에 수입/지출/예산 활동이 하나라도 있는
공개 사용자를 포함하도록 findPublicMonthlyTotals 재작성 (예산 없으면 0원).
PublicBudgetFilterRequest 를 단일 year/month 로 정리하고 관련 테스트 갱신.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* [fix] #140 게시판 관련 오류 수정

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* [fix] #145 배포 환경에서의 알림 오류 수정

* [test] #145 배포 브랜치 변경 후 테스트

* [fix] #145 디스코드 알림 전송 시 제목만 가져오기

* [refactor] #145 JwtFilter의 인증 성공 로그 디버그로 변경
* [fix] 예산 비교 사용자 집합을 종합 비교와 일치하도록 수정

종합 비교에는 나오지만 예산 비교에는 안 보이던 공개 사용자 노출.
Budget 레코드 유무와 무관하게, 해당 월에 수입/지출/예산 활동이 하나라도 있는
공개 사용자를 포함하도록 findPublicMonthlyTotals 재작성 (예산 없으면 0원).
PublicBudgetFilterRequest 를 단일 year/month 로 정리하고 관련 테스트 갱신.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* [fix] #140 게시판 관련 오류 수정

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* [feat] #149 최근 예산 불러오기 기능 추가

* [feat] #149 카테고리 삭제 시 스냅샷 저장

* [feat] #149 월별 예산에 고정 지출 자동 반영

* [feat] #149 간편로그인 직후 프로필 완성 추가
* [feat] #150 게시판 내 글 조회 mine 필터 추가
* [chore] #152 CORS 허용 origin에 Capacitor 앱 추가
로그인 성공 후 redirect_uri 쿠키값을 무검증으로 사용해 임의 URI 로 토큰을
전송할 수 있던 open redirect 취약점 보완. OAuth2RedirectUriValidator 로
화이트리스트 정확 일치 검증, 미등록 값은 기본 URI 로 fallback + WARN 로그.

- OAuth2RedirectUriValidator 및 단위 테스트 신설 (4 케이스)
- application.yml 에 authorized-redirect-uris 목록 (web/admin/prod/native)
- OAuth2SuccessHandler 가 validator 경유하도록 변경

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…으로 복원 (#160)

이전 세션의 리팩터(AuthService.issueTokens 도입) 는 별도 브랜치로 원복됐는데
OAuth2SuccessHandler 만 그 호출 흔적을 유지하고 있어 빌드가 깨졌음.
기존 HEAD 패턴대로 jwtTokenProvider.createAccessToken/createRefreshToken +
refreshTokenRepository.save 직접 호출로 복원.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* [perf] ACC-161 DB 조회 성능 개선 및 JDBC batch 활성화

Board/Comment 사용자 기반 조회와 벌크 update 성능을 개선하고
Testcontainers 기반 벤치마크로 정량 검증.

- Board `idx_board_user_type (user_id, type)` 복합 인덱스 추가
- Comment `idx_comment_user (user_id, created_at)` 복합 인덱스 추가
  → ORDER BY created_at DESC 를 인덱스로 흡수해 filesort 제거
- Hibernate JDBC batch 활성화 (batch_size=20, order_inserts/updates,
  batch_versioned_data, default_batch_fetch_size=100)
- prod 배포용 마이그레이션 SQL 스냅샷 추가
  (docs/db/migration/2026-08-05_add_user_indexes.sql)

측정 결과 (Testcontainers MySQL 8, Board 10k / Comment 100k):
- Board findByUserIdAndType: 3.54 → 1.57 ms (-55.5%)
- Comment findByUserId ORDER BY created_at DESC LIMIT 20:
  22.01 → 0.65 ms (-97.1%)
- Comment 200건 bulk update:
  SQL 4020 → 40 (-99.0%), wall clock 37.58 → 27.77 ms (-26.1%)

벤치마크 인프라:
- src/test/java/.../benchmark/DbIoBenchmark.java (Testcontainers, @tag "benchmark")
- scripts/run-bench.sh (2-pass 실행 스크립트)
- docs/benchmark/results/2026-08-05_db_io.csv (원본 데이터)
- Testcontainers 1.20.4 로 upgrade (Docker Engine 29 호환)

사전 존재하던 grouppruchase 테스트 4파일 컴파일 오류로 임시 exclude 처리
(별도 이슈에서 수정 필요).

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>

* [perf] ACC-161 Notification/UserDevice/Account DB I/O 개선 및 FCM 토큰 검증

전 도메인 감사에서 도출된 High 3종을 병렬 적용하고 Testcontainers 벤치마크로
정량 검증. 계정 삭제 시 알림 벌크 UPDATE 압축, 알림/디바이스/계좌 조회 인덱스
부착, FCM 토큰 등록 시 형식 검증 추가.

- Notification bulk soft-delete: findAll+deleteAll 루프 → 단일 UPDATE
  (@SQLDelete 정합성 유지 위해 UPDATE deleted_at 로 구현)
- Notification `idx_notification_user (user_id)` 인덱스 추가
- UserDevice `idx_userdevice_user (user_id)` 인덱스 추가
  + `findByUser(User)` → `findByUserId(Long)` 로 전환
- Account `idx_account_user (user_id)`, `idx_account_user_name` 복합 인덱스 추가
- UserDeviceService.registerToken 에 FCM 토큰 형식 검증 추가
  (길이 100~250, 정규식 ^[A-Za-z0-9_:\-]+$). S4 요금폭탄 완화.
- INVALID_FCM_TOKEN 에러 코드 신설
- prod 배포용 마이그레이션 SQL 추가
  (docs/db/migration/2026-08-05_add_account_notification_indexes.sql)

측정 결과 (Testcontainers MySQL 8, 3회 반복 평균):
- H1 Notification bulk soft-delete:
  wall clock 23.57 → 5.67 ms (-75.9%), SQL 2010 → 10 (-99.5%)
- H2 Notification 조회 (20k rows): 12.22 → 1.72 ms (-85.9%)
- H2 UserDevice 조회 (10k rows, hot path): 1.56 → 0.70 ms (-55.2%)
- H3 Account 조회 (3k rows): 1.16 → 0.68 ms (-41.5%)

벤치마크 인프라 확장:
- DbIoBenchmark 에 R3/R4/R5/U2 시나리오 및 시드 4종 추가
- docs/benchmark/results/2026-08-05_db_io.csv 에 append
- 재현: ./gradlew bench -Dbench.run.scenarios=R3,R4,R5,U2

전 도메인 감사 리포트 claude.md 에 신설 (D1~D10, 공통 안티패턴, Medium 백로그).

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* [perf] #164 인증 메일 요청 횟수 제한

* [perf] #164 S3 업로드 크기·타입 제한하여 초과 용량 거부

* [perf] #164 도커 로그 제한

* [perf] #164 카카오 지오코딩 결과 Redis 캐시
전 도메인 감사에서 도출된 Medium 백로그 6건을 A/B/C 배치로 진행.
실 코드 재확인으로 D5/D7 은 오탐으로 판정하고 취소, 실효 4건 처리.

**A. 인덱스 확장 (D4, D9)**
- GroupPurchase `idx_gp_status_category_deadline (status, category_id, deadline)`
  → findActiveGroupPurchases 의 filter + ORDER BY deadline 을 인덱스로 흡수
  → filesort 제거
- TransactionCategory `idx_txcategory_user_name_type (user_id, name, type)`
  → existsByUserIdAndNameAndType 등 카테고리 CRUD 중복 검증에 covering index

**B. 벌크 소프트 삭제 통일 (D8)**
- InterestCategoryRepository.softDeleteByUserId (@Modifying UPDATE)
- FixedTransactionRepository.softDeleteByAccountId / softDeleteByTransactionCategoryId
- InterestCategoryService / AccountService / CategoryService 의
  `findAll + forEach delete` 3곳을 단일 UPDATE 로 치환
- FixedTransaction 인덱스 추가: idx_fixed_transaction_account,
  idx_fixed_transaction_category (bulk UPDATE WHERE 조건 커버)
- InterestCategory 인덱스 추가: idx_interest_user

**C. 정확성 수정 (D6)**
- BudgetService.copyPlan 에서 카테고리 삭제된 예산의
  transactionCategory NPE 위험 → resolveCategoryId 헬퍼 재사용 (snapshot fallback)

**취소 (오탐)**
- D5 Budget @SQLRestriction 부재: 이미 존재. native workaround 는
  restore-on-recreate 흐름용 (버그 아님).
- D7 Compare 캐시 evict 누락: 30분 TTL 은 warm-up 스케줄과 정합된
  의도적 설계. 개별 write allEntries evict 시 cross-user warm hit 파괴.

측정 결과 (Testcontainers MySQL 8):
- D4 GroupPurchase filter+sort (10k): 4.66 → 1.61 ms (-65.4%), filesort 제거
- D9 TransactionCategory exists (2k): rows 검사 2000 → 1 (-99.95%), covering
- D8-1 InterestCategory bulk soft-delete (100건):
  18.42 → 6.73 ms (-63.5%), SQL 1010 → 10 (-99.0%)
- D8-2 FixedTx bulk soft-delete (100건):
  16.18 → 5.09 ms (-68.6%), SQL 1010 → 10 (-99.0%)

prod 마이그레이션 SQL:
- docs/db/migration/2026-08-05_add_grouppurchase_txcategory_indexes.sql
- docs/db/migration/2026-08-05_add_interest_fixed_indexes.sql

벤치마크 인프라:
- DbIoBenchmark 에 R6/R7/U3/U4 시나리오 및 seed 4종 (GroupPurchase 10k,
  TransactionCategory 2k, InterestCategory 6k, FixedTransaction 6k) 추가
- CSV append: docs/benchmark/results/2026-08-05_db_io.csv

claude.md 감사 리포트 갱신 (D5/D7 오탐 사유 명시).

BudgetServiceTest 3건 사전 존재 실패는 이번 변경과 무관 (별도 이슈 필요).

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* [fix] #167 cors allowed-origins 바인딩 오류 해결

* [feat] #167 고정 거래에 이체 항목 추가

* [feat] #167 고정 거래에 이체 항목 추가

* [feat] #167 현재 계좌 잔액 변경 가능하게 수정

* [feat] #167 신용카드, 대출을 추가한 자산 관리 기능 고도화

* [feat] #167 고정 거래 작동 실패 시에 알림 발생, 재시도 여부 선택

* [perf] #167 S3는 OAC로만 조회되게 수정
* [feat] #162 백엔드 CORS, JWT 토큰 전달 및 저장 방식 보안 기능 구현

* [pref] #162 CSRF (크로스 사이트 요청 위조) 방어 부재 보안,
Admin 리다이렉트 URL 하드코딩 보안
* [feat] #174 공동구매 결제, 한도초과, 모집 기능 구현

* [feat] #174 공동구매 거래내역(카테고리) 기능 구현

* [feat] #174 공동구매 수령장소, 계좌 예산 복구, 거래내역 기능 추가

* [feat] #174 공동구매 기능 개선
* [fix] #177 앱 소셜 로그인 redirect 처리 수정

* [fix] #177 소셜 로그인 redirect 웹/앱 동시 지원
…emplate (#180)

**Profile 분리 (P0-1)**
- application.yml 을 공통 설정만 남기고 profile-specific 값 분리
  - `spring.profiles.active: ${SPRING_PROFILES_ACTIVE:local}` 명시 (default=local)
  - 제거: ddl-auto, show-sql, format_sql, hikari pool size, CORS 목록, mail.dev-log-code
- application-local.yml (신규)
  - ddl-auto: update / show-sql: true / hikari 5
  - CORS: localhost:5173/5174/capacitor + http://localhost
  - dev-log-code: true
- application-prod.yml
  - dev-log-code: false 추가 (기존 validate/pool 20/prod CORS 유지)
- docker-compose.local.yml: SPRING_PROFILES_ACTIVE=local 명시 (default 의존 해소)

**Secret 온보딩 (A안, P3-4 부분)**
- application-secret.yml.example 커밋 (placeholder 값)
- 신규 개발자: 파일 복사 후 실제 값 채우기
- application-secret.yml 자체는 이미 .gitignore 등록되어 있음 (커밋 이력 없음 확인)

**추가 발견 (P0-9 신규 등록)**
- SecurityConfig CORS 바인딩 pre-existing 버그로 로컬 부팅 지속 실패
  - 도입 커밋 f9edfe3 (#162, 2026-08-06) 이후 재현
  - 프로파일 분리 검증 중 발견. 별도 이슈로 해결 예정
  - CLAUDE.md P0-9 항목에 원인/완화 방안 기록

**검증 상태**
- Profile 분리 자체는 파일 매핑 / config loading 순서 확인 완료
- prod validate 검증은 P0-9 해결 후 재수행 필요

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* [perf] #181 DB/Redis 외부 노출 차단

* [perf] #181 인증번호 5회 실패 시 재발급 유도 + SecureRandom 적용

* [perf] #181 프로덕션 Swagger 비활성화

* [perf] #181 OAuth Access Token URL 노출 제거

* [fix] #181 에산 관리 대시보드 반영 문제 해결
@rlatjddms
rlatjddms merged commit 4035814 into main Sep 8, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants