Skip to content

feat: cache key 생성 일관성을 위한 cache 빌더 구현#112

Merged
dev-ant merged 17 commits intodevfrom
feat/cache-key-builder
Mar 5, 2026
Merged

feat: cache key 생성 일관성을 위한 cache 빌더 구현#112
dev-ant merged 17 commits intodevfrom
feat/cache-key-builder

Conversation

@dev-ant
Copy link
Copy Markdown
Contributor

@dev-ant dev-ant commented Mar 5, 2026

📋 상세 설명

  • CacheKeyBuilder 도입 및 통계/랭킹/마스터데이터/경매 검색 캐시 키 SpEL을 빌더 기반으로 통일
  • 애플리케이션 시작 시 캐시 워밍업 러너 추가 및 Redis cache error handler 로깅 정교화
  • 경매 히스토리 기본 기간 설정(최근 1개월) 및 실시간 경매 만료일 범위 검색 조건 추가

📊 체크리스트

  • PR 제목이 형식에 맞나요 e.g. feat: PR을 등록한다
  • 코드가 테스트 되었나요 테스트 코드 미작성
  • 문서는 업데이트 되었나요
  • 불필요한 코드를 제거했나요
  • 이슈와 라벨이 등록되었나요 이슈 미등록

@dev-ant dev-ant requested a review from Copilot March 5, 2026 03:42
@dev-ant dev-ant self-assigned this Mar 5, 2026
@dev-ant dev-ant added the ✨feature 새로운 기능 추가 label Mar 5, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 5, 2026

✅ 테스트 결과 for PR

Build: success

🧪 테스트 실행 with Gradle
📈 Coverage: -0.00%

📁 테스트 결과
📁 커버리지 보고서 (HTML)

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

캐시 키 생성 규칙을 중앙화(CacheKeyBuilder)하고, 여러 @Cacheable 지점에 적용해 캐시 키 일관성을 높이며, 애플리케이션 시작 시 캐시 워밍업/Redis 오류 로깅 개선/검색 조건 보강(경매 날짜 조건 등)을 함께 반영하는 PR입니다.

Changes:

  • CacheKeyBuilder 도입 및 통계/랭킹/마스터데이터/경매 검색 캐시 키 SpEL을 빌더 기반으로 통일
  • 애플리케이션 시작 시 캐시 워밍업 러너 추가 및 Redis cache error handler 로깅 정교화
  • 경매 히스토리 기본 기간 설정(최근 1개월) 및 실시간 경매 만료일 범위 검색 조건 추가

Reviewed changes

