diff --git a/maeil-mail/src/main/java/maeilmail/statistics/StatisticsDao.java b/maeil-mail/src/main/java/maeilmail/statistics/StatisticsDao.java index f6bfcb9..dc9dc33 100644 --- a/maeil-mail/src/main/java/maeilmail/statistics/StatisticsDao.java +++ b/maeil-mail/src/main/java/maeilmail/statistics/StatisticsDao.java @@ -25,6 +25,21 @@ class StatisticsDao { private final JPAQueryFactory queryFactory; + public Long countDistinctSubscribeCount() { + return queryFactory.select(subscribe.email.countDistinct()) + .from(subscribe) + .where(subscribe.deletedAt.isNull()) + .fetchOne(); + } + + // 주어진 일자의 중복을 제거한 구독자를 조회하는 용도로 사용되므로 논리 삭제는 고려하지 않는다. + public Long countDistinctSubscribeOnSpecificDate(LocalDateTime startOfDay, LocalDateTime endOfDay) { + return queryFactory.select(subscribe.email.countDistinct()) + .from(subscribe) + .where(subscribe.createdAt.between(startOfDay, endOfDay)) + .fetchOne(); + } + public Map querySuccessFailCount(LocalDateTime dateTime) { List fetch = queryFactory.select(subscribeQuestion.isSuccess, subscribeQuestion.count()) .from(subscribeQuestion) diff --git a/maeil-mail/src/main/java/maeilmail/statistics/StatisticsService.java b/maeil-mail/src/main/java/maeilmail/statistics/StatisticsService.java index 1d6bddc..41036ed 100644 --- a/maeil-mail/src/main/java/maeilmail/statistics/StatisticsService.java +++ b/maeil-mail/src/main/java/maeilmail/statistics/StatisticsService.java @@ -3,13 +3,11 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; -import java.util.List; import java.util.Map; import java.util.function.BiFunction; import lombok.RequiredArgsConstructor; import maeilmail.bulksend.schedule.SendWeeklyQuestionScheduler; import maeilmail.subscribe.command.domain.SubscribeFrequency; -import maeilmail.subscribe.command.domain.SubscribeRepository; import maeilsupport.DateUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,7 +17,6 @@ @Transactional(readOnly = true) public class StatisticsService { - private final SubscribeRepository subscribeRepository; private final StatisticsDao statisticsDao; /** @@ -51,19 +48,18 @@ private BiFunction getFrequencyCountPolicy(Local * 메인 페이지에서 사용되는 구독자 수 */ public SubscribeReport generateSubscribeReport() { - List distinctEmails = subscribeRepository.findDistinctEmails(); + Long subscribeCount = statisticsDao.countDistinctSubscribeCount(); - return new SubscribeReport((long) distinctEmails.size()); + return new SubscribeReport(subscribeCount); } /** * 특정 날짜 신규 구독자 수 */ - public int countNewSubscribersOnSpecificDate(LocalDate date) { + public Long countNewSubscribersOnSpecificDate(LocalDate date) { LocalDateTime startOfDay = date.atStartOfDay(); LocalDateTime endOfDay = startOfDay.plusDays(1).minusNanos(1); - List distinctEmails = subscribeRepository.findDistinctEmailsByCreatedAtBetween(startOfDay, endOfDay); - return distinctEmails.size(); + return statisticsDao.countDistinctSubscribeOnSpecificDate(startOfDay, endOfDay); } } diff --git a/maeil-mail/src/main/java/maeilmail/subscribe/command/domain/SubscribeRepository.java b/maeil-mail/src/main/java/maeilmail/subscribe/command/domain/SubscribeRepository.java index b52fcdd..2d86bb4 100644 --- a/maeil-mail/src/main/java/maeilmail/subscribe/command/domain/SubscribeRepository.java +++ b/maeil-mail/src/main/java/maeilmail/subscribe/command/domain/SubscribeRepository.java @@ -1,6 +1,5 @@ package maeilmail.subscribe.command.domain; -import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -10,25 +9,6 @@ public interface SubscribeRepository extends JpaRepository { - @Query(""" - select distinct s.email - from Subscribe s - where s.deletedAt is null - """) - List findDistinctEmails(); - - /** - * 주어진 일자의 중복을 제거한 구독자를 조회하는 용도로 사용되므로 논리 삭제는 고려하지 않는다. - * - * @see maeilmail.statistics.StatisticsService#countNewSubscribersOnSpecificDate(LocalDate) - */ - @Query(""" - select distinct s.email - from Subscribe s - where s.createdAt between :startOfDay and :endOfDay - """) - List findDistinctEmailsByCreatedAtBetween(LocalDateTime startOfDay, LocalDateTime endOfDay); - Optional findByEmailAndTokenAndDeletedAtIsNull(String email, String token); List findAllByEmailAndDeletedAtIsNull(String email); diff --git a/maeil-mail/src/test/java/maeilmail/statistics/StatisticsServiceTest.java b/maeil-mail/src/test/java/maeilmail/statistics/StatisticsServiceTest.java index a21d363..68c9484 100644 --- a/maeil-mail/src/test/java/maeilmail/statistics/StatisticsServiceTest.java +++ b/maeil-mail/src/test/java/maeilmail/statistics/StatisticsServiceTest.java @@ -7,7 +7,6 @@ import java.util.List; import java.util.stream.IntStream; import maeilmail.question.QuestionCategory; -import maeilmail.question.QuestionRepository; import maeilmail.subscribe.command.domain.Subscribe; import maeilmail.subscribe.command.domain.SubscribeFrequency; import maeilmail.subscribe.command.domain.SubscribeRepository; @@ -25,9 +24,6 @@ class StatisticsServiceTest extends IntegrationTestSupport { @Autowired private SubscribeRepository subscribeRepository; - @Autowired - private QuestionRepository questionRepository; - @Autowired private SendReportCountingCase sendReportCountingCase; @@ -56,7 +52,7 @@ void countNewSubscribersOnSpecificDate() { subscribeRepository.save(new Subscribe("test" + 2, QuestionCategory.FRONTEND, SubscribeFrequency.DAILY)); subscribeRepository.save(new Subscribe("test" + 2, QuestionCategory.FRONTEND, SubscribeFrequency.DAILY)); - int distinctEmailsCount = statisticsService.countNewSubscribersOnSpecificDate(LocalDate.now()); + Long distinctEmailsCount = statisticsService.countNewSubscribersOnSpecificDate(LocalDate.now()); assertThat(distinctEmailsCount).isEqualTo(2); } @@ -66,7 +62,7 @@ void countNewSubscribersOnSpecificDate() { void countNewSubscribersOnSpecificDate2() { subscribeRepository.save(new Subscribe("test" + 1, QuestionCategory.FRONTEND, SubscribeFrequency.DAILY)); - int distinctEmailsCount = statisticsService.countNewSubscribersOnSpecificDate(LocalDate.now().minusDays(1)); + Long distinctEmailsCount = statisticsService.countNewSubscribersOnSpecificDate(LocalDate.now().minusDays(1)); assertThat(distinctEmailsCount).isEqualTo(0); }