# Braze to BigQuery, BigQuery to Braze: CDI와 Currents로 양방향 연동하기

> 출처: https://retn.kr/blog/bigquery-to-braze/ · 수정 2026-10-16 · 리텐션 주식회사

BigQuery → Braze는 Cloud Data Ingestion(CDI), Braze → BigQuery는 Currents + Cloud Storage입니다. 대형 커머스 고객사의 상품 카탈로그를 매일 동기화한 경험을 바탕으로 두 방향의 설정과 주의점을 정리했습니다.

> 2026년 10월 16일 전면 개정. 2020년 5월 첫 글은 OWOX, Google Sheets, Zapier를 엮어 BigQuery 데이터를 CRM으로 보내는 우회 방법을 다뤘습니다. 지금은 Braze가 두 방향 모두 공식 기능을 제공합니다. 2026년 10월 Braze·Google Cloud 공식 문서를 기준으로 글 전체를 다시 썼습니다.

이 글은 BigQuery와 Braze 사이에서 데이터를 옮겨야 하는 CRM 마케터, 그로스 팀장, 데이터 담당자를 위한 글입니다. 방향은 두 가지입니다. 하나는 BigQuery 데이터를 Braze로 보내는 방향(BigQuery to Braze)입니다. 다른 하나는 Braze 이벤트를 BigQuery로 가져오는 방향(Braze to BigQuery)입니다. 두 방향은 쓰는 기능이 다릅니다.

## TLDR

- BigQuery → Braze: Braze Cloud Data Ingestion(CDI)이 BigQuery 테이블을 정해진 주기로 읽습니다. 사용자 속성, 이벤트, 구매, 카탈로그를 Braze로 동기화합니다.
- Braze → BigQuery: Braze Currents는 BigQuery에 직접 연결하지 않습니다. Currents가 Google Cloud Storage에 Avro 파일을 쓰고, BigQuery가 그 파일을 적재합니다.
- 카탈로그 동기화 테이블에는 ID, PAYLOAD, UPDATED_AT, DELETED 컬럼을 둡니다. DELETED가 true인 행은 Braze 카탈로그에서 그 항목을 지웁니다.
- Currents는 이벤트를 최소 한 번(at-least-once) 보냅니다. BigQuery에서 id 필드로 중복을 지우세요.
- 저희 팀은 대형 커머스 고객사의 상품 카탈로그를 BigQuery → Braze Catalog로 매일 CDI 동기화합니다.

## 한눈에 보기: BigQuery ↔ Braze 공식 연동 경로

| 방향 | Braze 기능 | 옮기는 데이터 | 주기 |
| --- | --- | --- | --- |
| BigQuery → Braze | Cloud Data Ingestion(CDI) | 사용자 속성, 커스텀 이벤트, 구매 이벤트, 사용자 삭제 요청, 카탈로그 항목 | 대시보드 기본 최소 15분 ~ 월 1회 예약, 또는 API로 즉시 실행 |
| Braze → BigQuery | Currents + Google Cloud Storage | 메시지 반응 이벤트, 고객 행동 이벤트 (Avro 파일) | 배치가 차거나 5분이 지나면 전송 |

