From a61880ecfc92bf399411fd9c33b8c6c4a9fd6c36 Mon Sep 17 00:00:00 2001 From: ownue Date: Wed, 5 Aug 2026 13:14:03 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=ED=99=88=20=EC=97=B0=EC=8A=B5=20?= =?UTF-8?q?=EB=82=A0=EC=A7=9C=20=EC=A1=B0=ED=9A=8C=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EB=B3=80=ED=99=98=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mr/domain/home/service/HomeService.java | 7 ++++--- .../playing/repository/PlayingRepository.java | 4 ++-- .../mr/domain/home/service/HomeServiceTest.java | 14 ++++++++++---- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/mr/domain/home/service/HomeService.java b/src/main/java/com/mr/domain/home/service/HomeService.java index 667f297d..8e5856e2 100644 --- a/src/main/java/com/mr/domain/home/service/HomeService.java +++ b/src/main/java/com/mr/domain/home/service/HomeService.java @@ -28,9 +28,9 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Slice; @@ -85,8 +85,9 @@ private List buildRecommendedLearnings( // 연속 출석일수는 기간 상한이 없어야 하므로 별도로 전체 기간 날짜만 조회 private Set fetchPracticeDates(Long userId) { - return new HashSet<>( - playingRepository.findDistinctEndedDatesByUserAndStatus(userId, PlayingStatus.COMPLETED)); + return playingRepository.findDistinctEndedDatesByUserAndStatus(userId, PlayingStatus.COMPLETED).stream() + .map(java.sql.Date::toLocalDate) + .collect(Collectors.toSet()); } private UserSummary buildUserSummary(User user) { diff --git a/src/main/java/com/mr/domain/playing/repository/PlayingRepository.java b/src/main/java/com/mr/domain/playing/repository/PlayingRepository.java index 9e9bdc71..9ffee16f 100644 --- a/src/main/java/com/mr/domain/playing/repository/PlayingRepository.java +++ b/src/main/java/com/mr/domain/playing/repository/PlayingRepository.java @@ -3,7 +3,7 @@ import com.mr.domain.playing.entity.Playing; import com.mr.domain.playing.entity.enums.PlayingStatus; import jakarta.persistence.LockModeType; -import java.time.LocalDate; +import java.sql.Date; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -85,7 +85,7 @@ select distinct function('date', p.endedAt) from Playing p and p.deletedAt is null and p.endedAt is not null """) - List findDistinctEndedDatesByUserAndStatus( + List findDistinctEndedDatesByUserAndStatus( @Param("userId") Long userId, @Param("status") PlayingStatus status ); diff --git a/src/test/java/com/mr/domain/home/service/HomeServiceTest.java b/src/test/java/com/mr/domain/home/service/HomeServiceTest.java index b5fed0a9..3b58cc27 100644 --- a/src/test/java/com/mr/domain/home/service/HomeServiceTest.java +++ b/src/test/java/com/mr/domain/home/service/HomeServiceTest.java @@ -28,6 +28,7 @@ import com.mr.domain.user.repository.StudentRepository; import com.mr.domain.user.repository.UserRepository; import com.mr.global.apipayload.exception.GeneralException; +import java.sql.Date; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; @@ -90,6 +91,10 @@ private Playing mockPlaying(LocalDateTime endedAt, Integer durationSec) { return playing; } + private Date sqlDate(LocalDate date) { + return Date.valueOf(date); + } + @Test @DisplayName("getHome - 존재하지 않는 사용자면 404") void getHome_userNotFound_throws404() { @@ -140,7 +145,7 @@ void getHome_threeConsecutiveDaysIncludingToday_currentDaysIsThree() { LocalDate today = LocalDate.now(); given(playingRepository.findDistinctEndedDatesByUserAndStatus(1L, PlayingStatus.COMPLETED)).willReturn(List.of( - today, today.minusDays(1), today.minusDays(2), today.minusDays(5) // 연속 끊김 + sqlDate(today), sqlDate(today.minusDays(1)), sqlDate(today.minusDays(2)), sqlDate(today.minusDays(5)) )); HomeResponseDTO response = homeService.getHome(1L); @@ -154,8 +159,9 @@ void getHome_longStreak_notCappedByLookbackWindow() { stubBaseline(1L); LocalDate today = LocalDate.now(); - List endedDates = java.util.stream.IntStream.range(0, 65) + List endedDates = java.util.stream.IntStream.range(0, 65) .mapToObj(today::minusDays) + .map(this::sqlDate) .toList(); given(playingRepository.findDistinctEndedDatesByUserAndStatus(1L, PlayingStatus.COMPLETED)).willReturn(endedDates); @@ -171,7 +177,7 @@ void getHome_noPracticeToday_countsFromYesterday() { LocalDate yesterday = LocalDate.now().minusDays(1); given(playingRepository.findDistinctEndedDatesByUserAndStatus(1L, PlayingStatus.COMPLETED)) - .willReturn(List.of(yesterday)); + .willReturn(List.of(sqlDate(yesterday))); HomeResponseDTO response = homeService.getHome(1L); @@ -185,7 +191,7 @@ void getHome_duplicateDateFromRepository_countsOnce() { LocalDate today = LocalDate.now(); given(playingRepository.findDistinctEndedDatesByUserAndStatus(1L, PlayingStatus.COMPLETED)) - .willReturn(List.of(today, today, today)); + .willReturn(List.of(sqlDate(today), sqlDate(today), sqlDate(today))); HomeResponseDTO response = homeService.getHome(1L); From 39504bbf66e3e4d54012140ab2080ed9d4087002 Mon Sep 17 00:00:00 2001 From: ownue Date: Wed, 5 Aug 2026 13:49:55 +0900 Subject: [PATCH 2/2] =?UTF-8?q?style:=20HomeService=20=EB=82=A0=EC=A7=9C?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20import=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/mr/domain/home/service/HomeService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/mr/domain/home/service/HomeService.java b/src/main/java/com/mr/domain/home/service/HomeService.java index 8e5856e2..7595efb2 100644 --- a/src/main/java/com/mr/domain/home/service/HomeService.java +++ b/src/main/java/com/mr/domain/home/service/HomeService.java @@ -24,6 +24,7 @@ import com.mr.domain.user.repository.UserRepository; import com.mr.global.apipayload.exception.GeneralException; import com.mr.global.util.RelativeDateFormatter; +import java.sql.Date; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; @@ -86,7 +87,7 @@ private List buildRecommendedLearnings( // 연속 출석일수는 기간 상한이 없어야 하므로 별도로 전체 기간 날짜만 조회 private Set fetchPracticeDates(Long userId) { return playingRepository.findDistinctEndedDatesByUserAndStatus(userId, PlayingStatus.COMPLETED).stream() - .map(java.sql.Date::toLocalDate) + .map(Date::toLocalDate) .collect(Collectors.toSet()); }