Skip to content

Commit

Permalink
Merge pull request #247 from maeil-mail/243
Browse files Browse the repository at this point in the history
통계 서비스에서 쿼리 의존성을 변경한다.
  • Loading branch information
le2sky authored Feb 25, 2025
2 parents 99c39aa + 2242ab0 commit 6c03db1
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 34 deletions.
15 changes: 15 additions & 0 deletions maeil-mail/src/main/java/maeilmail/statistics/StatisticsDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Boolean, Long> querySuccessFailCount(LocalDateTime dateTime) {
List<Tuple> fetch = queryFactory.select(subscribeQuestion.isSuccess, subscribeQuestion.count())
.from(subscribeQuestion)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -19,7 +17,6 @@
@Transactional(readOnly = true)
public class StatisticsService {

private final SubscribeRepository subscribeRepository;
private final StatisticsDao statisticsDao;

/**
Expand Down Expand Up @@ -51,19 +48,18 @@ private BiFunction<SubscribeFrequency, Long, Long> getFrequencyCountPolicy(Local
* 메인 페이지에서 사용되는 구독자 수
*/
public SubscribeReport generateSubscribeReport() {
List<String> 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<String> distinctEmails = subscribeRepository.findDistinctEmailsByCreatedAtBetween(startOfDay, endOfDay);

return distinctEmails.size();
return statisticsDao.countDistinctSubscribeOnSpecificDate(startOfDay, endOfDay);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -10,25 +9,6 @@

public interface SubscribeRepository extends JpaRepository<Subscribe, Long> {

@Query("""
select distinct s.email
from Subscribe s
where s.deletedAt is null
""")
List<String> findDistinctEmails();

/**
* 주어진 일자의 중복을 제거한 구독자를 조회하는 용도로 사용되므로 논리 삭제는 고려하지 않는다.
*
* @see maeilmail.statistics.StatisticsService#countNewSubscribersOnSpecificDate(LocalDate)
*/
@Query("""
select distinct s.email
from Subscribe s
where s.createdAt between :startOfDay and :endOfDay
""")
List<String> findDistinctEmailsByCreatedAtBetween(LocalDateTime startOfDay, LocalDateTime endOfDay);

Optional<Subscribe> findByEmailAndTokenAndDeletedAtIsNull(String email, String token);

List<Subscribe> findAllByEmailAndDeletedAtIsNull(String email);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -25,9 +24,6 @@ class StatisticsServiceTest extends IntegrationTestSupport {
@Autowired
private SubscribeRepository subscribeRepository;

@Autowired
private QuestionRepository questionRepository;

@Autowired
private SendReportCountingCase sendReportCountingCase;

Expand Down Expand Up @@ -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);
}
Expand All @@ -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);
}
Expand Down

0 comments on commit 6c03db1

Please sign in to comment.