Skip to content

Main <- Develop#160

Merged
Seol-JY merged 2 commits intomainfrom
develop
Jan 5, 2026
Merged

Main <- Develop#160
Seol-JY merged 2 commits intomainfrom
develop

Conversation

@Seol-JY
Copy link
Copy Markdown
Member

@Seol-JY Seol-JY commented Jan 5, 2026

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 여러 도메인에서 날짜 범위별 일일 통계 조회 기능 추가 (일기, 루틴, 일정, 소셜 게시물/댓글, 사용자)
  • 리팩토링

    • 통계 조회 성능 개선 및 중복 로직 최적화

✏️ Tip: You can customize this high-level summary in your review settings.

- 날짜별 통계 조회 시 발생하던 N+1 쿼리 문제 해결
- DailyCountQueryHelper를 통한 날짜별 그룹화 쿼리 공통 모듈 추가
- 각 도메인별 Repository에 날짜 범위 그룹화 조회 메서드 추가
- 통계 조회 시 날짜 수만큼 쿼리 호출 → 통계 타입당 1회 쿼리로 개선
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jan 5, 2026

Note

.coderabbit.yaml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key(s) in object: 'auto_resolve_threads', 'spring_specific'
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

개요

일일 집계 통계를 위한 새로운 DailyCount 레코드와 DailyCountQueryHelper 유틸리티를 도입하고, 여러 도메인(일기, 루틴, 일정, 소셜, 사용자)의 저장소와 서비스에 날짜 범위별로 그룹화된 일일 카운트 조회 메서드를 추가합니다. 통계 서비스를 리팩토링하여 사전 계산된 일일 카운트를 활용하고 날짜 범위 검증을 제거합니다.

변경 사항

집단 / 파일(들) 변경 요약
기본 집계 프로젝션 및 헬퍼
src/main/java/im/toduck/global/persistence/projection/DailyCount.java, src/main/java/im/toduck/global/persistence/helper/DailyCountQueryHelper.java
새로운 DailyCount 레코드(LocalDate, Long count)와 QueryDSL 기반 일일 집계 쿼리 헬퍼 클래스 추가. countGroupByDate 정적 메서드로 DATE() 표현식을 통해 일일 카운트를 그룹화하여 반환.
일기 도메인
src/main/java/im/toduck/domain/diary/domain/service/DiaryService.java, src/main/java/im/toduck/domain/diary/persistence/repository/DiaryRepository.java, src/main/java/im/toduck/domain/diary/persistence/repository/querydsl/DiaryRepositoryCustom.java, src/main/java/im/toduck/domain/diary/persistence/repository/querydsl/DiaryRepositoryCustomImpl.java
getDiaryCountByDateRangeGroupByDate 서비스 메서드 추가. 저장소 인터페이스에 DiaryRepositoryCustom 확장 및 countByCreatedAtBetweenGroupByDate 메서드 구현 추가.
루틴 도메인
src/main/java/im/toduck/domain/routine/domain/service/RoutineService.java, src/main/java/im/toduck/domain/routine/persistence/repository/querydsl/RoutineRepositoryCustom.java, src/main/java/im/toduck/domain/routine/persistence/repository/querydsl/RoutineRepositoryCustomImpl.java
getRoutineCountByDateRangeGroupByDate 서비스 메서드 추가. 저장소 커스텀 인터페이스 및 구현에 countByCreatedAtBetweenGroupByDate 메서드 추가.
일정 도메인
src/main/java/im/toduck/domain/schedule/domain/service/ScheduleReadService.java, src/main/java/im/toduck/domain/schedule/persistence/repository/querydsl/ScheduleRepositoryCustom.java, src/main/java/im/toduck/domain/schedule/persistence/repository/querydsl/ScheduleRepositoryCustomImpl.java
getSchedulesCountByDateRangeGroupByDate 서비스 메서드 추가. 저장소 커스텀 인터페이스 및 구현에 countByCreatedAtBetweenGroupByDate 메서드 추가.
소셜 도메인
src/main/java/im/toduck/domain/social/domain/service/SocialBoardService.java, src/main/java/im/toduck/domain/social/persistence/repository/querydsl/SocialRepositoryCustom.java, src/main/java/im/toduck/domain/social/persistence/repository/querydsl/SocialRepositoryCustomImpl.java, src/main/java/im/toduck/domain/social/persistence/repository/querydsl/CommentRepositoryCustom.java, src/main/java/im/toduck/domain/social/persistence/repository/querydsl/CommentRepositoryCustomImpl.java
getSocialPostsCountByDateRangeGroupByDategetCommentsCountByDateRangeGroupByDate 서비스 메서드 추가. 게시물과 댓글 저장소 커스텀 인터페이스 및 구현에 countByCreatedAtBetweenGroupByDate 메서드 추가.
사용자 도메인
src/main/java/im/toduck/domain/user/domain/service/UserService.java, src/main/java/im/toduck/domain/user/persistence/repository/querydsl/UserRepositoryCustom.java, src/main/java/im/toduck/domain/user/persistence/repository/querydsl/UserRepositoryCustomImpl.java
getNewUsersCountByDateRangeGroupByDategetDeletedUsersCountByDateRangeGroupByDate 서비스 메서드 추가. 저장소 커스텀 인터페이스 및 구현에 countNewUsersByDateBetweenGroupByDate, countDeletedUsersByDateBetweenGroupByDate 메서드 추가.
통계 사용 사례
src/main/java/im/toduck/domain/backoffice/domain/usecase/StatisticsUseCase.java
getMultiDateStatistics에서 사전 계산된 일일 카운트 맵(statisticsByType)을 활용하여 성능 최적화. 새로운 헬퍼 메서드 getDailyCountsByTypeAndDateRange 추가. MAX_STATISTICS_DATE_RANGE_DAYS 상수 및 관련 날짜 범위 검증 로직 제거.

