From 3d65479475558684b62b8adce4c76420749d9fdd Mon Sep 17 00:00:00 2001 From: Chanhae Lee Date: Sun, 18 Jan 2026 15:38:55 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat(report):=20=EC=B4=9D=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D=20=EC=9D=BC=EC=88=98=20=EA=B3=84=EC=82=B0=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 총 기록 일수를 첫 답변 이후 경과 일수에서 실제 답변 작성한 날짜의 개수로 계산 방식 변경, 추가적으로 Repository 쿼리 간소화 --- .../dailyreport/api/HomeController.java | 14 +++--- .../api/dto/response/HomeResponse.java | 6 +-- .../application/HomeQueryService.java | 47 +++++++------------ .../AnswerEntryQueryRepository.java | 6 +-- 4 files changed, 30 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/api/HomeController.java b/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/api/HomeController.java index 61aa1d7..6d4cb77 100644 --- a/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/api/HomeController.java +++ b/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/api/HomeController.java @@ -37,7 +37,7 @@ public class HomeController { ### 제공 정보 1. 주간 답변 상태: 이번 주(월~일) 답변한 날짜 목록 2. 연속 기록(Streak): 현재 연속 답변 일수 - 3. 총 기록 일수: 첫 답변 이후 경과 일수 (N일째 기록 중) + 3. 총 기록 일수: 실제 답변한 날짜의 총 개수 ### 계산 기준 - 주 시작: 월요일, 주 종료: 일요일 @@ -45,17 +45,19 @@ public class HomeController { * 오늘 답변 있음 → 오늘까지 포함한 연속 일수 * 오늘 답변 없음 → 어제까지의 연속 일수 * 어제도 답변 없음 → 0 - - 총 기록 일수: (오늘 - 첫 답변 날짜) + 1 + - 총 기록 일수: 실제 답변을 작성한 날짜의 개수 ### 예시 - 첫 답변: 2025-12-27 - - 1월 1일~15일 매일 연속 답변 + - 12월 27일~31일 매일 답변 (5일) + - 1월 1일~3일 답변 안 함 + - 1월 4일~15일 매일 답변 (12일) - 오늘: 2026-01-15 응답: - - answeredDates: ["2026-01-13", "2026-01-14", "2026-01-15"] - - streakCount: 15 (1월 1일~15일 연속) - - totalRecordDays: 20 (12월 27일부터 오늘까지 경과) + - answeredDates: ["2026-01-12", "2026-01-13", "2026-01-14", "2026-01-15"] + - streakCount: 12 (1월 4일부터 15일까지 연속) + - totalRecordDays: 17 (5+ 12 = 총 17일 답변) """, security = @SecurityRequirement(name = "bearerAuth"), responses = { diff --git a/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/api/dto/response/HomeResponse.java b/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/api/dto/response/HomeResponse.java index 34e46e0..9aa423f 100644 --- a/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/api/dto/response/HomeResponse.java +++ b/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/api/dto/response/HomeResponse.java @@ -10,9 +10,9 @@ public record HomeResponse( List answeredDates, @Schema(description = "현재 연속 답변 일수 (오늘 답변 있으면 오늘까지, 없으면 어제까지)", example = "15") - long streakCount, + int streakCount, - @Schema(description = "첫 답변 이후 경과 일수 (N일째 기록 중)", example = "20") - long totalRecordDays + @Schema(description = "실제 답변한 날짜의 총 개수", example = "20") + int totalRecordDays ) { } \ No newline at end of file diff --git a/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/application/HomeQueryService.java b/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/application/HomeQueryService.java index 60335d3..15c99a7 100644 --- a/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/application/HomeQueryService.java +++ b/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/application/HomeQueryService.java @@ -10,7 +10,6 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; -import java.time.temporal.ChronoUnit; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -28,42 +27,31 @@ public HomeResponse getHomeData(Long userId) { // 1. 이번 주 범위 계산 WeekRangeDto weekRange = WeekRangeCalculator.weekRangeOf(today); - // 2. 첫 답변 날짜 조회 - LocalDate firstAnswerDate = answerEntryQueryRepository - .findFirstAnswerDateByUserId(userId) - .orElse(null); - - // 3. 첫 답변 날짜 ~ 오늘까지 전체 답변 날짜 조회 - List allAnswerDates; - if (firstAnswerDate == null) { - allAnswerDates = List.of(); // 신규 사용자 - } else { - allAnswerDates = answerEntryQueryRepository - .findAnswerDatesByUserIdAndDateBetween(userId, firstAnswerDate, today); - } + // 2. 전체 답변 날짜 조회 + List allAnswerDates = answerEntryQueryRepository.findAllAnswerDatesByUserId(userId); - // 4. 주간 답변 필터링 + // 3. 이번 주 답변 필터링 List weeklyAnsweredDates = allAnswerDates.stream() .filter(date -> !date.isBefore(weekRange.weekStartDate()) && !date.isAfter(weekRange.weekEndDate())) .sorted() .toList(); - // 5. Streak 계산 - long currentStreak = calculateCurrentStreak(today, allAnswerDates); + // 4. Streak 계산 + int currentStreak = calculateCurrentStreak(today, allAnswerDates); - // 6. 총 기록 일수 계산 - long totalDaysSinceStart = calculateTotalDaysSinceStart(today, firstAnswerDate); + // 5. 총 기록 일수 (실제 답변한 날짜 수) + int totalAnsweredDays = allAnswerDates.size(); - // 7. 응답 생성 + // 6. 응답 생성 return new HomeResponse( weeklyAnsweredDates, currentStreak, - totalDaysSinceStart + totalAnsweredDays ); } - private long calculateCurrentStreak(LocalDate today, List answerDates) { + private int calculateCurrentStreak(LocalDate today, List answerDates) { if (answerDates == null || answerDates.isEmpty()) { return 0; } @@ -73,8 +61,13 @@ private long calculateCurrentStreak(LocalDate today, List answerDates // 시작 날짜 결정: 오늘 답변 있으면 오늘부터, 없으면 어제부터 LocalDate checkDate = dateSet.contains(today) ? today : today.minusDays(1); + // 어제부터 시작하는데 어제 답변이 없으면 streak 0 + if (!dateSet.contains(checkDate)) { + return 0; + } + // 역순 연속 계산 - long streak = 0; + int streak = 0; while (dateSet.contains(checkDate)) { streak++; @@ -83,12 +76,4 @@ private long calculateCurrentStreak(LocalDate today, List answerDates return streak; } - - private long calculateTotalDaysSinceStart(LocalDate today, LocalDate firstAnswerDate) { - if (firstAnswerDate == null || firstAnswerDate.isAfter(today)) { - return 0; - } - - return ChronoUnit.DAYS.between(firstAnswerDate, today) + 1; - } } \ No newline at end of file diff --git a/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/core/repository/AnswerEntryQueryRepository.java b/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/core/repository/AnswerEntryQueryRepository.java index 75f1e79..1c7ab2b 100644 --- a/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/core/repository/AnswerEntryQueryRepository.java +++ b/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/core/repository/AnswerEntryQueryRepository.java @@ -136,12 +136,12 @@ List findAnswerDatesByUserIdAndDateBetween( ); /** - * 사용자의 첫 번째 답변 날짜 조회 + * 사용자의 모든 답변 날짜 조회 */ @Query(""" - SELECT MIN(ae.date) + SELECT ae.date FROM AnswerEntry ae WHERE ae.user.id = :userId """) - Optional findFirstAnswerDateByUserId(@Param("userId") Long userId); + List findAllAnswerDatesByUserId(@Param("userId") Long userId); } \ No newline at end of file From 67c2360e7cd27d7f666343a59f3e5bbb68cbe0c6 Mon Sep 17 00:00:00 2001 From: Chanhae Lee Date: Sun, 18 Jan 2026 15:46:39 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat(report):=20AnswerEntryQueryRepository?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit findAnswerDatesByUserIdAndDateBetween 메서드 제거 --- .../repository/AnswerEntryQueryRepository.java | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/core/repository/AnswerEntryQueryRepository.java b/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/core/repository/AnswerEntryQueryRepository.java index 1c7ab2b..e4094da 100644 --- a/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/core/repository/AnswerEntryQueryRepository.java +++ b/src/main/java/com/devkor/ifive/nadab/domain/dailyreport/core/repository/AnswerEntryQueryRepository.java @@ -118,23 +118,6 @@ Optional findByUserAndDate( @Param("date") LocalDate date ); - /** - * 특정 기간 내 사용자가 답변한 날짜 목록 조회 (오름차순) - */ - @Query(""" - SELECT ae.date - FROM AnswerEntry ae - WHERE ae.user.id = :userId - AND ae.date >= :startDate - AND ae.date <= :endDate - ORDER BY ae.date ASC - """) - List findAnswerDatesByUserIdAndDateBetween( - @Param("userId") Long userId, - @Param("startDate") LocalDate startDate, - @Param("endDate") LocalDate endDate - ); - /** * 사용자의 모든 답변 날짜 조회 */