- 해당 예시에서는 일일 활성화 사용자 조회(activeUser), 유입 및 체류시간 정보를 조회하는 정보를 가져옵니다. - 그렇기에 응답 값으로 지정하여서 이로 반환받습니다.
package com.adjh.templatespringboot4.dto;
import lombok.Builder;
import lombok.Getter;
/**
* 일일 활성화 사용자 + 유입 및 체류시간에 대한 응답값
*
* @author : leejonghoon
* @fileName : GaResponseDto
* @since : 26. 2. 2.
*/
@Getter
@Builder
public class GaResponseDto {
private String date;
private long activeUsers;
private long totalUsers;
private long sessions;
private long pageViews;
private double avgSessionDuration;
private double engagementRate;
}
6. GaService
💡 GaService
- 클라이언트를 통해서 직접적으로 GA와 통신을 수행하여서 데이터를 조회합니다.
1. DateRange 객체를 통해 조회 기간을 설정합니다. (시작일, 종료일 구성) 2. 실행 요청 정보 Budiler로 구성합니다: 조회 범위(Range), 측정 기준(Metric), 데이터 분류 기준(Dimension) 3. 요청 정보를 기반으로 클라이언트로 실행 4. DTO 변환 및 결과값 반환 (Builder 사용)
package com.adjh.templatespringboot4.service;
import com.adjh.templatespringboot4.dto.GaResponseDto;
import com.google.analytics.data.v1beta.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* GA Client를 기반으로 데이터를 조회해오는 서비스
*
* @author : leejonghoon
* @fileName : GaServiceComponent
* @since : 26. 2. 2.
*/
@Service
public class GaService {
@Value("${ga.property-id}")
private String propertyId;
private final BetaAnalyticsDataClient client;
public GaService(BetaAnalyticsDataClient client) {
this.client = client;
}
/**
* 구성한 클라이언트를 기반으로 유입 및 체류시간 조회 Service
*
* @return List<GaResponseDto>
*/
public List<GaResponseDto> trafficAndEngagement() {
// 1. 조회 기간을 설정합니다. (시작일, 종료일 구성)
DateRange dateRange = DateRange.newBuilder()
.setStartDate("7daysAgo")
.setEndDate("today")
.build();
// 2. 실행 요청 정보를 구성합니다: 조회 범위(Range), 측정 기준(Metric), 데이터 분류 기준(Dimension)
RunReportRequest request = RunReportRequest.newBuilder()
.setProperty("properties/" + propertyId)
// 2.1. 조회 범위(Range) 지정
.addDateRanges(dateRange)
// 2.2. 측정 기준(Metric) 지정
.addDimensions(Dimension.newBuilder().setName("date"))
// 2.3. 데이터 분류 기준 지정(Dimension)
// 1. 유입 및 사용자 관련 지표 (Acquisition & Users)
.addMetrics(Metric.newBuilder().setName("activeUsers")) // 활성 사용자 수
.addMetrics(Metric.newBuilder().setName("totalUsers")) // 전체 사용자 수
.addMetrics(Metric.newBuilder().setName("sessions")) // 세션 수
.addMetrics(Metric.newBuilder().setName("screenPageViews")) // 페이지 조회수
// 2. 참여 및 체류 관련 지표 (Engagement)
.addMetrics(Metric.newBuilder().setName("averageSessionDuration")) // 평균 세션 시간
.addMetrics(Metric.newBuilder().setName("engagementRate")) // 참여율
.addMetrics(Metric.newBuilder().setName("bounceRate")) // 이탈률
.addMetrics(Metric.newBuilder().setName("eventCount")) // 이벤트 수
.build();
// 3. 요청 정보를 기반으로 클라이언트로 실행
RunReportResponse response = client.runReport(request);
// 4. DTO 변환 및 결과값 반환 (Builder 사용)
return response.getRowsList().stream()
.map(row -> GaResponseDto.builder()
.date(row.getDimensionValues(0).getValue())
.activeUsers(Long.parseLong(row.getMetricValues(0).getValue()))
.totalUsers(Long.parseLong(row.getMetricValues(1).getValue()))
.sessions(Long.parseLong(row.getMetricValues(2).getValue()))
.pageViews(Long.parseLong(row.getMetricValues(3).getValue()))
.avgSessionDuration(Double.parseDouble(row.getMetricValues(4).getValue()))
.engagementRate(Double.parseDouble(row.getMetricValues(5).getValue()))
.bounceRate(Double.parseDouble(row.getMetricValues(6).getValue()))
.eventCount(Long.parseLong(row.getMetricValues(7).getValue()))
.build())
.toList();
}
}