사용자 추적을 위한 조회 기능 개발
사용자 추적을 위한 조회 기능 개발
앞서 우아한테크코스 교육기간 중 인덱스에 대해서 학습하고 블로그에 작성했다.
인덱스 1편
인덱스 2편
인덱스 3편
이를 바탕으로 매일메일 서비스 팀에 합류하여 팀원들과 함께 운영하면서 구독자의 서비스 이용 추이를 추적하기 위해서 일별 누적 구독자 조회, 일별 신규 구독자 조회 기능을 개발했다.
public interface SubscribeRepository extends JpaRepository<Subscribe, Long> {
@Query("select distinct s.email from Subscribe s")
List<String> findDistinctEmails();
@Query("select distinct s.email from Subscribe s where s.createdAt between :startOfDay and :endOfDay")
List<String> findDistinctEmailsByCreatedAtBetween(LocalDateTime startOfDay, LocalDateTime endOfDay);
}
리포지토리의 두 메서에서 발생하는 조회 쿼리 모두 인덱스를 타지 않기 때문에, Subscribe
테이블의 email
, created_at
컬럼에 인덱스를 각각 설정하여 조회 성능을 개선했다.
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Service
public class AdminStatisticsService {
private final SubscribeRepository subscribeRepository;
public int countCumulativeSubscribers() {
List<String> distinctEmails = subscribeRepository.findDistinctEmails();
return distinctEmails.size();
}
public int countNewSubscribersOnSpecificDate(LocalDate date) {
LocalDateTime startOfDay = date.atStartOfDay();
LocalDateTime endOfDay = startOfDay.plusDays(1).minusNanos(1);
List<String> distinctEmails = subscribeRepository.findDistinctEmailsByCreatedAtBetween(startOfDay, endOfDay);
return distinctEmails.size();
}
}
두 메서드를 사용하는 서비스 클래스는 이렇게 작성되어 있다. 프론트엔드 팀원에게 일별 누적 구독자, 일별 신규 구독자의 숫자만 정확하게 요청 받은 것이 아니기 때문에 위 메서드를 덜 구체화시켜 조회 메서드에서 집계 쿼리로 명확한 숫자를 조회하지 않고, Subscribe
테이블의 행을 조회하도록 하여 재사용 가능하게 만들었다.
아직은 서비스를 운영하는 과정에서 구체적인 통계 전용 서비스 메서드를 필요로 하는 것이 아니기도 하고, 조회 성능이 과하게 떨어지지도 않는다고 판단했다. 아직 조회 쿼리를 요청한 프론트엔드 팀원이 어떤 식으로 메서드를 호출할지 모르는 상황이라, API까지 작성하지 않고 서비스 클래스의 메서드로만 작성해둔 상황이다. 향후 통계 서비스를 따로 구성해서 API로 만들면 좋을 것 같다.
이후 목표로는 매일메일 서비스를 구독한 구독자들 중에서 메일을 차단한 사용자를 제외한 집단이 진짜 서비스 이용자 집단이라고 생각하여 그 비율이 얼마나 되는지 정확하게 추적하고 개선할 수 있도록 할 예정이다.
댓글남기기