Skip to content

perf: K6 테스트 결과 P99 latency가 가장 높은 조회 API 5종 개선#117

Merged
dev-ant merged 3 commits into
devfrom
perf/slow-read-api
May 13, 2026
Merged

perf: K6 테스트 결과 P99 latency가 가장 높은 조회 API 5종 개선#117
dev-ant merged 3 commits into
devfrom
perf/slow-read-api

Conversation

@dev-ant
Copy link
Copy Markdown
Contributor

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

📋 상세 설명

  • BATCH 조회 API P99 병목 상위 API를 대상으로 count 쿼리 제거, Slice 기반 페이지네이션, 캐시 적용/정리 등 응답 지연 개선 작업을 적용했습니다.
  • 프론트 devnogi-react의 뿔피리 조회 화면이 변경된 Slice 응답 구조에 맞게 총 개수 표시 로직을 조정했습니다.
  • open-api-batch-server/k6에 운영/로컬 도메인 조회 API 20종 K6 테스트 스크립트와 타임스탬프 기반 결과 저장 구조를 추가했습니다.

📊 체크리스트

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

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

✅ 테스트 결과 for PR

Build: success

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

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

@dev-ant dev-ant merged commit b189aa6 into dev May 13, 2026
1 of 3 checks passed
@dev-ant dev-ant deleted the perf/slow-read-api branch May 13, 2026 23:28
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

This PR improves batch read API latency by adding targeted indexes, switching horn-bugle recent reads to Slice-based pagination, extending cache TTL/warmup behavior, and adding K6 read-only performance tooling.

Changes:

  • Added read-optimized indexes for horn-bugle and auction-history ranking queries.
  • Changed horn-bugle recent DB reads from Page to Slice and added Slice response mapping.
  • Added weekly/horn-bugle cache warmups and K6 scenario/runner/reporting files.

Reviewed changes

Copilot reviewed 26 out of 27 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
src/test/java/until/the/eternity/metalwareinfo/application/service/MetalwareInfoServiceTest.java Import ordering cleanup.
src/test/java/until/the/eternity/iteminfo/application/service/ItemInfoServiceTest.java Import ordering cleanup.
src/test/java/until/the/eternity/common/util/SegongOptionParserTest.java Import ordering cleanup.
src/test/java/until/the/eternity/auctionsearchoption/application/service/AuctionSearchOptionServiceTest.java Import ordering cleanup.
src/test/java/until/the/eternity/auctionrealtime/application/service/fetcher/AuctionRealtimeFetcherTest.java Import ordering cleanup.
src/test/java/until/the/eternity/auctionrealtime/application/service/AuctionRealtimeServiceTest.java Import ordering cleanup.
src/test/java/until/the/eternity/auctionhistory/domain/service/AuctionHistoryDuplicateCheckerTest.java Import ordering cleanup.
src/test/java/until/the/eternity/auctionhistory/application/service/persister/AuctionHistoryPersisterTest.java Import ordering cleanup.
src/test/java/until/the/eternity/auctionhistory/application/service/fetcher/AuctionHistoryFetcherTest.java Import ordering cleanup.
src/test/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryServiceTest.java Import ordering cleanup.
src/main/resources/db/migration/V31__add_batch_read_p99_tail_indexes.sql Adds conditional indexes for horn-bugle recent reads and all-time price ranking.
src/main/java/until/the/eternity/statistics/service/WeeklyStatisticsService.java Adds post-commit asynchronous weekly cache warmup.
src/main/java/until/the/eternity/hornBugle/infrastructure/persistence/HornBugleRepositoryPortImpl.java Wires new Slice-based recent horn-bugle repository methods.
src/main/java/until/the/eternity/hornBugle/infrastructure/persistence/HornBugleJpaRepository.java Adds deterministic recent horn-bugle queries ordered by date/id.
src/main/java/until/the/eternity/hornBugle/domain/repository/HornBugleRepositoryPort.java Extends repository port with Slice recent-read methods.
src/main/java/until/the/eternity/hornBugle/domain/entity/HornBugleWorldHistory.java Declares new horn-bugle composite indexes.
src/main/java/until/the/eternity/hornBugle/application/service/HornBugleService.java Uses Slice for non-keyword horn-bugle database search.
src/main/java/until/the/eternity/hornBugle/application/scheduler/HornBugleScheduler.java Warms recent horn-bugle caches after scheduler completion.
src/main/java/until/the/eternity/config/RedisConfig.java Increases weekly statistics cache TTL.
src/main/java/until/the/eternity/common/response/PageResponseDto.java Adds Slice overload for page response construction.
src/main/java/until/the/eternity/common/response/PageMeta.java Adds Slice-derived metadata construction.
src/main/java/until/the/eternity/auctionhistory/domain/entity/AuctionHistory.java Declares auction-history price/buy-id ranking index.
k6/scenarios/batch_readonly_portfolio.js Adds K6 read-only API portfolio scenario and report generation.
k6/run-batch-readonly.sh Adds target/profile-based K6 runner with timestamped outputs.
k6/results/.gitkeep Keeps the K6 results directory in Git.
k6/README.md Documents K6 targets, profiles, output structure, and commands.
.gitignore Ignores generated K6 results while retaining .gitkeep.

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

Comment on lines +26 to +32
public static PageMeta of(Slice<?> slice) {
int currentPage = slice.getNumber() + 1;
int totalPages = currentPage + (slice.hasNext() ? 1 : 0);
long totalElements =
slice.getPageable().getOffset()
+ slice.getNumberOfElements()
+ (slice.hasNext() ? 1 : 0);
PRE_ALLOCATED_VUS=${PRE_ALLOCATED_VUS} MAX_VUS=${MAX_VUS} \\
REPORT_MD=${REPORT_MD} \\
REPORT_JSON=${REPORT_JSON} \\
k6 run performance/k6/scenarios/batch_readonly_portfolio.js
Comment on lines +10 to +11
const REPORT_MD = __ENV.REPORT_MD || 'k6/results/manual/batch_read_api_performance_report.md';
const REPORT_JSON = __ENV.REPORT_JSON || 'k6/results/manual/batch_read_api_performance_summary.json';
Comment on lines +120 to +129
for (WeeklyStatisticsWarmupTarget target : weeklyStatisticsWarmupTargets()) {
itemWeeklyStatisticsReadService.search(
target.itemName(),
target.subCategory(),
target.topCategory(),
weeklyStart,
end);
topCategoryWeeklyStatisticsReadService.search(
target.topCategory(), weeklyStart, end);
}
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