예상 코드 리뷰 노력

🎯 3 (보통) | ⏱️ ~20분

관련 가능성 있는 PR

  • 백오피스 통계 API 쿼리 최적화 #159: 동일한 DailyCount/DailyCountQueryHelper 추가 및 countByCreatedAtBetweenGroupByDate 메서드 패턴을 적용하고 StatisticsUseCase를 리팩토링하는 동일한 코드 레벨 변경을 수행합니다.
  • 백오피스 기능 추가 #140: 같은 백오피스 통계 흐름을 수정하며, StatisticsUseCase 및 관련 일일 카운트 쿼리 플러밍을 다룹니다.
  • 게시글 검색 및 목록 조회 성능 개선 #147: 소셜 도메인(SocialBoardService, SocialRepositoryCustomImpl)을 수정하여 날짜별 또는 소셜 ID별로 그룹화된 데이터 대량 조회 메서드 및 저장소 헬퍼를 추가합니다.

제안 라벨

✨ Feature

제안 검토자

  • wafla
  • kang20

🐰 일일 집계의 마법, 날짜별로 춤을 춘다네,
DailyCount 레코드가 데이터를 정렬하고,
QueryDSL 헬퍼는 쿼리를 맞춰가며,
여러 도메인이 하나의 패턴으로 노래한다,
통계는 더 빠르고, 더 밝게 빛난다! ✨

Pre-merge checks and finishing touches

❌ Failed checks (3 warnings)
Check name Status Explanation Resolution
Title check ⚠️ Warning 제목이 모호하고 구체적인 변경 내용을 전달하지 않습니다. 'Main <- Develop'은 단순한 브랜치 병합 방향만 나타낼 뿐 실제 작업 내용을 설명하지 않습니다. PR의 주요 변경 사항을 명확하게 설명하는 구체적인 제목으로 변경해주세요. 예를 들어 '통계 조회 최적화 및 일별 집계 기능 추가' 같은 제목이 적합합니다.
Description check ⚠️ Warning PR 설명이 완전히 작성되지 않았습니다. 템플릿에 요구되는 '작업 내용' 섹션과 선택 사항인 '리뷰 요구사항'이 모두 누락되어 있습니다. 리포지토리 템플릿에 따라 작업 내용을 상세히 작성하고, 필요시 리뷰 요구사항을 추가해주세요. 스크린샷이나 예시도 함께 포함하면 도움이 됩니다.
Docstring Coverage ⚠️ Warning Docstring coverage is 6.12% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch develop

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

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

