Java로 Google Analytics 4 페이지 조회수(페이지뷰) 순위 가져오기

GA4의 데이터를 API로 받아 페이지별 조회수를 확인하고 싶다면 Google의 Analytics Data API를 사용할 수 있다.
이 글에서는 Java를 이용해 GA4에서 페이지뷰 상위 데이터를 조회하고,
List<Map<String, Object>> 형식으로 반환하는 전체 프로세스를 정리했다.

 

✅ 준비물

  1. Google Cloud Platform(GCP) 프로젝트
  2. Google Analytics 4 (GA4) 속성
  3. 서비스 계정 및 JSON 키 파일
  4. Java 코드 및 의존성 설정

1️⃣ 서비스 계정 JSON 만들기 (SERVICE_ACCOUNT_JSON)

  1. https://console.cloud.google.com/  사이트 접속하기
  2. 좌측 메뉴에서 IAM 및 관리자 > 서비스 계정 클릭한다.
  3. 새 서비스 계정을 생성한다
    • 이름: {원하는 서비스 계정 이름}
    • 역할: Analytics Data API Viewer
  4. 서비스 계정 생성 후, 키 > 키 추가 > JSON 선택 후 원하는 폴더에 다운로드한다.
  5. 예시 경로: D://xxxx.json
    👉 이 파일의 경로가 코드의 SERVICE_ACCOUNT_JSON_PATH에 들어가게 된다.
  6. GA4 관리 > 속성 > 데이터 스트림 > 권한 > 서비스 계정 이메일에 읽기 권한 부여

2️⃣ 의존성 설정

1.Gradlle

dependencies {
    implementation 'com.google.analytics:data:0.49.0-alpha'
    implementation 'com.google.auth:google-auth-library-oauth2-http:1.20.0'
}

 

2.Maven

<dependencies>
    <!-- GA4 Analytics Data API -->
    <dependency>
        <groupId>com.google.analytics</groupId>
        <artifactId>data</artifactId>
        <version>0.49.0-alpha</version>
    </dependency>

    <!-- Google 인증 라이브러리 -->
    <dependency>
        <groupId>com.google.auth</groupId>
        <artifactId>google-auth-library-oauth2-http</artifactId>
        <version>1.20.0</version>
    </dependency>

</dependencies>

 

3️⃣ 전체 Java 코드 (List<Map<String, Object>> 형태 반환)

private static final String SERVICE_ACCOUNT_JSON_PATH = "D://xxxx.json";

public List<Map<String, Object>> fetchTopPageViewEvents(String propertyId, String startDate, String endDate, int limit) throws IOException, ParseException {

    GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(SERVICE_ACCOUNT_JSON_PATH));
    BetaAnalyticsDataSettings settings = BetaAnalyticsDataSettings.newBuilder()
            .setCredentialsProvider(() -> credentials)
            .build();

    List<Map<String, Object>> resultList = new ArrayList<>();

    try (BetaAnalyticsDataClient analyticsData = BetaAnalyticsDataClient.create(settings)) {

        FilterExpression dimensionFilter = FilterExpression.newBuilder()
                .setFilter(Filter.newBuilder()
                        .setFieldName("eventName")
                        .setStringFilter(Filter.StringFilter.newBuilder()
                                .setMatchType(Filter.StringFilter.MatchType.CONTAINS)
                                .setValue("page_view")))
                .build();

        RunReportRequest request = RunReportRequest.newBuilder()
                .setProperty("properties/" + propertyId)
                .addDateRanges(DateRange.newBuilder()
                        .setStartDate(startDate)
                        .setEndDate(endDate))
                .addDimensions(Dimension.newBuilder().setName("eventName"))
                .addDimensions(Dimension.newBuilder().setName("pagePath"))
                .addDimensions(Dimension.newBuilder().setName("pageTitle"))
                .addMetrics(Metric.newBuilder().setName("eventCount"))
                .addOrderBys(OrderBy.newBuilder()
                        .setMetric(OrderBy.MetricOrderBy.newBuilder()
                                .setMetricName("eventCount"))
                        .setDesc(true))
                .setDimensionFilter(dimensionFilter)
                .setLimit(limit)
                .build();

        RunReportResponse response = analyticsData.runReport(request);

        for (Row row : response.getRowsList()) {
            String eventName = row.getDimensionValues(0).getValue();
            String pagePath = row.getDimensionValues(1).getValue();
            String pageTitle = row.getDimensionValues(2).getValue();
            String eventCount = row.getMetricValues(0).getValue();

            Map<String, Object> map = new HashMap<>();
            map.put("eventName", eventName);
            map.put("pagePath", pagePath);
            map.put("pageTitle", pageTitle);
            map.put("eventCount", Integer.parseInt(eventCount));

            resultList.add(map);
        }
    }

    return resultList;
}

 

 

🧪 사용 예제

List<Map<String, Object>> pageViews = fetchTopPageViewEvents(PROPERTY_ID, "2025-05-22", "2025-05-23", 30);

for (Map<String, Object> page : pageViews) {
    System.out.println(page);
}

필요하다면 Spring 기반의 Rest API 형태로 리팩토링하거나 XML 출력용으로 가공하면 된다.