Skip to content

[PERF] Home 연속 학습 계산을 위한 연주 이력 조회 개선 - #262

Merged
on1yoneprivate merged 3 commits into
developfrom
perf/#237-home-practice-date-query
Sep 17, 2026
Merged

on1yoneprivate merged 3 commits into
developfrom
perf/#237-home-practice-date-query

Conversation

@on1yoneprivate

@on1yoneprivate on1yoneprivate commented Sep 16, 2026

Copy link
Copy Markdown
Contributor

📍 개요

Home의 연속 학습 및 출석 계산 시 전체 연주의 endedAt을 조회하던 방식을 개선하여,
DB에서 KST 기준 연습 날짜만 중복 제거해 조회하도록 최적화합니다.

⛓️‍💥 관련 이슈


🛠️ 작업 내용

  • Home의 연속 학습 일수 및 주간 출석 계산에 사용되는 연습 날짜 조회 방식 개선
  • 완료된 모든 연주의 endedAt을 조회하던 방식에서 DB에서 날짜 단위로 중복 제거하여 조회하도록 변경
  • endedAtAsia/Seoul 기준 날짜로 변환하여 서비스 정책에 맞는 KST 연습 날짜 조회
  • DB에서 DISTINCT 처리하여 동일 날짜에 여러 번 연주한 경우 하나의 연습 날짜만 애플리케이션으로 반환
  • 애플리케이션에서 전체 endedAt을 KST LocalDate로 변환하던 처리 제거
  • 기존 연속 학습 일수 및 주간 출석 계산 로직과 응답 스펙 유지
  • KST 기준 날짜 중복 제거 및 UTC → KST 날짜 경계에 대한 Repository 테스트 추가
  • 기존 Home 연속 학습 관련 테스트를 변경된 조회 방식에 맞게 보완

🔥 리뷰 요청 사항

리뷰어가 중점적으로 확인해주었으면 하는 내용을 작성해주세요.

  • PostgreSQL Native Query의 AT TIME ZONE 'Asia/Seoul'DISTINCT 처리가
    KST 기준 연습 날짜 계산에 적절한지 확인 부탁드립니다.
  • Repository에서 DB의 date 결과를 반환하고 HomeService에서 LocalDate로 변환하는 방식이 적절한지 확인 부탁드립니다.
  • DB에서 날짜 단위 중복 제거를 수행하도록 변경한 후에도 기존 연속 학습 일수 및 주간 출석 계산 결과가
    동일하게 유지되는지 확인 부탁드립니다.

✅ 체크리스트

  • 코드 컨벤션을 준수했습니다.
  • 불필요한 코드 및 import를 제거했습니다.
  • 예외 처리를 적용했습니다.
  • 테스트를 완료했습니다.
  • 관련 Issue를 연결했습니다.

📎 참고 사항

성능 테스트 환경

  • 로컬 PostgreSQL 환경에서 측정
  • 테스트 사용자: user_id = 2000
  • 완료 연주 데이터: 10,000건
  • KST 기준 실제 연습 날짜: 365일
  • 동일한 데이터셋에서 개선 전/후 쿼리를 각각 3회 측정
  • EXPLAIN (ANALYZE, BUFFERS)를 이용하여 DB Query Execution Time 및 반환 Row 수 비교

연습 날짜 조회 성능 비교

항목 Before After 변화
조회 대상 연주 10,000건 10,000건 동일
반환 Row 10,000 365 96.35% 감소
Execution Time 1 4.024ms 11.750ms -
Execution Time 2 7.762ms 15.364ms -
Execution Time 3 6.636ms 13.337ms -
평균 Execution Time 6.14ms 13.48ms 증가
Buffers 154 154 동일
날짜 변환 Application DB DB 처리
중복 제거 Application Set DB DISTINCT DB 처리
  • 기존: 완료된 연주 10,000건의 endedAt을 모두 애플리케이션으로 전달 → KST 기준 LocalDate 변환 및 Set 중복 제거를 수행
  • 개선 후: DB에서 endedAtAsia/Seoul 기준 날짜로 변환 → DISTINCT 처리하여 실제 필요한 365개의 연습 날짜만 반환
    이에 따라 DB → Application으로 전달되는 Row 수가 10,000건에서 365건으로 약 96.35% 감소했으며, 애플리케이션에서 날짜 변환 및 중복 제거를 수행해야 하는 데이터 범위도 함께 감소했습니다.