@Seol-JY Seol-JY merged commit 88bd661 into main Jan 5, 2026
0 of 3 checks passed
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Fix all issues with AI Agents 🤖
In
@src/main/java/im/toduck/domain/user/persistence/repository/querydsl/UserRepositoryCustomImpl.java:
- Line 3: 파일에 선언된 불필요한 import LocalDate를 제거하세요: UserRepositoryCustomImpl.java
상단의 "import java.time.LocalDate;"를 삭제하고, 프로젝트에서는 시간 관련 작업에 LocalDateTime을 사용하므로
해당 타입으로 대체하거나 참조가 없음을 확인한 뒤 불필요한 import를 제거해 컴파일 오류가 없는지 확인하세요.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/main/java/im/toduck/domain/backoffice/domain/usecase/StatisticsUseCase.java (2)

108-112: 날짜 범위 제한 검증이 제거되었는지 확인이 필요합니다.

요약에 따르면 MAX_STATISTICS_DATE_RANGE_DAYS 상수와 관련 검증 로직이 제거되었습니다. 현재는 시작일이 종료일보다 이후인지만 검증하고 있어, 수년 단위의 매우 큰 날짜 범위 요청이 가능합니다. 이는 다음과 같은 문제를 야기할 수 있습니다:

  • 89-98번 라인의 while 루프에서 과도한 메모리 사용
  • 데이터베이스 쿼리 성능 저하
  • 응답 시간 증가로 인한 사용자 경험 저하

날짜 범위에 대한 최대 제한(예: 90일 또는 365일)을 다시 추가하는 것을 권장합니다.

#!/bin/bash
# Description: MAX_STATISTICS_DATE_RANGE_DAYS 상수가 이전에 존재했는지, 그리고 현재 제거된 검증 로직을 확인합니다.

# 이전 커밋에서 MAX_STATISTICS_DATE_RANGE_DAYS 상수 검색
echo "=== Checking git history for MAX_STATISTICS_DATE_RANGE_DAYS ==="
git log --all -p -S "MAX_STATISTICS_DATE_RANGE_DAYS" -- "*.java" | head -50

echo ""
echo "=== Checking if any date range limit exists in current code ==="
rg -n "MAX.*DAYS|ChronoUnit|between.*days" src/main/java/im/toduck/domain/backoffice/

114-124: 사용되지 않는 메서드는 제거하세요.

getStatisticsCountByTypeAndDate 메서드가 코드베이스 내에서 호출되지 않습니다. getStatisticsCountByTypeAndDateRange는 존재하고 사용 중이지만, 이 메서드는 더 이상 필요 없으므로 삭제해야 합니다.

🧹 Nitpick comments (3)
src/main/java/im/toduck/domain/schedule/domain/service/ScheduleReadService.java (1)

81-94: 날짜별 집계를 위한 깔끔한 서비스 메서드입니다.

구현이 명확하고 올바르게 동작합니다. DailyCountQueryHelper가 날짜별로 그룹화하므로 중복 키 문제는 발생하지 않을 것으로 예상됩니다.

선택사항: 더 안전한 toMap 사용

만약 향후 중복 날짜에 대한 방어 로직이 필요하다면, merge function을 추가할 수 있습니다:

-return dailyCounts.stream().collect(Collectors.toMap(DailyCount::date, DailyCount::count));
+return dailyCounts.stream()
+    .collect(Collectors.toMap(DailyCount::date, DailyCount::count, Long::sum));

하지만 현재 구조에서는 중복이 발생하지 않으므로 선택사항입니다.

