# ‘GA4 데이터 도착’ 신호를 잡아내는 자동 분류기

평탄화 마트를 매일 자동으로 갱신하려면 ‘오늘 GA4 데이터가 들어왔다’는 신호가 필요합니다. Google Cloud의 Log Router를 메일 필터 비유로 풀어 보고, GA4 데이터 도착 한 순간만 골라내는 조건과 다음 단계(Pub/Sub)로 넘기는 흐름을 비개발자도 따라올 수 있게 정리합니다.

- 카테고리: BigQuery
- 소요 시간: 약 7분
- 난이도: 입문
- 업데이트: 2026.05.28
- 원문: /wiki/playbook/bigquery-checklist/what-is-log-router

## 목차

- [왜 Log Router가 필요한가](#why)
- [Log Router를 한 문장으로](#concept)
- [싱크(sink) — 조건 + 보낼 곳](#parts)
- [‘GA4 데이터가 들어왔다’는 신호는 어떻게 골라내나](#ga4-filter)
- [보낼 곳은 보통 Pub/Sub](#destination)
- [전체 자동화 흐름 안에서의 위치](#pipeline)
- [자주 묻는 질문](#faq)

평탄화 마트를 매일 ‘사람 손 없이’ 갱신하려면 한 가지 신호가 필요합니다 — **“오늘 GA4 데이터가 BigQuery에 도착했다”**는 신호입니다. 그 신호를 잡아 다음 단계로 흘려 보내 주는 첫 출입구가 Google Cloud의 **Log Router**입니다. 이 글은 Log Router가 무엇인지, 왜 분석 자동화의 첫 단계에 등장하는지, 그리고 어떤 조건을 걸어 ‘GA4 데이터가 들어온 순간’만 골라내는지를 비개발자도 따라올 수 있게 풀어 봅니다.

## 왜 Log Router가 필요한가

GA4 BigQuery 연동을 켜 두면 매일 한 번 `events_YYYYMMDD` 일별 테이블이 새로 들어옵니다. 이 데이터를 [**평탄화 마트**](/wiki/playbook/bigquery-checklist/why-flatten-ga4-bigquery-data)로 가공하는 작업도 매일 한 번 해야 하는데, 사람이 그 시간을 매번 맞춰 손으로 돌릴 수는 없습니다.

두 가지 방식이 있습니다.

- **(A) 정해 둔 시각에 자동 실행** — “매일 새벽 4시에 자동으로 갱신해라”. 단순하지만, GA4 데이터 도착 시각이 GA4 속성마다 30분~수 시간씩 달라서 ‘아직 안 왔는데 돌렸다’는 사고가 흔합니다.
- **(B) ‘실제로 도착했을 때’ 자동 실행** — “GA4 데이터가 BigQuery에 도착하면 그때 갱신을 시작해라”. 도착 시각 편차를 자연스럽게 흡수합니다.

우리가 만드는 자동화는 (B) 방식입니다. 그러려면 ‘GA4 데이터가 도착했다’는 한 줄짜리 알림을 어딘가에서 듣고 있어야 하는데, 이 알림이 만들어지고 외부로 흘러나가는 지점이 바로 **Log Router**입니다.

## Log Router를 한 문장으로

Log Router를 한 문장으로 옮기면 — **“Google Cloud 안에서 일어나는 모든 일의 로그 중에서, 조건에 맞는 것만 골라 다른 곳으로 자동 전달해 주는 분류기”**입니다. 메일 앱의 ‘필터 규칙’과 같은 개념이라고 보면 됩니다.

- **모든 일이 로그로 남는다** — BigQuery에 새 테이블이 만들어졌다, 누군가 권한을 바꿨다, Cloud Functions가 실행됐다 같은 ‘활동’이 한 줄씩 기록됩니다.
- **그 중 일부에만 관심이 있다** — 우리는 ‘GA4 데이터셋에 새 일별 테이블이 만들어진 순간’ 한 가지만 알면 됩니다.
- **관심 있는 로그만 다른 곳으로 보낸다** — Log Router의 역할. ‘조건 = 이런 로그를 찾으면’, ‘보낼 곳 = 거기로 한 줄 보내라’.

> **팁**
>
> **Log Router는 GA4·BigQuery 전용 기능이 아닙니다.** Google Cloud 전반의 로그를 다루는 일반 기능이며, 우리가 그 기능을 ‘GA4 데이터 도착 감지’에 빌려 쓰는 모양새입니다.

### Log Router 페이지 둘러보기

Cloud Console > 좌측 메뉴 **로깅** > **로그 라우터**로 들어가면 다음 화면을 만납니다. 첫 인상은 ‘몇 개의 규칙이 표로 나열된 화면’입니다.

![Google Cloud Console 로그 라우터 화면. 좌측 사이드바에 '로깅' 섹션이 펼쳐져 있고 '대시보드·로그 탐색기·로그 라우터(선택됨)·로그 스토리지·측정항목 관리·그룹·설정·권한' 메뉴가 나열되어 있다. 상단에는 hurdlers.kr 조직 선택과 '싱크 만들기·복사·삭제' 버튼이 있고, 본문은 '로그 라우터 싱크' 탭 안의 표로 '_Default'와 '_Required' 두 개의 기본 싱크가 사용·설정·유형·이름·설명·포함·가로채기·대상 위치·생성일·최종 업데이트 컬럼과 함께 나열되어 있다.](/wiki-assets/playbook/what-is-log-router/01-log-router-page.png)

> **화면 1.** 로그 라우터 페이지. 새 프로젝트엔 보통 `_Default`·`_Required` 두 시스템 싱크만 있고, 우리가 만드는 ‘GA4 데이터 도착 감지’ 싱크는 좌측 상단 *+ 싱크 만들기* 버튼으로 한 줄 더 추가하게 됩니다.

이 화면을 처음 봤을 때 가장 헷갈리는 건 ‘이미 두 개가 있다’는 점입니다. `_Default`는 ‘기본 제공 로그 보관소로 보내라’, `_Required`는 ‘감사용 필수 로그를 별도 보관소로 보내라’는 Google이 자동으로 만들어 둔 시스템 규칙입니다. 손대지 않는 게 좋고, 우리는 옆에 새 싱크 한 개를 추가하는 식으로 다룹니다.

## 싱크(sink) — 조건 + 보낼 곳

Log Router 안에서 우리가 만드는 한 개의 규칙을 **싱크(sink)**라고 부릅니다. 싱크 하나는 두 가지로 구성됩니다.

| 구성 요소 | 역할 | 비유 |
| --- | --- | --- |
| **필터(filter)** | ‘어떤 로그를 찾을지’의 조건 | 메일 필터의 ‘제목에 영수증 포함’ 같은 조건 |
| **도착지(destination)** | ‘찾은 로그를 어디로 보낼지’ | 메일 필터의 ‘영수증 폴더로 이동’ |

싱크는 여러 개를 동시에 둘 수 있고, 한 로그가 여러 싱크의 조건에 동시에 걸려도 됩니다. 즉 같은 ‘GA4 데이터 도착’ 알림을 ‘분석 자동화용’과 ‘슬랙 알림용’ 두 군데로 나란히 보낼 수도 있습니다.

## ‘GA4 데이터가 들어왔다’는 신호는 어떻게 골라내나

Google Cloud에는 매일 매시 수많은 로그가 쌓입니다. 그 중에서 우리가 원하는 한 줄 — **“GA4 데이터셋에 오늘 자 일별 테이블이 새로 만들어진 사건”**만 골라내려면 조건을 네 가지 쌓아야 합니다.

**GA4 데이터 도착 감지 — 싱크 필터식**
```text
protoPayload.methodName = "jobservice.jobcompleted"
protoPayload.authenticationInfo.principalEmail = "firebase-measurement@system.gserviceaccount.com"
protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.load.destinationTable.datasetId = "analytics_502771866"
protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.load.destinationTable.tableId =~ "^events_\d+"
```

한 줄씩 일상어로 풀어 보면 다음과 같습니다.

- **1번째 줄** — “BigQuery 작업이 ‘완료된’ 사건만 본다.” GA4 export는 BigQuery 관점에서 매일 끝나는 적재 작업(Job)입니다.
- **2번째 줄** — “그 작업을 일으킨 주체가 GA4 내보내기 서비스 계정(`firebase-measurement@…`)인 것만.” 사람이 손으로 돌린 쿼리와 GA4 자동 적재를 구분해 줍니다.
- **3번째 줄** — “그 작업이 적재한 테이블이 우리 GA4 데이터셋(`analytics_502771866`) 안인 것만.”
- **4번째 줄** — “결과 테이블 이름이 `events_` + 숫자로 시작하는 것만.” 정규식 `^events_\d+`는 `events_20260529`는 통과시키고 실시간용 `events_intraday_…`는 자동으로 제외합니다(`events_` 다음이 숫자가 아니라 `i`라서). 우리는 ‘하루치 최종본’만 다룹니다.

이 다섯 줄을 만족하는 로그가 하루에 GA4 속성당 정확히 한 건 발생합니다. Log Router는 그 한 건을 잡아 우리가 지정한 도착지로 흘려 보냅니다.

> **주의**
>
> **필터식을 직접 외울 필요는 없습니다.** Cloud Console > 로깅 > *로그 탐색기*에서 실제 GA4 export 로그를 한 건 찾아 ‘이 항목으로 필터 만들기’를 누르면, 위와 비슷한 식이 자동으로 만들어집니다. 그 식을 그대로 복사해서 싱크에 붙여 넣는 방식이 일반적입니다.

## 보낼 곳은 보통 Pub/Sub

Log Router 싱크의 ‘도착지(destination)’로 고를 수 있는 곳은 네 군데입니다.

| 도착지 | 어떤 용도 |
| --- | --- |
| **Pub/Sub 토픽** | ‘로그가 발생한 즉시 다음 동작(예: 자동 마트 갱신)으로 이어 가고 싶을 때’. GA4 자동화 표준. |
| **BigQuery 데이터셋** | 로그를 표 형태로 쌓아 두고 ‘누가 언제 무엇을 했나’를 SQL로 조회하고 싶을 때. |
| **Cloud Storage 버킷** | 장기 보관용. 감사/규정 준수 목적의 ‘파일로 떨어뜨려 두기’. |
| **다른 Cloud Logging 버킷** | 같은 Cloud Logging 안의 다른 보관소로 옮기기. 보존 기간 관리용. |

우리가 만드는 자동화는 ‘로그가 발생한 즉시 다음 동작’을 원하니 **Pub/Sub 토픽**이 정답입니다. Pub/Sub이 무엇이고 왜 자동화에 적합한지는 다음 글에서 자세히 다룹니다.

## 전체 자동화 흐름 안에서의 위치

Log Router 혼자서는 마트를 만들지 않습니다 — ‘릴레이의 첫 주자’ 역할입니다. 전체는 네 단계로 이어집니다.

### GA4 데이터 도착 → 평탄화 마트 자동 갱신 4단계

① Log Router가 ‘GA4 데이터 도착’을 감지**이번 글**

② 그 사실을 Pub/Sub이 메시지로 받아 둠**다음 글**

③ Cloud Function이 메시지를 받아 실행을 시작**그 다음 글**

④ 평탄화 SQL이 자동 실행되어 마트가 갱신**마지막 글**

네 글을 모두 읽고 나면 ‘GA4 데이터 들어옴 → 분석용 마트 자동 갱신’이라는 한 흐름이 완성됩니다. 한 번 세팅해 두면 사람이 손댈 일이 없는 운영 흐름이 되며, 전 구간 비용은 보통 무료 한도 안입니다(자세한 비용은 [**BigQuery 예상 비용**](/wiki/playbook/bigquery-checklist/how-to-estimate-bigquery-costs) 참고).

## 자주 묻는 질문

### Log Router를 따로 쓰지 않고 ‘매일 새벽 X시에 자동 실행’으로는 안 되나요?

됩니다. 다만 GA4 데이터 도착 시각이 GA4 속성마다 30분~수 시간씩 달라, 고정 시각으로 잡으면 ‘아직 안 들어왔는데 갱신을 시작해서 어제 분량만 다시 만들어졌다’는 일이 자주 발생합니다. Log Router를 쓰는 이유는 ‘실제 도착 시점’에 맞춰 갱신을 시작하기 위해서입니다.

### Log Router 자체에 비용이 드나요?

싱크를 만들고 로그를 라우팅하는 동작 자체는 무료입니다. 보내는 도착지에서 발생하는 비용(예: Pub/Sub 메시지 보유, BigQuery 적재)만 추가로 계산되는데, GA4 도착 감지처럼 하루에 GA4 속성당 한 건 수준이면 모든 도착지가 사실상 0원입니다.

### 필터식을 직접 작성해야 하나요?

아닙니다. Cloud Console > 로깅 > **로그 탐색기**에서 실제 GA4 export 로그 한 건을 찾은 뒤 ‘이 항목으로 필터 만들기’를 누르면 정확한 식이 자동으로 생성됩니다. 그것을 복사해서 싱크에 붙여 넣는 방식이 가장 안전합니다.

### 싱크를 만들었는데 잘 동작하는지 어떻게 확인하나요?

Cloud Console > 로깅 > 로그 라우터 페이지에서 만든 싱크 옆 메뉴의 *‘일치하는 로그 보기’*를 누르면, 그 싱크가 최근에 보낸 로그 목록이 그대로 펼쳐집니다. 처음 만든 직후 며칠 동안 잘 잡히고 있는지 확인하는 가장 빠른 길입니다.

### 여러 GA4 속성의 데이터를 하나의 분석 프로젝트로 모을 수 있나요?

네. 싱크의 도착지로 **다른 프로젝트의 Pub/Sub 토픽**을 지정할 수 있습니다. 그룹사 환경에서 여러 사이트의 GA4 데이터를 한 분석 프로젝트로 모아 자동 처리하는 패턴에 자주 쓰입니다.

### Log Router로 ‘이상 상황 알림’도 만들 수 있나요?

알림은 별도 기능인 **로그 기반 알림(Log-based alerts)**이 적합합니다. Log Router는 ‘로그를 어디로 보낼지’에 특화돼 있고, 알림은 ‘이런 조건이 N분에 X번 이상이면 메일/PagerDuty로 알려라’ 같은 임계치 기반이라 메커니즘이 다릅니다. 두 기능을 함께 쓰면 ‘자동 처리는 Log Router로, 사람 호출은 Log-based alerts로’ 깔끔하게 나뉩니다.

## Navigation

- [전체 플레이북 Markdown sitemap](/wiki/playbook/sitemap.md)

### BigQuery

- [BigQuery](/wiki/playbook/bigquery-checklist)
- [BigQuery 온보딩](/wiki/playbook/bigquery-checklist/bigquery-onboarding-guide)
- [BigQuery 인증 설정](/wiki/playbook/bigquery-checklist/how-to-set-up-bigquery-authentication)
- [BigQuery 데이터셋·테이블 설계](/wiki/playbook/bigquery-checklist/bigquery-dataset-and-table-design-guide)
- [BigQuery 쿼리·비용 제어](/wiki/playbook/bigquery-checklist/bigquery-query-and-cost-control-guide)
- [BigQuery 쓰기·MERGE·CDC](/wiki/playbook/bigquery-checklist/bigquery-data-write-and-cdc-guide)
- [BigQuery 코드 예제 모음](/wiki/playbook/bigquery-checklist/bigquery-code-examples)
- [BigQuery로 들어오는 GA4 데이터](/wiki/playbook/bigquery-checklist/what-is-ga4-data-in-bigquery)
- [BigQuery Studio 인터페이스 이해하기](/wiki/playbook/bigquery-checklist/what-is-bigquery-studio-interface)
- [BigQuery 예상 비용](/wiki/playbook/bigquery-checklist/how-to-estimate-bigquery-costs)
- [무료 버전(샌드박스) 해제해야 하는 이유](/wiki/playbook/bigquery-checklist/why-upgrade-from-bigquery-sandbox)
- [GA4 BigQuery 데이터를 왜 평탄화해야 하나](/wiki/playbook/bigquery-checklist/why-flatten-ga4-bigquery-data)
- [Log Router란?](/wiki/playbook/bigquery-checklist/what-is-log-router) (현재 문서)
- [Pub/Sub이란?](/wiki/playbook/bigquery-checklist/what-is-pubsub)
- [Cloud Functions이란?](/wiki/playbook/bigquery-checklist/what-is-cloud-function-and-run)
- [GA4 export 시점에 예약 쿼리 자동 실행하기](/wiki/playbook/bigquery-checklist/how-to-trigger-scheduled-query-on-ga4-export)
- [테이블 정의서는 왜 필요한가](/wiki/playbook/bigquery-checklist/why-table-definition-doc)
- [Event_Flat 테이블 이해하기](/wiki/playbook/bigquery-checklist/what-is-event-flat-table)
- [Item_Performance 테이블 이해하기](/wiki/playbook/bigquery-checklist/what-is-item-performance-table)
