From 2242ab09bad7cbe1b12b14868249faecb37f45cc Mon Sep 17 00:00:00 2001 From: le2sky Date: Tue, 25 Feb 2025 11:55:15 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=ED=86=B5=EA=B3=84=EC=84=B1=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../maeilmail/statistics/StatisticsDao.java | 15 ++++++++++++++ .../statistics/StatisticsService.java | 12 ++++------- .../command/domain/SubscribeRepository.java | 20 ------------------- .../statistics/StatisticsServiceTest.java | 8 ++------ 4 files changed, 21 insertions(+), 34 deletions(-) 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); }