src/main/java/im/toduck/global/persistence/helper/DailyCountQueryHelper.java (1)

55-60: 잠재적 NPE: tuple에서 null 값 처리 필요 여부 검토

tuple.get(dateExpr) 또는 tuple.get(countExpr)가 null을 반환할 경우 NullPointerException이 발생할 수 있습니다. GROUP BY 쿼리 특성상 null 결과가 나오기 어렵지만, 방어적 코딩 관점에서 확인이 필요합니다.

🔎 방어적 null 처리 제안
 return tuples.stream()
-	.map(tuple -> new DailyCount(
-		tuple.get(dateExpr).toLocalDate(),
-		tuple.get(countExpr)
-	))
+	.filter(tuple -> tuple.get(dateExpr) != null && tuple.get(countExpr) != null)
+	.map(tuple -> new DailyCount(
+		tuple.get(dateExpr).toLocalDate(),
+		tuple.get(countExpr)
+	))
 	.toList();
src/main/java/im/toduck/domain/user/domain/service/UserService.java (1)

176-207: LGTM! 기존 서비스 메서드와 일관된 패턴

getNewUsersCountByDateRange (라인 153-158) 및 getDeletedUsersCountByDateRange (라인 160-165)와 동일한 날짜 변환 패턴을 사용하며, 그룹화된 결과를 Map으로 변환하는 로직이 일관됩니다.

날짜 변환(LocalDateLocalDateTime) 및 List<DailyCount>Map<LocalDate, Long> 변환 로직이 여러 서비스(DiaryService, SocialBoardService, UserService 등)에서 반복됩니다. 필요시 공통 유틸리티로 추출을 고려해 볼 수 있습니다.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fe35773 and 38a632c.

📒 Files selected for processing (21)
  • src/main/java/im/toduck/domain/backoffice/domain/usecase/StatisticsUseCase.java
  • src/main/java/im/toduck/domain/diary/domain/service/DiaryService.java
  • src/main/java/im/toduck/domain/diary/persistence/repository/DiaryRepository.java
  • src/main/java/im/toduck/domain/diary/persistence/repository/querydsl/DiaryRepositoryCustom.java
  • src/main/java/im/toduck/domain/diary/persistence/repository/querydsl/DiaryRepositoryCustomImpl.java
  • src/main/java/im/toduck/domain/routine/domain/service/RoutineService.java
  • src/main/java/im/toduck/domain/routine/persistence/repository/querydsl/RoutineRepositoryCustom.java
  • src/main/java/im/toduck/domain/routine/persistence/repository/querydsl/RoutineRepositoryCustomImpl.java
  • src/main/java/im/toduck/domain/schedule/domain/service/ScheduleReadService.java
  • src/main/java/im/toduck/domain/schedule/persistence/repository/querydsl/ScheduleRepositoryCustom.java
  • src/main/java/im/toduck/domain/schedule/persistence/repository/querydsl/ScheduleRepositoryCustomImpl.java
  • src/main/java/im/toduck/domain/social/domain/service/SocialBoardService.java
  • src/main/java/im/toduck/domain/social/persistence/repository/querydsl/CommentRepositoryCustom.java
  • src/main/java/im/toduck/domain/social/persistence/repository/querydsl/CommentRepositoryCustomImpl.java
  • src/main/java/im/toduck/domain/social/persistence/repository/querydsl/SocialRepositoryCustom.java
  • src/main/java/im/toduck/domain/social/persistence/repository/querydsl/SocialRepositoryCustomImpl.java
  • src/main/java/im/toduck/domain/user/domain/service/UserService.java
  • src/main/java/im/toduck/domain/user/persistence/repository/querydsl/UserRepositoryCustom.java
  • src/main/java/im/toduck/domain/user/persistence/repository/querydsl/UserRepositoryCustomImpl.java
  • src/main/java/im/toduck/global/persistence/helper/DailyCountQueryHelper.java
  • src/main/java/im/toduck/global/persistence/projection/DailyCount.java