DB에서 timezone 변환 및 DISTINCT 연산을 추가로 수행하기 때문에 DB 단독 Execution Time은 평균 6.14ms → 13.48ms로 증가했습니다. 따라서 이번 변경은 DB 쿼리 실행시간 자체를 단축하기보다는, Home 요청 시 불필요하게 전달되던 연주 이력 데이터를 줄이고 애플리케이션 측 처리 범위를 축소하는 것을 목적으로 합니다.

테스트

  • 동일 KST 날짜에 여러 연주가 존재해도 하나의 연습 날짜만 반환되는지 검증
  • UTC 날짜가 서로 달라도 KST 기준 동일 날짜인 경우 하나의 날짜로 처리되는지 검증
  • 오늘을 포함한 연속 학습 일수 계산 검증
  • 오늘 연습하지 않은 경우 어제부터의 연속 학습 일수 계산 검증
  • 장기간 연속 학습 시 조회 기간 제한 없이 계산되는지 검증
  • 관련 Repository 및 HomeService 테스트 통과
  • 전체 테스트 통과

Home API End-to-End 성능 측정

DB 쿼리 자체의 Execution Time 외에도 실제 Home API 전체 처리 성능에 미치는 영향을 확인하기 위해 동일 데이터셋에서 k6로 Before/After를 측정했습니다.

측정 조건

  • Local PostgreSQL
  • GET /api/home
  • COMPLETED 연주 10,000건
  • KST 기준 연습 날짜 365일
  • k6 1 VU / 30초
  • Before / After 각각 3회 측정
  • 동일 데이터셋 및 실행 환경
  • 인증 처리 비용 제외
지표 Before 평균 After 평균 변화
평균 응답시간 16.40 ms 10.95 ms 약 33.2% 감소
Median 14.99 ms 9.90 ms 약 34.0% 감소
p90 20.00 ms 12.00 ms 약 40.0% 감소
p95 24.15 ms 14.55 ms 약 39.8% 감소
처리량 60.65 req/s 91.09 req/s 약 50.2% 증가
요청 실패율 0% 0% 동일

DB에서 KST 날짜 변환 및 DISTINCT를 수행하면서 쿼리 자체의 Execution Time은 증가했지만,
반환 Row가 10,000건에서 365건으로 감소하면서 DB → Application 데이터 전달량과
애플리케이션의 날짜 변환/중복 제거 비용이 감소했습니다.

그 결과 동일 데이터셋의 Home API E2E 측정에서는 평균 응답시간이 약 33.2%,
p95 응답시간이 약 39.8% 감소했습니다.

Summary by CodeRabbit

  • 개선 사항

    • 완료된 연습 날짜를 한국 표준시 기준으로 정확히 집계하도록 개선했습니다.
    • 같은 날짜에 여러 번 완료한 연습은 하나의 날짜로만 표시됩니다.
  • 테스트

    • 날짜 경계와 중복 완료 기록에 대한 검증을 추가했습니다.

@coderabbitai

coderabbitai Bot commented Sep 16, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 6f66302f-8bb1-4dab-a107-17082c3979ac

📥 Commits

Reviewing files that changed from the base of the PR and between a9e6371 and 548b7bd.

📒 Files selected for processing (4)
  • src/main/java/com/mr/domain/home/service/HomeService.java
  • src/main/java/com/mr/domain/playing/repository/PlayingRepository.java
  • src/test/java/com/mr/domain/home/service/HomeServiceTest.java
  • src/test/java/com/mr/domain/playing/repository/PlayingRepositoryTest.java

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

완료 연주의 날짜 조회를 네이티브 SQL로 변경했습니다. ended_at을 KST 날짜로 변환하고 데이터베이스에서 중복 제거합니다. Home 서비스와 관련 테스트는 java.sql.Date 및 상태 문자열을 사용합니다.

Changes

연습 날짜 조회 변경

