GA4의 데이터를 API로 받아 페이지별 조회수를 확인하고 싶다면 Google의 Analytics Data API를 사용할 수 있다.
이 글에서는 Java를 이용해 GA4에서 페이지뷰 상위 데이터를 조회하고,
List<Map<String, Object>> 형식으로 반환하는 전체 프로세스를 정리했다.
✅ 준비물
- Google Cloud Platform(GCP) 프로젝트
- Google Analytics 4 (GA4) 속성
- 서비스 계정 및 JSON 키 파일
- Java 코드 및 의존성 설정
1️⃣ 서비스 계정 JSON 만들기 (SERVICE_ACCOUNT_JSON)
- https://console.cloud.google.com/ 사이트 접속하기
- 좌측 메뉴에서 IAM 및 관리자 > 서비스 계정 클릭한다.
- 새 서비스 계정을 생성한다
- 이름: {원하는 서비스 계정 이름}
- 역할: Analytics Data API Viewer
- 서비스 계정 생성 후, 키 > 키 추가 > JSON 선택 후 원하는 폴더에 다운로드한다.
- 예시 경로: D://xxxx.json
👉 이 파일의 경로가 코드의 SERVICE_ACCOUNT_JSON_PATH에 들어가게 된다. - 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 출력용으로 가공하면 된다.