🧰 Additional context used
🧬 Code graph analysis (2)
src/main/java/im/toduck/domain/diary/persistence/repository/querydsl/DiaryRepositoryCustomImpl.java (5)
src/main/java/im/toduck/domain/routine/persistence/repository/querydsl/RoutineRepositoryCustomImpl.java (1)
  • Repository (23-156)
src/main/java/im/toduck/domain/schedule/persistence/repository/querydsl/ScheduleRepositoryCustomImpl.java (1)
  • Repository (18-71)
src/main/java/im/toduck/domain/social/persistence/repository/querydsl/CommentRepositoryCustomImpl.java (1)
  • Repository (27-102)
src/main/java/im/toduck/domain/social/persistence/repository/querydsl/SocialRepositoryCustomImpl.java (1)
  • Repository (22-149)
src/main/java/im/toduck/domain/user/persistence/repository/querydsl/UserRepositoryCustomImpl.java (1)
  • Repository (27-291)
src/main/java/im/toduck/domain/diary/persistence/repository/DiaryRepository.java (1)
src/main/java/im/toduck/domain/diary/persistence/repository/querydsl/DiaryRepositoryCustomImpl.java (1)
  • Repository (15-30)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: CI
  • GitHub Check: build-and-upload
🔇 Additional comments (25)
src/main/java/im/toduck/domain/backoffice/domain/usecase/StatisticsUseCase.java (2)

81-84: 성능 개선이 잘 적용되었습니다.

타입별로 일별 카운트를 미리 계산하여 Map에 저장하는 방식으로 변경하여, N개의 날짜와 M개의 타입에 대해 O(N*M)번의 쿼리를 O(M)번으로 줄였습니다. 대용량 날짜 범위 조회 시 성능이 크게 향상될 것으로 예상됩니다.


154-168: 새로운 헬퍼 메서드가 잘 구현되었습니다.

각 통계 타입별로 날짜 범위에 대한 일별 카운트를 그룹화하여 반환하는 로직이 명확하게 구현되어 있습니다. 각 도메인 서비스의 일관된 메서드 네이밍(*CountByDateRangeGroupByDate)을 사용하고 있어 가독성이 좋습니다.

src/main/java/im/toduck/global/persistence/projection/DailyCount.java (1)

1-13: 깔끔한 Projection 구현입니다.

일별 집계 결과를 표현하는 간단하고 명확한 레코드 타입입니다. QueryDSL의 Projections와 함께 사용하기에 적합하며, 불변성을 보장하는 레코드 타입 선택도 좋습니다.

src/main/java/im/toduck/domain/social/persistence/repository/querydsl/SocialRepositoryCustom.java (1)

33-36: 일관된 커스텀 쿼리 패턴을 따르고 있습니다.

새로 추가된 countByCreatedAtBetweenGroupByDate 메서드는 다른 도메인의 커스텀 리포지토리들과 동일한 네이밍 컨벤션과 시그니처를 사용하고 있어 코드베이스 전체의 일관성이 유지됩니다.

src/main/java/im/toduck/domain/social/persistence/repository/querydsl/CommentRepositoryCustom.java (1)

18-21: 커스텀 쿼리 메서드가 일관되게 추가되었습니다.

댓글 도메인에도 동일한 일별 집계 패턴이 적용되었습니다. 다른 도메인들(Diary, Routine, Schedule, User 등)과 일관된 인터페이스를 유지하고 있습니다.

src/main/java/im/toduck/domain/diary/persistence/repository/DiaryRepository.java (1)

14-19: Spring Data JPA 커스텀 리포지토리 패턴이 올바르게 적용되었습니다.

DiaryRepositoryDiaryRepositoryCustom을 확장하여 표준 JPA 메서드와 커스텀 쿼리 메서드를 모두 제공할 수 있게 되었습니다. Spring Data JPA의 권장 패턴을 따르고 있습니다.

src/main/java/im/toduck/domain/routine/persistence/repository/querydsl/RoutineRepositoryCustom.java (2)