Copilot reviewed 184 out of 184 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
src/test/java/until/the/eternity/metalwareinfo/application/service/MetalwareInfoServiceTest.java 테스트 import 정리
src/test/java/until/the/eternity/iteminfo/application/service/ItemInfoServiceTest.java 테스트 import 정리
src/test/java/until/the/eternity/common/util/SegongOptionParserTest.java 테스트 import 정리
src/test/java/until/the/eternity/auctionsearchoption/application/service/AuctionSearchOptionServiceTest.java 테스트 import 정리
src/test/java/until/the/eternity/auctionrealtime/application/service/fetcher/AuctionRealtimeFetcherTest.java 테스트 import 정리
src/test/java/until/the/eternity/auctionrealtime/application/service/AuctionRealtimeServiceTest.java AuctionRealtimeService 단위 테스트 추가
src/test/java/until/the/eternity/auctionhistory/domain/service/AuctionHistoryDuplicateCheckerTest.java 테스트 import 정리
src/test/java/until/the/eternity/auctionhistory/application/service/persister/AuctionHistoryPersisterTest.java 테스트 import 정리
src/test/java/until/the/eternity/auctionhistory/application/service/fetcher/AuctionHistoryFetcherTest.java 테스트 import 정리
src/test/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryServiceTest.java 테스트 import 정리
src/main/resources/application.yml Redis health 설정/로그 레벨/캐시 warmup 설정 및 p6spy 로깅 변경
src/main/java/until/the/eternity/statistics/repository/weekly/TopCategoryWeeklyStatisticsRepository.java import 정리
src/main/java/until/the/eternity/statistics/repository/weekly/SubcategoryWeeklyStatisticsRepository.java import 정리
src/main/java/until/the/eternity/statistics/repository/weekly/ItemWeeklyStatisticsRepository.java import 정리
src/main/java/until/the/eternity/statistics/repository/daily/TopCategoryDailyStatisticsRepository.java import 정리
src/main/java/until/the/eternity/statistics/repository/daily/SubcategoryDailyStatisticsRepository.java import 정리
src/main/java/until/the/eternity/statistics/repository/daily/ItemDailyStatisticsRepository.java import 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/TopCategoryWeeklyStatisticsResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/TopCategoryDailyStatisticsResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/SubcategoryWeeklyStatisticsResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/SubcategoryDailyStatisticsResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/ItemWeeklyStatisticsResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/ItemDailyStatisticsResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/request/TopCategoryWeeklyStatisticsSearchRequest.java import 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/request/TopCategoryDailyStatisticsSearchRequest.java import 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/request/SubcategoryWeeklyStatisticsSearchRequest.java import 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/request/SubcategoryDailyStatisticsSearchRequest.java import 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/request/ItemWeeklyStatisticsSearchRequest.java import 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/request/ItemDailyStatisticsSearchRequest.java import 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/request/DailyStatisticsSearchRequest.java import 정리
src/main/java/until/the/eternity/statistics/domain/entity/weekly/TopCategoryWeeklyStatistics.java import 순서 정리
src/main/java/until/the/eternity/statistics/domain/entity/weekly/SubcategoryWeeklyStatistics.java import 순서 정리
src/main/java/until/the/eternity/statistics/domain/entity/weekly/ItemWeeklyStatistics.java import 순서 정리
src/main/java/until/the/eternity/statistics/domain/entity/daily/TopCategoryDailyStatistics.java import 순서 정리
src/main/java/until/the/eternity/statistics/domain/entity/daily/SubcategoryDailyStatistics.java import 순서 정리
src/main/java/until/the/eternity/statistics/domain/entity/daily/ItemDailyStatistics.java import 순서 정리
src/main/java/until/the/eternity/statistics/application/service/TopCategoryWeeklyStatisticsService.java 캐시 키를 CacheKeyBuilder로 통일
src/main/java/until/the/eternity/statistics/application/service/TopCategoryDailyStatisticsService.java 캐시 키를 CacheKeyBuilder로 통일
src/main/java/until/the/eternity/statistics/application/service/SubcategoryWeeklyStatisticsService.java 캐시 키를 CacheKeyBuilder로 통일
src/main/java/until/the/eternity/statistics/application/service/SubcategoryDailyStatisticsService.java 캐시 키를 CacheKeyBuilder로 통일
src/main/java/until/the/eternity/statistics/application/service/ItemWeeklyStatisticsService.java 캐시 키를 CacheKeyBuilder로 통일
src/main/java/until/the/eternity/statistics/application/service/ItemDailyStatisticsService.java 캐시 키를 CacheKeyBuilder로 통일
src/main/java/until/the/eternity/ranking/repository/RankingRepository.java import 정리
src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/VolumeRankingResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/VolumeChangeRankingResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/PriceRankingResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/PriceChangeRankingResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/AllTimeRankingResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/ranking/interfaces/rest/controller/VolumeRankingController.java import 정리
src/main/java/until/the/eternity/ranking/interfaces/rest/controller/PriceRankingController.java import 정리
src/main/java/until/the/eternity/ranking/interfaces/rest/controller/PriceChangeRankingController.java import 정리
src/main/java/until/the/eternity/ranking/interfaces/rest/controller/CategoryRankingController.java import 정리
src/main/java/until/the/eternity/ranking/interfaces/rest/controller/AllTimeRankingController.java import 정리
src/main/java/until/the/eternity/ranking/domain/mapper/RankingMapper.java import 순서 정리
src/main/java/until/the/eternity/ranking/application/service/VolumeRankingService.java 캐시 키를 CacheKeyBuilder(byLimit)로 통일
src/main/java/until/the/eternity/ranking/application/service/PriceRankingService.java 캐시 키를 CacheKeyBuilder(byLimit)로 통일
src/main/java/until/the/eternity/ranking/application/service/PriceChangeRankingService.java 캐시 키를 CacheKeyBuilder(byLimit)로 통일
src/main/java/until/the/eternity/ranking/application/service/CategoryRankingService.java 카테고리 랭킹 캐시 키를 CacheKeyBuilder로 통일
src/main/java/until/the/eternity/ranking/application/service/AllTimeRankingService.java 캐시 키를 CacheKeyBuilder(byLimit)로 통일
src/main/java/until/the/eternity/metalwareinfo/interfaces/rest/dto/response/MetalwareInfoResponse.java import 순서 정리
src/main/java/until/the/eternity/metalwareinfo/interfaces/rest/controller/MetalwareInfoController.java import 정리
src/main/java/until/the/eternity/metalwareinfo/infrastructure/persistence/MetalwareInfoRepositoryPortImpl.java import 정리
src/main/java/until/the/eternity/metalwareinfo/infrastructure/persistence/MetalwareInfoJpaRepository.java import 정리
src/main/java/until/the/eternity/metalwareinfo/application/service/MetalwareInfoService.java 캐시 키를 CacheKeyBuilder(all)로 통일
src/main/java/until/the/eternity/metalwareinfo/application/service/MetalwareAttributeInfoService.java 캐시 키를 CacheKeyBuilder로 통일
src/main/java/until/the/eternity/itemoptioninfo/interfaces/rest/controller/ItemOptionInfoController.java import 정리
src/main/java/until/the/eternity/itemoptioninfo/infrastructure/persistence/ItemOptionInfoRepositoryPortImpl.java import 정리
src/main/java/until/the/eternity/itemoptioninfo/domain/repository/ItemOptionInfoRepositoryPort.java import 정리
src/main/java/until/the/eternity/itemoptioninfo/domain/entity/ItemOptionInfoId.java import 정리
src/main/java/until/the/eternity/itemoptioninfo/application/service/ItemOptionInfoService.java import 정리
src/main/java/until/the/eternity/iteminfo/interfaces/rest/dto/response/ItemInfoSyncResponse.java import 정리
src/main/java/until/the/eternity/iteminfo/interfaces/rest/dto/response/ItemInfoSummaryResponse.java import 정리
src/main/java/until/the/eternity/iteminfo/interfaces/rest/dto/response/ItemInfoResponse.java import 정리
src/main/java/until/the/eternity/iteminfo/interfaces/rest/dto/response/ItemCategoryResponse.java import 정리
src/main/java/until/the/eternity/iteminfo/interfaces/rest/controller/ItemInfoController.java import 정리
src/main/java/until/the/eternity/iteminfo/infrastructure/persistence/ItemInfoRepositoryPortImpl.java import 정리
src/main/java/until/the/eternity/iteminfo/infrastructure/persistence/ItemInfoQueryDslRepository.java import 정리
src/main/java/until/the/eternity/iteminfo/infrastructure/persistence/ItemInfoJpaRepository.java import 정리
src/main/java/until/the/eternity/iteminfo/domain/repository/ItemInfoRepositoryPort.java import 정리
src/main/java/until/the/eternity/iteminfo/domain/exception/ItemInfoExceptionCode.java static import 정리
src/main/java/until/the/eternity/iteminfo/domain/entity/ItemInfoId.java import 정리
src/main/java/until/the/eternity/iteminfo/application/service/ItemInfoService.java 캐시 키를 CacheKeyBuilder로 통일(ALL/byText/detail/summary)
src/main/java/until/the/eternity/hornBugle/kafka/application/HornBugleKafkaProducerService.java import 정리
src/main/java/until/the/eternity/hornBugle/interfaces/rest/dto/response/HornBugleHistoryResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/hornBugle/interfaces/external/dto/OpenApiHornBugleHistoryResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/hornBugle/interfaces/external/dto/OpenApiHornBugleHistoryListResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/hornBugle/infrastructure/persistence/HornBugleRepositoryPortImpl.java import 정리
src/main/java/until/the/eternity/hornBugle/infrastructure/persistence/HornBugleJpaRepository.java import 정리
src/main/java/until/the/eternity/hornBugle/infrastructure/elasticsearch/HornBugleIndexService.java import 정리
src/main/java/until/the/eternity/hornBugle/infrastructure/elasticsearch/HornBugleDocument.java import 정리
src/main/java/until/the/eternity/hornBugle/domain/service/HornBugleDuplicateChecker.java import 정리
src/main/java/until/the/eternity/hornBugle/domain/repository/HornBugleRepositoryPort.java import 정리
src/main/java/until/the/eternity/hornBugle/domain/mapper/HornBugleMapper.java import 정리
src/main/java/until/the/eternity/hornBugle/domain/enums/HornBugleServer.java import 순서 정리
src/main/java/until/the/eternity/hornBugle/domain/entity/HornBugleWorldHistory.java import 정리
src/main/java/until/the/eternity/hornBugle/application/service/HornBugleService.java import 정리
src/main/java/until/the/eternity/hornBugle/application/scheduler/HornBugleScheduler.java import 정리
src/main/java/until/the/eternity/hornBugle/application/runner/HornBugleIndexRunner.java import 정리
src/main/java/until/the/eternity/enchantinfo/interfaces/rest/controller/EnchantInfoController.java import 정리 및 wildcard import 적용
src/main/java/until/the/eternity/enchantinfo/infrastructure/persistence/EnchantInfoRepositoryPortImpl.java import 정리
src/main/java/until/the/eternity/enchantinfo/infrastructure/persistence/EnchantInfoJpaRepository.java import 정리
src/main/java/until/the/eternity/enchantinfo/infrastructure/persistence/EnchantInfoEntity.java JPA import wildcard로 정리
src/main/java/until/the/eternity/enchantinfo/domain/repository/EnchantInfoRepositoryPort.java import 정리
src/main/java/until/the/eternity/enchantinfo/domain/exception/EnchantInfoExceptionCode.java static import 정리
src/main/java/until/the/eternity/enchantinfo/application/service/EnchantInfoService.java 캐시 키를 CacheKeyBuilder로 통일
src/main/java/until/the/eternity/config/openapi/OpenApiWebClientProperties.java import 정리
src/main/java/until/the/eternity/config/openapi/OpenApiRetryPolicy.java import 정리
src/main/java/until/the/eternity/config/openapi/OpenApiFilters.java import 정리
src/main/java/until/the/eternity/config/RedisConfig.java import 정리
src/main/java/until/the/eternity/config/RedisCacheErrorHandler.java Redis cache 오류 로깅/분류 로직 개선
src/main/java/until/the/eternity/config/CacheStartupWarmupRunner.java 앱 시작 시 캐시 warmup 추가
src/main/java/until/the/eternity/common/util/SegongOptionParser.java import 정리
src/main/java/until/the/eternity/common/util/CacheKeyBuilder.java 캐시 키 생성 유틸 추가(핵심 변경)
src/main/java/until/the/eternity/common/response/PageResponseDto.java import 구분(개행) 정리
src/main/java/until/the/eternity/common/response/ApiResponse.java import 정리
src/main/java/until/the/eternity/common/filter/GatewayAuthFilter.java import 정리
src/main/java/until/the/eternity/common/exception/GlobalExceptionHandler.java static import 정리
src/main/java/until/the/eternity/common/exception/GlobalExceptionCode.java static import 정리
src/main/java/until/the/eternity/common/enums/UserRole.java import 순서 정리
src/main/java/until/the/eternity/common/enums/SortField.java import 구분(개행) 정리
src/main/java/until/the/eternity/common/enums/SortDirection.java import 정리
src/main/java/until/the/eternity/common/enums/ItemCategory.java import 순서 정리
src/main/java/until/the/eternity/common/aspect/BatchExecutionLoggingAspect.java import 정리
src/main/java/until/the/eternity/common/annotation/MetalwareParameters.java import 구분(개행) 정리
src/main/java/until/the/eternity/common/annotation/BatchLog.java import 정리
src/main/java/until/the/eternity/batchlog/interfaces/rest/dto/response/BatchExecutionLogResponse.java import 정리
src/main/java/until/the/eternity/batchlog/interfaces/rest/controller/BatchExecutionLogController.java import 정리
src/main/java/until/the/eternity/batchlog/infrastructure/persistence/BatchExecutionLogRepositoryPortImpl.java import 정리
src/main/java/until/the/eternity/batchlog/infrastructure/persistence/BatchExecutionLogJpaRepository.java import 정리
src/main/java/until/the/eternity/batchlog/domain/repository/BatchExecutionLogRepositoryPort.java import 정리
src/main/java/until/the/eternity/batchlog/domain/entity/BatchExecutionLog.java import 정리
src/main/java/until/the/eternity/batchlog/application/service/BatchExecutionLogService.java import 정리
src/main/java/until/the/eternity/auctionsearchoption/interfaces/rest/dto/response/SearchOptionMetadataResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/auctionsearchoption/interfaces/rest/dto/response/FieldMetadata.java import 구분(개행) 정리
src/main/java/until/the/eternity/auctionsearchoption/interfaces/rest/AuctionSearchOptionController.java import 정리
src/main/java/until/the/eternity/auctionsearchoption/infrastructure/persistence/AuctionSearchOptionRepositoryPortImpl.java import 정리
src/main/java/until/the/eternity/auctionsearchoption/infrastructure/persistence/AuctionSearchOptionJpaRepository.java import 정리
src/main/java/until/the/eternity/auctionsearchoption/domain/repository/AuctionSearchOptionRepositoryPort.java import 정리
src/main/java/until/the/eternity/auctionsearchoption/domain/entity/AuctionSearchOptionMetadata.java import 정리
src/main/java/until/the/eternity/auctionsearchoption/application/service/AuctionSearchOptionService.java 캐시 키를 CacheKeyBuilder(all)로 통일
src/main/java/until/the/eternity/auctionrealtime/interfaces/rest/dto/response/AuctionRealtimeDetailResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/auctionrealtime/interfaces/rest/dto/request/RealtimeSortField.java import 구분(개행) 정리
src/main/java/until/the/eternity/auctionrealtime/interfaces/rest/dto/request/DateAuctionExpireRequest.java 만료일 범위 요청 DTO 추가
src/main/java/until/the/eternity/auctionrealtime/interfaces/rest/dto/request/AuctionRealtimeSearchRequest.java 만료일 조건 필드 추가
src/main/java/until/the/eternity/auctionrealtime/interfaces/external/dto/OpenApiAuctionRealtimeResponse.java import 정리
src/main/java/until/the/eternity/auctionrealtime/interfaces/external/dto/OpenApiAuctionRealtimeListResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/auctionrealtime/infrastructure/persistence/AuctionRealtimeQueryDslRepository.java 기본/고급 필터 분리 및 만료일 범위 조건 반영
src/main/java/until/the/eternity/auctionrealtime/infrastructure/persistence/AuctionRealtimeItemRepositoryPortImpl.java import 정리
src/main/java/until/the/eternity/auctionrealtime/infrastructure/persistence/AuctionRealtimeItemRepository.java import 정리
src/main/java/until/the/eternity/auctionrealtime/domain/service/persister/AuctionRealtimePersisterPort.java import 정리
src/main/java/until/the/eternity/auctionrealtime/domain/service/fetcher/AuctionRealtimeFetcherPort.java import 정리
src/main/java/until/the/eternity/auctionrealtime/domain/repository/AuctionRealtimeItemRepositoryPort.java import 정리
src/main/java/until/the/eternity/auctionrealtime/domain/mapper/OpenApiAuctionRealtimeMapper.java import 정리
src/main/java/until/the/eternity/auctionrealtime/domain/mapper/AuctionRealtimeMapper.java import 정리
src/main/java/until/the/eternity/auctionrealtime/application/service/persister/AuctionRealtimePersister.java import 정리
src/main/java/until/the/eternity/auctionrealtime/application/service/fetcher/AuctionRealtimeFetcher.java import 정리
src/main/java/until/the/eternity/auctionrealtime/application/service/AuctionRealtimeService.java 캐시 키 통일 및 cache condition 보강
src/main/java/until/the/eternity/auctionrealtime/application/scheduler/AuctionRealtimeScheduler.java import 정리
src/main/java/until/the/eternity/auctionitemoption/domain/entity/AuctionHistoryItemOption.java import 정리
src/main/java/until/the/eternity/auctionitem/domain/entity/AuctionRealtimeItemOption.java import 정리
src/main/java/until/the/eternity/auctionitem/domain/entity/AuctionRealtimeItem.java import 순서 정리
src/main/java/until/the/eternity/auctionhistory/interfaces/rest/dto/response/AuctionHistoryDetailResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/auctionhistory/interfaces/rest/dto/request/AuctionHistorySearchRequest.java 기본 날짜 범위 디폴트 부여(최근 1개월)
src/main/java/until/the/eternity/auctionhistory/interfaces/rest/dto/enums/SortDirection.java import 구분(개행) 정리
src/main/java/until/the/eternity/auctionhistory/interfaces/rest/dto/enums/SearchStandard.java import 구분(개행) 정리
src/main/java/until/the/eternity/auctionhistory/interfaces/external/dto/OpenApiAuctionHistoryResponse.java import 정리
src/main/java/until/the/eternity/auctionhistory/interfaces/external/dto/OpenApiAuctionHistoryListResponse.java import 구분(개행) 정리
src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryRepositoryPortImpl.java import 정리
src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryQueryDslRepository.java 기본/고급 필터 분리(옵션/인챈트/세공)
src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryJpaRepository.java import 정리
src/main/java/until/the/eternity/auctionhistory/domain/service/persister/AuctionHistoryPersisterPort.java import 정리
src/main/java/until/the/eternity/auctionhistory/domain/service/fetcher/AuctionHistoryFetcherPort.java import 정리
src/main/java/until/the/eternity/auctionhistory/domain/service/AuctionHistoryDuplicateChecker.java import 정리
src/main/java/until/the/eternity/auctionhistory/domain/repository/AuctionHistoryRepositoryPort.java import 정리
src/main/java/until/the/eternity/auctionhistory/domain/mapper/OpenApiAuctionHistoryMapper.java import 정리
src/main/java/until/the/eternity/auctionhistory/domain/mapper/AuctionHistoryMapper.java import 정리
src/main/java/until/the/eternity/auctionhistory/domain/event/AuctionHistorySavedEvent.java import 정리
src/main/java/until/the/eternity/auctionhistory/domain/entity/AuctionHistory.java import 정리
src/main/java/until/the/eternity/auctionhistory/application/service/persister/AuctionHistoryPersister.java import 정리
src/main/java/until/the/eternity/auctionhistory/application/service/fetcher/AuctionHistoryFetcher.java import 정리
src/main/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryService.java 캐시 키를 CacheKeyBuilder로 통일
src/main/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryCacheWarmupService.java warmup 메서드 보강 및 startup warmup 메서드 추가(충돌 마커 포함)
src/main/java/until/the/eternity/auctionhistory/application/scheduler/AuctionHistoryScheduler.java import 정리
docker-compose-prod.yml Redis 환경변수 전달 추가

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +39 to +42
@ConditionalOnProperty(
name = "app.cache.warmup.enabled",
havingValue = "true",
matchIfMissing = true)
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Startup warmup이 matchIfMissing = true로 기본 활성화되어 있습니다. 여러 인스턴스/환경에서 예기치 않게 부팅 시 대량 쿼리를 유발할 수 있으니 기본값은 비활성화(matchIfMissing=false)로 두고, 필요한 환경에서만 명시적으로 켜는 설정으로 바꾸는 것을 권장합니다.