출처: [Braze Cloud Data Ingestion — Braze Docs](https://www.braze.com/docs/user_guide/data/unification/cloud_ingestion?ref=retn.kr), [Currents FAQ — Braze Docs](https://www.braze.com/docs/user_guide/data/distribution/braze_currents/faq?ref=retn.kr)

## BigQuery to Braze: Cloud Data Ingestion(CDI)

CDI는 Braze가 데이터 웨어하우스에 직접 접속해서 새 행을 읽어 가는 기능입니다. BigQuery 외에 Snowflake, Redshift, Databricks, Microsoft Fabric도 지원합니다. ([Braze Cloud Data Ingestion — Braze Docs](https://www.braze.com/docs/user_guide/data/unification/cloud_ingestion?ref=retn.kr))

### CDI로 보낼 수 있는 데이터

- 사용자 속성 (중첩 속성, 객체 배열, 구독 상태 포함)
- 커스텀 이벤트와 구매 이벤트
- 사용자 삭제 요청
- 카탈로그 항목

### 동기화 주기

- 대시보드에서 고를 수 있는 최소 간격은 기본 15분입니다. 5분 간격이 필요하면 Braze 지원팀이나 담당 CSM에게 요청합니다.
- BigQuery 적재 작업이 끝날 때 Trigger a sync 엔드포인트를 호출하면 바로 동기화합니다. 이 호출은 정기 일정을 바꾸지 않습니다.
- 통합 하나에서는 동기화가 한 번에 하나만 돕니다.

### BigQuery 테이블 구조 (사용자 데이터)

Braze는 UPDATED_AT 값이 마지막 동기화 값보다 늦은 행만 읽습니다.

| 컬럼 | 타입 | 필수 여부 | 설명 |
| --- | --- | --- | --- |
| UPDATED_AT | TIMESTAMP | 필수 | 행을 추가하거나 바꾼 시각 |
| PAYLOAD | JSON | 필수 | 사용자 프로필에 넣을 필드와 값 |
| EXTERNAL_ID | STRING | 선택 | Braze의 external_id |
| ALIAS_NAME, ALIAS_LABEL | STRING | 선택 | 사용자 별칭(alias) |
| BRAZE_ID | STRING | 선택 | Braze SDK가 만든 ID. 이 값으로는 새 사용자를 만들 수 없음 |
| EMAIL, PHONE | STRING | 선택 | 같은 값을 가진 프로필이 여럿이면 가장 최근에 바뀐 프로필을 업데이트 |

- 한 행에는 사용자 식별자를 한 종류만 넣습니다.
- PAYLOAD 한 행에는 속성을 250개까지 넣을 수 있습니다.
- Braze는 PAYLOAD가 1MB를 넘는 행을 거부합니다.
- UPDATED_AT을 일·주·시간 단위로 파티션하면 BigQuery가 읽는 데이터가 줄어듭니다. 다른 필드로는 파티션하지 마세요.

출처: [Data warehouse integrations — Braze Docs](https://www.braze.com/docs/user_guide/data/unification/cloud_ingestion/integrations?ref=retn.kr)

### BigQuery 권한 설정

1. GCP에 Braze 전용 서비스 계정을 만듭니다.
1. 서비스 계정에 BigQuery Connection User, BigQuery User, BigQuery Data Viewer, BigQuery Job User 역할을 줍니다.
1. 인증 방식을 고릅니다. Workload Identity Federation을 쓰면 키 파일을 만들지 않습니다. 서비스 계정 JSON 키를 올리는 방식도 됩니다.
1. 네트워크 정책이 있으면 Braze 리전의 IP를 허용합니다.
1. Braze 대시보드의 Data Settings > Cloud Data Ingestion > Sources에서 Google BigQuery 소스를 추가합니다.
1. 연결을 테스트하고 동기화를 만듭니다.

### 비용과 한도

- 데이터 포인트 과금 계약이라면 Braze는 CDI 업데이트를 /users/track 업데이트와 같은 기준으로 과금합니다.
- CDI는 Braze API 레이트 리밋을 다른 API 호출과 함께 씁니다.

## Braze to BigQuery: Currents와 Google Cloud Storage

Currents는 Braze의 메시지 반응 이벤트와 고객 행동 이벤트를 내보내는 데이터 스트림입니다. 파일 형식은 Apache Avro입니다. ([Braze Currents — Braze Docs](https://www.braze.com/docs/user_guide/data/distribution/braze_currents?ref=retn.kr))

Braze 공식 문서는 Currents가 BigQuery에 직접 연결하지 않는다고 밝힙니다. Currents는 Google Cloud Storage(GCS) 버킷에 이벤트 파일을 씁니다. 그다음 BigQuery 도구로 그 파일을 적재하거나 조회합니다. ([Google Cloud Storage for Currents — Braze Docs](https://www.braze.com/docs/partners/data_and_analytics/cloud_storage/google_cloud_storage_for_currents?ref=retn.kr))

Currents 커넥터는 여러 Pro·Enterprise 패키지에 들어 있습니다. 계약에 포함됐는지는 Braze 어카운트 매니저에게 확인하세요. Currents 이벤트를 Amplitude로 보내 캔버스 증분 효과를 잰 사례는 [브레이즈 캔버스 iROAS 측정 글](/blog/mcp-braze-amplitude-iroas/)에 있습니다.

### 설정 순서

1. GCP에서 커스텀 역할을 만듭니다. 권한은 storage.objects.create, storage.objects.delete, storage.objects.list, storage.objects.get, storage.buckets.get입니다. storage.objects.delete는 선택입니다.
1. 서비스 계정을 만들고 이 역할을 줍니다. 그다음 JSON 키를 만듭니다. Currents는 Workload Identity Federation을 지원하지 않습니다.
1. Braze에서 Currents > + Create Current > Google Cloud Storage Data Export를 고릅니다.
1. JSON 키, 버킷 이름, 프리픽스(선택)를 넣습니다.
1. 내보낼 이벤트를 고르고 Current를 시작합니다.
1. BigQuery Data Transfer Service로 GCS의 Avro 파일을 BigQuery 테이블에 정기 적재합니다. 이 서비스는 Avro 형식을 지원합니다. APPEND(증분) 전송은 마지막 성공 이후에 바뀐 파일만 적재합니다. ([Cloud Storage 전송 소개 — Google Cloud](https://docs.cloud.google.com/bigquery/docs/cloud-storage-transfer-overview?hl=ko&ref=retn.kr))

### BigQuery에서 챙길 것

- 중복: Currents는 at-least-once 전달을 보장합니다. 같은 이벤트가 두 번 들어올 수 있습니다. 모든 이벤트에 있는 id 필드로 중복을 지우세요.
- 시간대: Currents 타임스탬프는 모두 UTC입니다. Braze 대시보드 지표는 회사 시간대를 따릅니다. 일 단위로 비교할 때는 한국 시간(KST)으로 바꾼 뒤 집계하세요.
- 전송 주기: Braze는 배치가 차거나 5분이 지나면 이벤트를 보냅니다. 이벤트가 적은 커넥터는 5~30분 뒤에 도착합니다.
- 늦게 도착한 이벤트: Braze는 늦게 들어온 이벤트를 처리 시점의 date= 경로에 씁니다. 지난 경로를 다시 채우지 않습니다. 새로 쓰인 파일을 처리하는 방식으로 파이프라인을 만드세요.
- 경로의 version 값: 저장 경로에는 event_type=, date=, version= 구간이 있습니다. version 값은 Currents 릴리스마다 월 단위로 올라갑니다. 특정 버전을 고정하지 말고 루트 경로부터 읽으세요. BigQuery 외부 테이블을 Hive 파티션으로 읽을 때는 version 경로를 컬럼으로 쓰지 마세요. 인앱 메시지 Abort 이벤트의 version 필드와 충돌합니다.
- 버킷 장애: 버킷 쓰기가 5일 넘게 실패하면 Braze는 이벤트를 버립니다. 버린 이벤트는 복구할 수 없습니다. GCP 키를 바꾸면 Currents 설정의 키도 바로 바꾸세요.

출처: [Currents FAQ — Braze Docs](https://www.braze.com/docs/user_guide/data/distribution/braze_currents/faq?ref=retn.kr), [Event delivery semantics — Braze Docs](https://www.braze.com/docs/user_guide/data/distribution/braze_currents/setting_up_currents/event_delivery_semantics?ref=retn.kr)

### ELT 도구를 쓸 때

- Fivetran의 Braze 커넥터는 이벤트 테이블 데이터를 Braze Currents에서 가져옵니다. ([Braze connector — Fivetran Docs](https://fivetran.com/docs/connectors/applications/braze?ref=retn.kr))
- Airbyte의 Braze 커넥터는 Braze REST API로 캠페인, 캔버스, 세그먼트 목록과 분석 지표를 가져옵니다. 사용자 단위 메시지 이벤트가 필요하면 Currents 경로를 쓰세요. ([Braze — Airbyte Docs](https://docs.airbyte.com/integrations/sources/braze?ref=retn.kr))

## 어떤 방법을 고를까

| 하고 싶은 일 | 추천 경로 |
| --- | --- |
| BigQuery에 정리된 사용자 속성을 Braze 세그먼트에 쓰기 | CDI (사용자 데이터) |
| 상품·콘텐츠 데이터를 메시지 개인화에 쓰기 | CDI (카탈로그) |
| 발송·오픈·클릭 이벤트를 BigQuery에서 분석하기 | Currents → GCS → BigQuery |
| 메시지를 보내는 순간 외부 API 값을 넣기 | Connected Content |

Connected Content 설정은 [Braze Connected Content와 Sheet2API 가이드](/blog/braze-connected-contents/)에 정리했습니다. Braze 문서도 CDI와 Currents를 함께 쓰면 데이터 흐름이 한 바퀴로 닫힌다고 설명합니다. ([Braze Cloud Data Ingestion — Braze Docs](https://www.braze.com/docs/user_guide/data/unification/cloud_ingestion?ref=retn.kr))

> **BigQuery와 Braze 연동, 설계부터 같이 하고 싶다면**
>
> BRAZE CONSULTING · 리텐션CDI 카탈로그 동기화, Currents 적재, 캔버스 증분 측정까지 브레이즈 컨설팅으로 함께 설계합니다.
>
> [브레이즈 컨설팅 문의하기 →](https://retn.kr/contact/?utm_source=blog&utm_medium=cta&utm_campaign=consulting&utm_content=bigquery-to-braze)

## 실무 사례: 상품 카탈로그를 BigQuery → Braze Catalog로 매일 동기화

저희 팀은 대형 커머스 고객사의 상품 카탈로그를 BigQuery → Braze Catalog로 매일 CDI 동기화합니다. 신규·변경·삭제 상품을 모두 반영합니다. 이미지 규격 변환도 같은 파이프라인에서 처리합니다.

동기화한 카탈로그를 메시지 개인화에 쓰는 방법은 [브레이즈 커머스 추천 시스템 글](/blog/recommendation-system/)에 정리했습니다.

### 카탈로그 동기화 테이블

| 컬럼 | 타입 | 필수 여부 | 설명 |
| --- | --- | --- | --- |
| ID | STRING | 필수 | 카탈로그 항목 ID |
| PAYLOAD | JSON | 필수 | 항목에 넣을 필드와 값 |
| UPDATED_AT | TIMESTAMP | 필수 | 행을 추가하거나 바꾼 시각 |
| DELETED | BOOLEAN | 선택 | true면 그 항목을 카탈로그에서 지움 |

출처: [Sync and delete catalog data — Braze Docs](https://www.braze.com/docs/user_guide/data/unification/cloud_ingestion/sync_catalogs_data?ref=retn.kr)

아래 뷰는 Braze 문서의 BigQuery 예시를 바탕으로 만든 예시입니다. 프로젝트, 데이터셋, 컬럼 이름은 예시입니다.

```
<code class="language-sql">CREATE VIEW IF NOT EXISTS `my-project.braze_ingestion.catalog_sync` AS
SELECT
  last_updated AS UPDATED_AT,
  CAST(product_id AS STRING) AS ID,
  TO_JSON(STRUCT(product_name, price, image_url)) AS PAYLOAD
FROM `my-project.commerce.products`;
</code>
```

이 예시는 Braze 문서의 BigQuery 예시처럼 원본의 수정 시각(`last_updated`)을 씁니다. 그래서 바뀐 행만 보냅니다. 매번 전체를 새로 고치려면 `last_updated` 대신 `CURRENT_TIMESTAMP()`를 씁니다. Braze 문서의 Snowflake·Redshift 예시가 이 방식입니다.

### 실무에서 챙길 점

1. 스키마를 먼저 바꿉니다. 필드를 추가하거나 타입을 바꿀 때는 Braze 카탈로그 대시보드에서 먼저 바꿉니다. 그다음 CDI로 데이터를 보냅니다. Braze는 이 작업을 동기화가 멈춘 시간에 하라고 권장합니다.
1. 삭제도 행으로 보냅니다. Braze는 UPDATED_AT이 새로운 행만 읽습니다. 원본 테이블에서 상품 행이 사라지면 Braze는 그 상품을 지우라는 신호를 받지 못합니다. 그래서 원본에서 빠진 상품은 DELETED를 true로 둔 행으로 따로 만들어야 합니다.
1. 카탈로그는 전체 새로 고침도 괜찮습니다. 카탈로그 동기화는 데이터 포인트를 쓰지 않습니다. 사용량은 저장된 데이터 총량으로 잽니다. 그래서 Braze 문서는 매번 전체를 새로 고치는 뷰를 권장합니다. 반면 사용자 데이터 동기화는 데이터 포인트를 씁니다. 사용자 데이터는 바뀐 행만 보내세요.
1. 이미지 URL은 [https://로](https://xn--2o2b/?ref=retn.kr) 시작해야 합니다. Braze 문서는 Liquid로 불러온 이미지 URL이 [http://이면](http://xn--e42bt1v/?ref=retn.kr) 앱이 멈출 수 있다고 경고합니다. 메시지 유형과 플랫폼마다 권장 이미지 비율도 다릅니다. 그래서 이미지 규격 변환을 동기화 파이프라인에 넣었습니다. ([Create an in-app message with the traditional editor — Braze Docs](https://www.braze.com/docs/user_guide/channels/in_app_messages/traditional?ref=retn.kr))

## 📚 더 읽어보기

- [Braze Connected Content와 Sheet2API로 구글 시트 데이터 연결하기](/blog/braze-connected-contents/)
- [멘탈 모델 3가지로 5분 만에 브레이즈 커머스 추천 시스템 완성하기](/blog/recommendation-system/)
- [AI 마케팅 분석: 브레이즈 캔버스 iROAS 19배 달성 사례](/blog/mcp-braze-amplitude-iroas/)
- [브레이즈(Braze) 초급 벗어나 중·고수로 가는 방법](/blog/braze-road-to-master/)
- [개발자 없이 브레이즈 API 트리거 캠페인 쓰기](/blog/api-campaign/)