4-4: LGTM!

새로운 메서드 시그니처에 필요한 import가 올바르게 추가되었습니다.

Also applies to: 10-10


31-34: 일관된 패턴으로 잘 구현되었습니다.

다른 도메인(Diary, Schedule)과 동일한 패턴을 따르는 메서드 선언으로, 코드베이스 전체에서 일관성을 유지하고 있습니다.

src/main/java/im/toduck/domain/diary/persistence/repository/querydsl/DiaryRepositoryCustom.java (1)

1-13: LGTM!

깔끔하고 명확한 커스텀 Repository 인터페이스입니다. 다른 도메인들과 일관된 구조를 따르고 있습니다.

src/main/java/im/toduck/domain/schedule/persistence/repository/querydsl/ScheduleRepositoryCustom.java (2)

4-4: LGTM!

새로운 메서드에 필요한 import가 적절하게 추가되었습니다.

Also applies to: 8-8


13-16: 일관된 패턴으로 잘 구현되었습니다.

다른 도메인들과 동일한 시그니처를 사용하여 코드베이스 전체의 일관성을 유지하고 있습니다.

src/main/java/im/toduck/domain/schedule/persistence/repository/querydsl/ScheduleRepositoryCustomImpl.java (2)

4-4: LGTM!

구현에 필요한 import가 모두 적절하게 추가되었습니다.

Also applies to: 14-15


62-70: 헬퍼 클래스를 활용한 깔끔한 구현입니다.

DailyCountQueryHelper를 사용하여 코드 중복을 방지하고 있으며, 구현이 명확합니다.

src/main/java/im/toduck/domain/schedule/domain/service/ScheduleReadService.java (1)

8-8: LGTM!

새로운 서비스 메서드에 필요한 import가 적절하게 추가되었습니다.

Also applies to: 10-10, 25-25

src/main/java/im/toduck/domain/social/persistence/repository/querydsl/CommentRepositoryCustomImpl.java (1)

93-101: 구현이 올바르게 작성되었습니다.

DailyCountQueryHelper를 사용한 일자별 그룹화 카운트 구현이 다른 도메인의 패턴과 일관성 있게 작성되었습니다. 파라미터 전달과 반환 타입이 모두 적절합니다.

src/main/java/im/toduck/domain/social/persistence/repository/querydsl/SocialRepositoryCustomImpl.java (1)

140-148: 구현이 올바르게 작성되었습니다.

Social 엔티티에 대한 일자별 그룹화 카운트 기능이 다른 리포지토리 구현체와 동일한 패턴으로 정확하게 구현되었습니다.

src/main/java/im/toduck/domain/routine/domain/service/RoutineService.java (1)

181-195: 서비스 메서드가 올바르게 구현되었습니다.

날짜 범위를 LocalDateTime으로 변환하는 로직(atStartOfDay(), atTime(LocalTime.MAX))이 정확하며, List<DailyCount>Map<LocalDate, Long>으로 변환하는 스트림 처리도 적절합니다.

src/main/java/im/toduck/domain/routine/persistence/repository/querydsl/RoutineRepositoryCustomImpl.java (1)

147-155: 구현이 올바르게 작성되었습니다.

Routine 엔티티에 대한 일자별 그룹화 카운트 기능이 DailyCountQueryHelper를 활용하여 일관된 패턴으로 구현되었습니다. @Override 어노테이션으로 인터페이스 계약을 준수하고 있습니다.

src/main/java/im/toduck/domain/user/persistence/repository/querydsl/UserRepositoryCustom.java (1)

45-53: 인터페이스 메서드 선언이 적절하며, 구현이 올바르게 완료되었습니다.

countNewUsersByDateBetweenGroupByDate()countDeletedUsersByDateBetweenGroupByDate() 메서드가 명확하게 선언되었으며, UserRepositoryCustomImpl에서 일치하는 서명으로 올바르게 구현되어 있습니다. 메서드는 UserService에서 활발히 사용되고 있습니다.