Copilot uses AI. Check for mistakes.
Comment on lines +71 to +72
tryWarm("auction-history", auctionHistoryCacheWarmupService::evictAndWarm);
tryWarm("auction-realtime", this::warmAuctionRealtime);
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Startup warmup에서 auctionHistoryCacheWarmupService::evictAndWarm를 호출하면 Redis가 공유 캐시인 환경에서(멀티 인스턴스/롤링 배포) 한 인스턴스 재기동만으로도 전체 캐시를 비우는 부작용이 생길 수 있습니다. 부팅 시에는 eviction 없이 warmup만 수행하도록 warmupForStartup()(또는 별도 non-evict warmup)을 호출하거나, 리더 인스턴스에서만 eviction이 수행되도록 락/리더선출을 추가하는 쪽이 안전합니다.

Copilot uses AI. Check for mistakes.
Comment on lines 97 to +100
decorator:
datasource:
p6spy:
enable-logging: false
enable-logging: true
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

decorator.datasource.p6spy.enable-logging이 true로 고정되어 있어 SQL 로그가 항상 출력됩니다. application-sample.yml에서는 false로 되어 있고, 운영에서 활성화되면 성능 저하/로그 노이즈/민감정보 노출 위험이 커지므로 기본값을 false로 두고 필요 시 환경변수로만 켜도록 변경하는 것이 안전합니다.