Layer / File(s) Summary
리포지토리 날짜 조회와 검증
src/main/java/com/mr/domain/playing/repository/PlayingRepository.java, src/test/java/com/mr/domain/playing/repository/PlayingRepositoryTest.java
findDistinctEndedDatesByUserAndStatus를 네이티브 SQL로 변경했습니다. ended_atAsia/Seoul 기준 날짜로 변환하고 DISTINCT를 적용합니다. 반환 타입은 List<Date>이고 상태 파라미터는 String입니다. 테스트는 동일한 KST 날짜의 중복 제거를 검증합니다.
Home 서비스 날짜 매핑
src/main/java/com/mr/domain/home/service/HomeService.java, src/test/java/com/mr/domain/home/service/HomeServiceTest.java
Home 서비스는 PlayingStatus.COMPLETED.name()을 전달합니다. 반환된 java.sql.DateLocalDate로 변환합니다. 서비스 테스트는 새 날짜 타입과 상태 파라미터를 사용합니다.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~20 minutes

Severity of issue fixed: Medium

Merge Risk: ⚪ Minimal · up to 548b7

The updated practice-date flow has no confirmed merge-blocking issue.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 7.69% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 13 functions across 4 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed 직접 연결된 이슈 #237의 코딩 요구사항을 충족합니다. PlayingRepository.findDistinctEndedDatesByUserAndStatus는 PostgreSQL에서 ended_atAsia/Seoul 날짜로 변환한 뒤 DISTINCT 처리합니다. COMPLETED 상태와 삭제되지 않은 데이터만 조회합니다. `HomeSe…
Out of Scope Changes check ✅ Passed 변경 범위는 #237의 조회 최적화와 회귀 검증에 연결됩니다. Repository 쿼리와 반환 타입 변경은 날짜 단위 DB 중복 제거를 구현합니다. HomeService 변경은 새 날짜 타입을 기존 계산 로직에 연결합니다. 관련 서비스 및 Repository 테스트 추가도 해당 동작을 검증하기 위한 지원 변경입니다. 확인된 변경에서 이슈와 무관한 기능 …
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 Home의 연속 학습 계산을 위한 연주 이력 조회 개선이라는 주요 변경 사항을 정확히 설명합니다. 성능 개선 목적과 변경 범위도 명확합니다.
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch perf/#237-home-practice-date-query

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

KST 날짜가 줄을 맞추고
중복 기록은 사라지고
SQL이 먼저 날짜를 고르고
Home은 LocalDate를 받고
연속 학습의 길을 잇습니다.

Comment @coderabbitai help to get the list of available commands.

@ownue ownue left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

end-to-end 성능도 함께 확인해보면 좋을 것 같습니다! 현재 결과를 보면 반환 Row 수는 10,000 → 365로 크게 감소했는데, 그에 비해서 DB Execution Time은 평균 6.14ms → 13.48ms로 증가했네용!?!?

이번 변경의 목적이 DB 쿼리 자체를 빠르게 하는 것보다는 DB → Application 전송량과 애플리케이션의 날짜 변환/중복 제거 비용을 줄이는 것이라면, 가능하면 동일 데이터셋에서 Home API 전체 응답 시간이나 해당 처리 구간의 전/후 시간도 같이 측정해두면 실제 최적화 효과를 조금 더 명확하게 확인할 수 있을 것 같습니다! 😁😁

수고 많으셨어요~~

@on1yoneprivate

Copy link
Copy Markdown
Contributor Author

리뷰 반영하여 동일 데이터셋에서 Home API E2E 성능 추가 측정했습니다!
DB Execution Time 자체는 증가했지만, 반환 Row가 10,000 → 365건으로 감소하면서 Home API 평균 응답시간은 16.40ms → 10.95ms(약 33.2%), p95는 24.15ms → 14.55ms(약 39.8%) 감소한 것을 확인했습니다. 측정 결과는 PR 본문에도 추가해 두었습니다.

@on1yoneprivate
on1yoneprivate merged commit 65533de into develop Sep 17, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

⚡ Perf - Home 연속 학습 계산을 위한 연주 이력 조회 개선

2 participants