구글 애널리틱스 API 연동을 위한 방법이 다양해서 오히려 헷갈리더라구요.
제가 연동한 방법을 소개합니다!
먼저 프로젝트에서 구글 애널리틱스 API로 데이터를 받아보기 위해서는 3가지 선행 작업이 필요합니다.
GA API를 사용하기 위해서는 GCP 콘솔에서 서비스 계정을 추가하고, API를 호출할 때 필요한 키를 JSON 형태로 다운로드 받아야 합니다.
https://console.cloud.google.com
(사진 추가 예정)
구글 애널리틱스 사이트에서 1번의 서비스 계정을 추가해서 얻은 JSON 파일의 이메일 값을 써야한다.
+
버튼을 눌러 사용자 추가 클릭AAAA예시@AAAAAAA예시.iam.gserviceaccount.com
형태이다.라이브러리 검색 시 Google Analytics의 API가 3종류가 있으며 간략한 소개를 덧붙입니다.
2023년 7월 1일 이후, 새로운 Universal Analytics 프로퍼티의 데이터 처리가 중단되므로, 기존 UA 프로퍼티를 사용 중이 아니라면 이 API를 사용하는 것은 추천되지 않습니다. (gpt의 설명으로 부정확할 수 있습니다.)
Google Analytics의 Universal Analytics와 GA4 데이터를 보고하는 데 사용됩니다.
Google Analytics 4(GA4) 데이터를 추출하는 데 사용됩니다.
사전 작업을 마치고 프로젝트에서 구글 API를 호출하는 방법입니다.
Google API Client 라이브러리 설치가 필요합니다. Node.js 환경에서 호출하는 경우, 먼저 googleapis
라이브러리를 설치해야 합니다.
속성ID(숫자)
npm install googleapis
서비스 계정 키는 이미 JSON 형식으로 받았으므로, 해당 파일을 프로젝트에 안전하게 보관합니다.
저는 루트 디렉토리 secrets 폴더에 해당 JSON 파일을 넣었습니다.
secrets/service-account-key.json
그리고 .env.local
에서 해당 파일경로를 환경변수로 등록했습니다.
GOOGLE_SERVICE_KEY_PATH=secrets/service-account-key.json
잊지말고 .gitlgnore
에 해당 파일경로를 등록해주세요!
# 구글 애널리틱스 서비스 키
/secrets/service-account-key.json
API 호출을 위한 코드입니다. getAnalyticsData 함수의 requestBody에서 dateRanges와 metrics는 필요한 데이터에 따라 변경하시면 됩니다.
저는 누적 방문객을 얻고싶어서 totalUsers으로 했습니다.
reponse의 property: 'properties/속성ID(숫자)'에서 속성 ID는 구글 애널리틱스 설정 -> 속성 설정 -> 속성 -> 속성 세부정보에서 확인할 수 있습니다.
lib/getAnalyticsData.ts
import { google } from 'googleapis'
import path from 'path'
// 서비스 계정 키 파일 경로 설정
const keyFilePath = path.join(process.cwd(), process.env.GOOGLE_SERVICE_KEY_PATH!)
// 인증 클라이언트 생성
const auth = new google.auth.GoogleAuth({
keyFile: keyFilePath,
scopes: ['https://www.googleapis.com/auth/analytics.readonly'],
})
const analyticsData = google.analyticsdata('v1beta')
export async function getAnalyticsData() {
try {
const authClient = await auth.getClient()
const response = await analyticsData.properties.runReport({
auth: authClient,
properties/YOUR_PROPERTY_ID,
// 속성 ID를 직접 파라미터로 전달
requestBody: {
dateRanges: [
{
startDate: '2024-11-04',
endDate: 'today',
},
],
metrics: [
{
name: 'totalUsers',
},
],
},
})
return response.data
} catch (error) {
console.error('Error fetching Analytics Data:', error)
throw error
}
}
// app/page.tsx
export default async function Start() {
try {
const data = await getAnalyticsData()
console.log('Analytics Data:', data)
return (
<div>
{/* data를 사용하여 UI 렌더링 */}
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
)
} catch (error) {
console.error('Error in page:', error)
return <div>Error loading analytics data</div>
}
}
호출한 결과를 보면 다음과 같습니다.
YOUR_PROPERTY_ID
: GA4의 속성 ID. GA4 계정에서 찾을 수 있습니다. 보통 properties/XXXXXX
형태입니다.activeUsers
: 요청하려는 데이터의 메트릭입니다. 다른 메트릭도 사용 가능합니다. 예: sessions
, users
등.dateRanges
: 데이터를 요청할 날짜 범위입니다. 예: 최근 7일('7daysAgo'
)부터 오늘까지('today'
).export async function getAnalyticsData() {
try {
const authClient = await auth.getClient()
const response = await analyticsData.properties.runReport({
auth: authClient,
property: 'properties/466314451',
requestBody: {
dateRanges: [
{
startDate: '2024-01-01',
endDate: 'today',
},
],
metrics: [
{ name: 'totalUsers' },
{ name: 'activeUsers' },
// 추가로 유용한 메트릭들
{ name: 'sessions' }, // 세션 수
{ name: 'averageSessionDuration' }, // 평균 세션 지속 시간
{ name: 'screenPageViews' } // 총 페이지뷰 수
],
},
})
// 응답 데이터 처리 예시
const metrics = response.data.rows[0].metricValues
const analyticsData = {
totalUsers: metrics[0].value,
activeUsers: metrics[1].value,
sessions: metrics[2].value,
avgSessionDuration: metrics[3].value,
pageViews: metrics[4].value,
}
return analyticsData
} catch (error) {
console.error('Error fetching Analytics Data:', error)
throw error
}
}
// 서버 컴포넌트
export default async function Start() {
const data = await getAnalyticsData()
return <Analytics analyticsData={data} />
}
// 클라이언트 컴포넌트
'use client'
type AnalyticsData = {
totalUsers: string
activeUsers: string
sessions: string
avgSessionDuration: string
pageViews: string
}
export function Analytics({ analyticsData }: { analyticsData: AnalyticsData }) {
return (
<div className="space-y-4">
<div>총 방문자 수: {analyticsData.totalUsers}명</div>
<div>현재 활성 사용자: {analyticsData.activeUsers}명</div>
<div>총 세션 수: {analyticsData.sessions}</div>
<div>평균 세션 시간: {Math.round(Number(analyticsData.avgSessionDuration) / 60)}분</div>
<div>총 페이지뷰: {analyticsData.pageViews}</div>
</div>
)
}