Skip to content

perf: 조회 API 성능 개선을 위한 캐싱 추가 적용 및 인덱스 추가#116

Merged
dev-ant merged 2 commits into
devfrom
perf/read-api-cache-index
May 12, 2026
Merged

perf: 조회 API 성능 개선을 위한 캐싱 추가 적용 및 인덱스 추가#116
dev-ant merged 2 commits into
devfrom
perf/read-api-cache-index

Conversation

@dev-ant
Copy link
Copy Markdown
Contributor

@dev-ant dev-ant commented May 12, 2026

📋 상세 설명

  • p99 타겟 조회 쿼리 패턴에 맞춘 인덱스 추가(Flyway + 일부 Entity 인덱스 반영)
  • 랭킹/통계/메타데이터성 조회에 @Cacheable(sync=true) 적용 및 기동/배치 후 캐시 워밍업 로직 추가
  • 통계 조회 일부를 DTO 프로젝션으로 변경해 조회 비용(엔티티 로딩/매핑)을 절감하고, 일부 컨트롤러에 HTTP 캐시 헤더 추가

📊 체크리스트

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

@dev-ant dev-ant requested a review from Copilot May 12, 2026 23:13
@dev-ant dev-ant self-assigned this May 12, 2026
@dev-ant dev-ant added the ✨feature 새로운 기능 추가 label May 12, 2026
@github-actions
Copy link
Copy Markdown

✅ 테스트 결과 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

조회(Read) API의 p99 지연을 낮추기 위해 DB 인덱스 보강, Redis 캐싱(sync=true로 stampede 방지), 캐시 워밍업(배치 후/기동 시), 그리고 일부 정적성 높은 API에 HTTP Cache-Control을 추가한 PR입니다.

Changes:

  • p99 타겟 조회 쿼리 패턴에 맞춘 인덱스 추가(Flyway + 일부 Entity 인덱스 반영)
  • 랭킹/통계/메타데이터성 조회에 @Cacheable(sync=true) 적용 및 기동/배치 후 캐시 워밍업 로직 추가
  • 통계 조회 일부를 DTO 프로젝션으로 변경해 조회 비용(엔티티 로딩/매핑)을 절감하고, 일부 컨트롤러에 HTTP 캐시 헤더 추가

Reviewed changes

Copilot reviewed 175 out of 175 changed files in this pull request and generated no comments.

