안녕하세요. 그로스 마케팅 파트너, 허들러스의 유준혁 엔지니어입니다.
이번 글에서는 GA4의 실시간 데이터 분석 한계를 해결하는 방법과 BigQuery를 활용해 실시간 데이터를 분석하는 방법에 대해 설명하겠습니다. 이를 통해 GA4의 실시간 데이터 분석 한계를 극복하고, 보다 효율적인 실시간 데이터 분석 방법을 제시하겠습니다.
GA4에서 실시간 데이터를 분석하는 것이 어려운 주된 이유는 몇 가지 제한 사항 때문입니다. 우선, GA4의 실시간 보고서는 최대 30분 이내의 데이터만 제공하기 때문에 그 이상의 데이터를 확인하거나 분석하는 것이 불가능합니다. 이는 즉각적인 의사결정이 필요한 상황에서 부족할 수 있습니다.
또한, GA4의 실시간 보고서에는 데이터 처리 지연이 발생할 수 있어, 사용자가 보고 있는 데이터가 실제로는 몇 분 전의 데이터일 가능성이 있습니다. 이러한 제한은 특히 트래픽 급증이나 중요한 이벤트가 발생할 때 데이터 신뢰성에 큰 영향을 미쳐, 실시간 의사결정에 제약을 줄 수 있습니다.
그리고, GA4의 실시간 보고서는 사용자가 보고서를 원하는 대로 커스터마이징할 수 있는 기능이 부족합니다. 보고서를 완전히 제어할 수 없고, 제공되는 기본 정보에만 의존해야 하므로, 기업이 필요로 하는 맞춤형 실시간 보고서를 만들거나 복잡한 데이터 분석을 하는 데 한계가 있습니다.
이러한 이유로 GA4만으로는 실시간 데이터를 충분히 활용하기 어렵습니다. 이를 보완하기 위해 BigQuery와 같은 외부 데이터 웨어하우스 도구를 활용하는 것이 필요합니다. BigQuery는 실시간으로 대용량 데이터를 처리할 수 있는 기능을 제공하여, GA4의 실시간 보고서 한계를 극복하고 실시간 분석을 가능하게 합니다.
GA4 데이터를 실시간으로 분석하려면, 가장 먼저 GA4와 BigQuery를 연동하고 스트리밍 내보내기를 활성화해야 합니다. 데이터 내보내기 옵션에는 일별 내보내기와 스트리밍 내보내기가 있습니다. 일별 내보내기는 하루에 한 번 데이터를 전송하는 반면, 스트리밍 내보내기는 데이터를 실시간으로 events_intraday_YYYYMMDD라는 테이블에 전송합니다.
아직 GA4와 BigQuery를 연동하지 않았다면, 제공된 가이드를 참고하여 BigQuery 연동을 진행해 주세요.
스트리밍 내보내기를 활성화했다면, BigQuery에서 events_intraday_YYYYMMDD라는 추가 테이블을 확인할 수 있습니다. 모든 실시간 데이터는 이 테이블에 저장되며, 새로운 이벤트가 발생할 때마다 해당 날짜에 맞춰 지속적으로 업데이트됩니다. 이 테이블에 있는 데이터는 하루 동안만 유지됩니다. 오늘 저장된 데이터는 내일이 되면 삭제됩니다.
대신 events_YYYYMMDD라는 일별 테이블에 데이터가 저장됩니다. 이를 통해 실시간 데이터를 분석하면서도, 하루가 지나면 일별 데이터로 전환되어 장기적인 분석에 활용할 수 있습니다.
스트리밍 내보내기를 활성화한 후, BigQuery에서 실시간 데이터를 분석하려면 events_intraday 테이블에서 데이터를 추출하는 쿼리를 작성해야 합니다. 이 쿼리를 통해 시간대별 주요 이벤트, 트래픽 소스 등을 분석할 수 있습니다. 이후 이 데이터를 별도의 테이블에 저장하고, 5분마다 자동으로 실행되도록 예약된 쿼리를 설정할 예정입니다.
예약된 쿼리를 설정하면 실시간 데이터가 5분 단위로 업데이트되며, 미리 설정된 테이블에 데이터가 축적됩니다. 예를 들어, **구매(purchase)**와 같은 모든 이벤트들이 시간대별로 집계되며, 이를 통해 사용자의 행동 패턴을 파악하고 마케팅 캠페인의 성과를 실시간으로 추적할 수 있습니다.
다음으로, 각 단계별로 필요한 설정을 설명드리겠습니다:
실시간 데이터 분석에서 가장 중요한 단계는 원하는 데이터를 정확하게 추출하고, 이를 기반으로 실시간 리포트를 구성하는 것입니다. 이를 통해 마케팅 캠페인의 성과를 즉각적으로 파악하고 조정할 수 있습니다.
이번 글에서는 트래픽 소스/매체별 세션 수를 분석하는 쿼리를 다룹니다. GA4의 스트리밍 내보내기 데이터를 활용하여, 실시간으로 업데이트되는 정보를 기반으로 마케팅 캠페인의 성과를 추적할 수 있습니다. 이 쿼리를 통해 특정 소스/매체가 얼마나 많은 세션을 유발했는지 실시간으로 분석할 수 있습니다.
이를 통해 실시간으로 변화하는 마케팅 성과를 추적하고, 데이터를 기반으로 보다 효율적인 마케팅 결정을 내릴 수 있습니다.
쿼리예시)
SELECT
PARSE_DATE(“%Y%m%d”,event_date) AS date,
EXTRACT(HOUR FROM TIMESTAMP_MICROS(event_timestamp) AT TIME ZONE “Asia/Seoul”) as hour,
ifnull(traffic_source.source,'(direct)’) as source,
ifnull(traffic_source.medium,'(none)’) as medium,
count(distinct concat(user_pseudo_id,(select value.int_value from unnest(event_params) where key = ‘ga_session_id’))) as sessions
FROM
`{{프로젝트 이름}}.{{데이터셋 이름}}.events_intraday_*`
WHERE PARSE_DATE(‘%Y%m%d’,event_date) = CURRENT_DATE(“Asia/Seoul”)
group by all
ORDER BY hour DESC
이 쿼리는 GA4의 실시간 데이터를 바탕으로 현재 날짜에 발생한 세션을 시간대별, 트래픽 소스별, 매체별로 집계하는 쿼리입니다. events_intraday_* 테이블에서 오늘 발생한 이벤트 데이터를 추출하여, 시간(hour) 단위로 세션 수를 계산하고 트래픽 소스와 매체에 따라 그룹화한 뒤, 최근 시간 순으로 정렬해 결과를 반환합니다.
쿼리설명)
PARSE_DATE(“%Y%m%d”, event_date) :
event_date 필드를 문자열로 저장된 날짜를 파싱하여 date 필드로 변환합니다. 이를 통해 데이터를 날짜 형식으로 변환하여 활용할 수 있습니다.
EXTRACT(HOUR FROM TIMESTAMP_MICROS(event_timestamp) AT TIME ZONE “Asia/Seoul”) :
event_timestamp를 마이크로초 단위로 가져와서 ‘Asia/Seoul’ 시간대로 변환한 뒤, 시간(HOUR) 단위로 추출합니다. 이를 통해 이벤트가 발생한 시간을 기준으로 시간대별로 데이터를 그룹화 할 수 있습니다.
IFNULL(traffic_source.source, ‘(direct)’) AS source:
이벤트가 발생한 트래픽 소스가 있는 경우 해당 값을 사용하고, 없을 경우에는 ‘(direct)’로 표시합니다.
IFNULL(traffic_source.medium, ‘(none)’) :
트래픽 매체 필드로, 소스와 매체의 결합을 통해 유입 경로를 구체적으로 파악할 수 있습니다. 값이 없을 경우 ‘(none)’으로 대체됩니다.
count(distinct concat(user_pseudo_id,(select value.int_value from unnest(event_params) where key = ‘ga_session_id’))) :
사용자 세션을 고유하게 식별하기 위한 방식으로, user_pseudo_id와 ga_session_id 값을 조합하여 중복되지 않는 세션의 개수를 세는 구문입니다.
쿼리를 작성한 후, BigQuery Studio에서 테스트로 실행하면, 아래와 같이 쿼리 결과가 정상적으로 출력되는 것을 확인할 수 있습니다.
데이터를 자동으로 업데이트하기 위해서는 예약된 쿼리를 설정해야 합니다. 이를 위해 작성한 SQL 쿼리 상단 메뉴에서 ‘일정’ 옵션을 선택합니다.
1. **’세부정보 및 일정’**에서 예약된 쿼리의 이름을 지정합니다.
2. 실행 주기를 설정하는 단계로 넘어가며, 최소 반복 주기는 5분부터 설정 가능합니다. 이번 예시에서는 5분 간격으로 설정했지만, 필요에 따라 더 짧거나 긴 간격으로 주기를 변경할 수 있습니다.
일정을 모두 작성하셨다면, 화면 아래로 내려가 **”쿼리 결과를 저장할 대상”**에서 데이터 세트 이름과 테이블 이름을 지정해야 합니다. 데이터 세트 이름은 {{프로젝트 이름}}.{{데이터셋 이름}} 형식으로 작성하고, 테이블 이름은 원하는 대로 설정할 수 있습니다.
이때 중요한 점은 “대상 테이블 쓰기” 옵션에서 덮어쓰기를 반드시 선택해야 한다는 것입니다. 만약 “추가” 옵션을 선택하게 되면, 기존 데이터 위에 새로운 데이터가 추가되면서 데이터 중복이 발생할 수 있습니다.
모든 설정이 완료되면 “저장” 버튼을 눌러 쿼리를 예약합니다. 예약된 쿼리가 실행될 때 로그를 이메일이나 Slack으로 알림을 받을 수 있도록 설정할 수 있습니다. 다만, 이번 글에서는 실시간 데이터 추출에 초점을 맞추고 있으므로 이러한 고급 기능은 추후에 자세히 다루겠습니다.
이후, 왼쪽 메뉴 바에서 예약된 쿼리를 클릭하면 설정한 예약된 쿼리를 확인할 수 있습니다.
해당 쿼리의 세부 정보를 확인할 수 있으며, 5분 단위로 반복 실행되도록 설정한 예시에서는 쿼리가 5분 간격으로 정상 작동하는지 확인할 수 있습니다. 이를 통해 실시간 데이터가 설정한 주기마다 자동으로 업데이트되는지 모니터링할 수 있습니다.
또한, 생성된 BigQuery 테이블에 대한 정보와 스키마를 확인할 수 있으며, 미리보기를 클릭해 데이터가 정상적으로 수집되고 있는지 직접 확인할 수 있습니다. 이렇게 설정을 완료하면 실시간 데이터 분석이 자동화됩니다.
이제 생성한 BigQuery 테이블을 Looker Studio와 연동하여 실시간 차트를 구현할 수 있습니다. 이를 위해, BigQuery 테이블 우측 상단의 ‘내보내기’ 메뉴에서 Looker Studio로 탐색을 클릭합니다. 이 과정에서 실시간 데이터가 Looker Studio로 연결되고, 차트 생성 작업을 시작할 수 있습니다.
Looker Studio에서 원하는 차트 유형을 선택한 후, 실시간으로 시간대별 세션 수를 시각화할 수 있습니다. 현재 구현된 대시보드에서는 시간별 세션 수를 확인할 수 있으며, 추가적으로 더 정밀한 분석을 위해 분 단위로 데이터를 추적하는 테이블을 생성하여, 분 단위 세션 수를 표시하는 SQL 쿼리를 작성하는 것도 가능합니다.
이와 같이 Looker Studio와 BigQuery의 연동을 통해 실시간 데이터 분석 결과를 시각적으로 확인할 수 있으며, 이를 바탕으로 더욱 효율적인 데이터 기반 의사결정을 내릴 수 있습니다.
이번 글에서는 GA4의 실시간 보고서 한계를 보완하기 위해 BigQuery와 Looker Studio를 활용하여 실시간 데이터를 분석하고 시각화하는 방법을 다뤘습니다. GA4와 BigQuery를 연동하고 스트리밍 내보내기를 활성화한 후, 실시간 데이터를 추출하는 쿼리 작성과 예약된 쿼리 설정을 통해 데이터를 자동으로 업데이트하는 과정을 설명했습니다. 마지막으로, 생성된 데이터를 Looker Studio와 연동해 실시간 차트를 구현하는 방법까지 안내했습니다.
이 과정을 통해 시간대별 트래픽 소스와 사용자 세션을 분석하는 실시간 리포트를 구성하여 GA4의 제한된 실시간 보고서를 보완하고, 보다 효과적인 실시간 의사결정을 내릴 수 있는 기반을 마련할 수 있습니다.
다음 글에서는 예약된 쿼리가 실행될 때 이메일이나 Slack 알림을 설정하는 Pub/Sub 기능을 소개하고, Cloud Functions와 Cloud Scheduler를 활용해 예약된 쿼리를 더 효율적으로 관리하고 테이블 최적화하는 방법에 대해 자세히 다루겠습니다.
긴 글 읽어주셔서 감사합니다.
해당 글은 그로스 마케팅 파트너 허들러스와 모비인사이드의 파트너쉽으로 제공되는 기사입니다.
모비인사이드의 뉴스레터를 구독해보세요