src/main/java/im/toduck/domain/diary/domain/service/DiaryService.java (1)

149-164: LGTM! 일관된 패턴으로 구현되었습니다.

기존 getDiaryCountByDateRange 메서드와 동일한 날짜 변환 패턴을 사용하며, DailyCount 프로젝션을 Map으로 변환하는 로직이 깔끔합니다. 다른 서비스(UserService, SocialBoardService 등)와 일관된 구현입니다.

src/main/java/im/toduck/global/persistence/helper/DailyCountQueryHelper.java (2)

44-45: DATE() 함수의 데이터베이스 호환성 확인

DATE({0}) 함수는 MySQL, PostgreSQL, H2에서 지원되지만, 프로덕션과 테스트 환경에서 사용하는 데이터베이스가 이 함수를 지원하는지 확인해 주세요.


18-23: 코드 중복 제거를 위한 좋은 추상화

여러 리포지토리(Diary, User, Social, Schedule, Routine, Comment)에서 반복되던 GROUP BY DATE 쿼리 로직을 공통 헬퍼로 추출하여 유지보수성을 높였습니다.

src/main/java/im/toduck/domain/user/persistence/repository/querydsl/UserRepositoryCustomImpl.java (1)

271-290: LGTM! DailyCountQueryHelper를 활용한 일관된 구현

countNewUsersByDateBetweenGroupByDatecountDeletedUsersByDateBetweenGroupByDate 메서드가 공통 헬퍼를 사용하여 깔끔하게 구현되었습니다. 다른 리포지토리 구현(ScheduleRepositoryCustomImpl, CommentRepositoryCustomImpl 등)과 일관된 패턴입니다.

src/main/java/im/toduck/domain/diary/persistence/repository/querydsl/DiaryRepositoryCustomImpl.java (1)

15-30: LGTM! 프로젝트 패턴에 맞는 깔끔한 구현

다른 리포지토리 커스텀 구현체(ScheduleRepositoryCustomImpl, CommentRepositoryCustomImpl, SocialRepositoryCustomImpl, RoutineRepositoryCustomImpl)와 동일한 패턴으로 구현되었습니다. DailyCountQueryHelper로의 위임이 적절합니다.

src/main/java/im/toduck/domain/social/domain/service/SocialBoardService.java (1)

291-322: LGTM! 기존 메서드와 일관된 구현

getSocialPostsCountByDateRange (라인 278-283) 및 getCommentsCountByDateRange (라인 285-290)와 동일한 패턴을 따르며, 그룹화된 일별 카운트 기능을 추가합니다. socialRepositorycommentRepository를 적절히 활용합니다.

@@ -1,5 +1,6 @@
package im.toduck.domain.user.persistence.repository.querydsl;

import java.time.LocalDate;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
rg -n "LocalDate[^T]" src/main/java/im/toduck/domain/user/persistence/repository/querydsl/UserRepositoryCustomImpl.java

Repository: toduck-App/toduck-backend

Length of output: 98


🏁 Script executed:

cat -n src/main/java/im/toduck/domain/user/persistence/repository/querydsl/UserRepositoryCustomImpl.java

Repository: toduck-App/toduck-backend

Length of output: 10463


사용되지 않는 import 제거

LocalDate import(3번 줄)가 파일 어디에서도 사용되지 않습니다. 모든 시간 관련 작업은 LocalDateTime을 사용하므로 이 import를 제거해주세요.

🤖 Prompt for AI Agents
In
@src/main/java/im/toduck/domain/user/persistence/repository/querydsl/UserRepositoryCustomImpl.java
around line 3, 파일에 선언된 불필요한 import LocalDate를 제거하세요:
UserRepositoryCustomImpl.java 상단의 "import java.time.LocalDate;"를 삭제하고, 프로젝트에서는
시간 관련 작업에 LocalDateTime을 사용하므로 해당 타입으로 대체하거나 참조가 없음을 확인한 뒤 불필요한 import를 제거해 컴파일
오류가 없는지 확인하세요.

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.

1 participant