Show a summary per file
File Description
src/main/resources/db/migration/V28__add_p99_read_api_indexes.sql p99 조회 API 최적화용 인덱스 추가
src/main/resources/db/migration/V29__add_next_p99_read_api_indexes.sql 추가 p99 조회 API 최적화용 인덱스 추가(조건부 생성)
src/main/resources/db/migration/V30__add_remaining_p99_read_api_indexes.sql 잔여 p99 조회 API 최적화용 인덱스 추가(조건부 생성)
src/main/java/until/the/eternity/statistics/service/DailyStatisticsService.java 통계 저장 후 조회 캐시 워밍업(비동기 + 커밋 후 실행) 추가
src/main/java/until/the/eternity/statistics/repository/weekly/TopCategoryWeeklyStatisticsRepository.java 주간 탑카테고리 조회 정렬 기준을 weekStartDate로 변경
src/main/java/until/the/eternity/statistics/repository/weekly/SubcategoryWeeklyStatisticsRepository.java import 정리
src/main/java/until/the/eternity/statistics/repository/weekly/ItemWeeklyStatisticsRepository.java 주간 아이템 통계 조회를 DTO 프로젝션으로 변경 + 정렬 최적화
src/main/java/until/the/eternity/statistics/repository/daily/TopCategoryDailyStatisticsRepository.java 일간 탑카테고리 통계 조회를 DTO 프로젝션으로 변경
src/main/java/until/the/eternity/statistics/repository/daily/SubcategoryDailyStatisticsRepository.java import 정리
src/main/java/until/the/eternity/statistics/repository/daily/ItemDailyStatisticsRepository.java 일간 아이템 통계 조회를 DTO 프로젝션으로 변경
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/TopCategoryWeeklyStatisticsResponse.java import/format 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/TopCategoryDailyStatisticsResponse.java import/format 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/SubcategoryWeeklyStatisticsResponse.java import/format 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/SubcategoryDailyStatisticsResponse.java import/format 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/ItemWeeklyStatisticsResponse.java import/format 정리
src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/ItemDailyStatisticsResponse.java import/format 정리
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 인덱스 정의 보강(week_start_date 포함) + 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 @Cacheable(sync=true) 적용
src/main/java/until/the/eternity/statistics/application/service/TopCategoryDailyStatisticsService.java @Cacheable(sync=true) 적용 + 매핑 제거(레포에서 DTO 반환)
src/main/java/until/the/eternity/statistics/application/service/SubcategoryWeeklyStatisticsService.java @Cacheable(sync=true) 및 캐시 키 변경(탑카테고리 포함)
src/main/java/until/the/eternity/statistics/application/service/SubcategoryDailyStatisticsService.java @Cacheable(sync=true) 및 캐시 키 변경(탑카테고리 포함)
src/main/java/until/the/eternity/statistics/application/service/ItemWeeklyStatisticsService.java @Cacheable(sync=true) 적용 + 매핑 제거(레포에서 DTO 반환)
src/main/java/until/the/eternity/statistics/application/service/ItemDailyStatisticsService.java @Cacheable(sync=true) 적용 + 매핑 제거(레포에서 DTO 반환)
src/main/java/until/the/eternity/ranking/repository/RankingRepository.java 카테고리 랭킹 쿼리 분리(상위카테고리만 vs 상/하위) + tie-breaker 정렬 보강
src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/VolumeRankingResponse.java import/format 정리
src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/VolumeChangeRankingResponse.java import/format 정리
src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/PriceRankingResponse.java import/format 정리
src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/PriceChangeRankingResponse.java import/format 정리
src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/AllTimeRankingResponse.java import/format 정리
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 @Cacheable(sync=true) 적용
src/main/java/until/the/eternity/ranking/application/service/PriceRankingService.java import 정리
src/main/java/until/the/eternity/ranking/application/service/PriceChangeRankingService.java @Cacheable(sync=true) 적용
src/main/java/until/the/eternity/ranking/application/service/CategoryRankingService.java subCategory 유무에 따라 쿼리 분기 + @Cacheable(sync=true) 적용
src/main/java/until/the/eternity/ranking/application/service/AllTimeRankingService.java @Cacheable(sync=true) 적용
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 HTTP Cache-Control(6h) 적용 + ResponseEntity로 변경
src/main/java/until/the/eternity/metalwareinfo/infrastructure/persistence/MetalwareInfoRepositoryPortImpl.java import 정리
src/main/java/until/the/eternity/metalwareinfo/infrastructure/persistence/MetalwareInfoJpaRepository.java 조회 정렬 추가(ORDER BY)
src/main/java/until/the/eternity/metalwareinfo/application/service/MetalwareInfoService.java @Cacheable(sync=true) 적용
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 카테고리 응답을 static 캐싱으로 변경(불필요한 매 요청 변환 제거)
src/main/java/until/the/eternity/iteminfo/interfaces/rest/controller/ItemInfoController.java 카테고리 API에 HTTP Cache-Control(1d) 적용
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 import 정리
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/format 정리
src/main/java/until/the/eternity/hornBugle/interfaces/external/dto/OpenApiHornBugleHistoryResponse.java import/format 정리
src/main/java/until/the/eternity/hornBugle/interfaces/external/dto/OpenApiHornBugleHistoryListResponse.java import/format 정리
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 최근 목록 캐시(@Cacheable(sync=true)) + 저장 시 eviction 추가
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 정리
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 인덱스 추가(affix_position, id)
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 @Cacheable(sync=true) 적용
src/main/java/until/the/eternity/config/RedisConfig.java 캐시 TTL 조정(특정 도메인 6h, horn-bugle 2m)
src/main/java/until/the/eternity/config/RedisCacheErrorHandler.java import 정리
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/CacheStartupWarmupRunner.java 기동 시 캐시 워밍업 대상 확장(랭킹/통계/뿔피리 등)
src/main/java/until/the/eternity/config/CacheNames.java horn-bugle 캐시 이름 추가
src/main/java/until/the/eternity/common/util/SegongOptionParser.java import 정리
src/main/java/until/the/eternity/common/util/CacheKeyBuilder.java subcategory 통계 캐시 키에 topCategory 포함 + horn-bugle 키 생성 추가
src/main/java/until/the/eternity/common/response/PageResponseDto.java import/format 정리
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/format 정리
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/format 정리
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/format 정리
src/main/java/until/the/eternity/auctionsearchoption/interfaces/rest/dto/response/FieldMetadata.java import/format 정리
src/main/java/until/the/eternity/auctionsearchoption/interfaces/rest/AuctionSearchOptionController.java HTTP Cache-Control(1d) 적용
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 인덱스 추가(is_active, display_order)
src/main/java/until/the/eternity/auctionsearchoption/application/service/AuctionSearchOptionService.java @Cacheable(sync=true) 적용
src/main/java/until/the/eternity/auctionrealtime/interfaces/rest/dto/response/AuctionRealtimeDetailResponse.java import/format 정리
src/main/java/until/the/eternity/auctionrealtime/interfaces/rest/dto/request/RealtimeSortField.java import/format 정리
src/main/java/until/the/eternity/auctionrealtime/interfaces/rest/dto/request/AuctionRealtimeSearchRequest.java import 정리
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/format 정리
src/main/java/until/the/eternity/auctionrealtime/infrastructure/persistence/AuctionRealtimeQueryDslRepository.java import 정리
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 import 정리
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/format 정리
src/main/java/until/the/eternity/auctionhistory/interfaces/rest/dto/request/AuctionHistorySearchRequest.java import/format 정리
src/main/java/until/the/eternity/auctionhistory/interfaces/rest/dto/enums/SortDirection.java import/format 정리
src/main/java/until/the/eternity/auctionhistory/interfaces/rest/dto/enums/SearchStandard.java import/format 정리
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/format 정리
src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryRepositoryPortImpl.java import 정리
src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryQueryDslRepository.java import 정리
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 경매 내역 조회 캐시에 sync=true 적용
src/main/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryCacheWarmupService.java 워밍업 대상에 all-time ranking 캐시 추가
src/main/java/until/the/eternity/auctionhistory/application/scheduler/AuctionHistoryScheduler.java import 정리
Comments suppressed due to low confidence (2)

src/main/java/until/the/eternity/statistics/application/service/SubcategoryDailyStatisticsService.java:41

  • SubcategoryDailyStatisticsService.search(...) now builds the cache key using topCategory, but the actual query only filters by subCategory (and the underlying SubcategoryDailyStatistics entity/table doesn’t store topCategory). This makes the API contract ambiguous and can also create duplicate cache entries for identical results. Either include topCategory in the persisted statistics/query filtering, or remove topCategory from the cache key (and ideally from the request/validation) if it’s truly redundant.
    src/main/java/until/the/eternity/statistics/application/service/SubcategoryWeeklyStatisticsService.java:41
  • SubcategoryWeeklyStatisticsService.search(...) uses topCategory as part of the cache key, but the repository method it calls only filters by subCategory. If topCategory is meant to affect results (it’s required by the request DTO/controller), this will return incorrect data; if it’s redundant, including it in the cache key will fragment the cache. Align the query/model and the cache key so they reflect the same filtering dimensions.

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

@dev-ant dev-ant merged commit ba2c39b into dev May 12, 2026
5 of 6 checks passed
@dev-ant dev-ant deleted the perf/read-api-cache-index branch May 12, 2026 23:26
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