Copilot uses AI. Check for mistakes.
Comment on lines +13 to +45
public final class CacheKeyBuilder {

private CacheKeyBuilder() {}

public static String all() {
return "all";
}

public static String byText(String value) {
return normalize(value);
}

public static String byLimit(int limit) {
return String.valueOf(limit);
}

public static String pageable(Pageable pageable) {
return pageable.getPageNumber() + ":" + pageable.getPageSize() + ":" + pageable.getSort();
}

public static String buildItemInfoDetailKey(ItemInfoSearchRequest request, Pageable pageable) {
return normalize(request.name())
+ ":"
+ normalize(request.topCategory())
+ ":"
+ normalize(request.subCategory())
+ ":"
+ pageable.getPageNumber()
+ ":"
+ pageable.getPageSize()
+ ":"
+ pageable.getSort();
}
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CacheKeyBuilder가 여러 @Cacheable key 생성의 단일 진실 소스가 되었는데, 현재는 출력 포맷/정규화 규칙을 검증하는 테스트가 없습니다. 키 포맷 변경은 캐시 miss 폭증이나 충돌로 이어질 수 있으니, 주요 메서드들(all/byText/pageable/각 build*Key)에 대한 단위 테스트를 추가해 출력이 고정됨을 보장해 주세요.

Copilot uses AI. Check for mistakes.
…ker 제거

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@dev-ant dev-ant merged commit 49127e7 into dev Mar 5, 2026
1 of 2 checks passed
@dev-ant dev-ant deleted the feat/cache-key-builder branch March 5, 2026 03:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨feature 새로운 기능 추가

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants