이벤트 저장 구조¶
개요¶
전송된 이벤트 로그가 BigQuery에 저장되는 구조, attributes JSON 필드의 세부 구조, 전송 규칙을 위반한 로그가 격리되는 방식을 확인할 수 있습니다.
테이블 구조¶
전송된 이벤트 로그는 회사별 BigQuery 데이터셋의 t_raw_event_log 테이블에 저장됩니다.
테이블 컬럼 구조¶
저장 위치¶
| 항목 | 형식 |
|---|---|
| 테이블 | t_raw_event_log |
| 파티셔닝 | dateTime 기준 일별 파티션 |
컬럼 정의¶
| 컬럼명 | 자료형 | 설명 | 예시 |
|---|---|---|---|
userId | STRING | 필수 속성 userId로 전송된 값 | 100001 |
identifierProvider | STRING | 필수 속성 identifierProvider로 전송된 값 | hive |
deviceId | STRING | 필수 속성 deviceId로 전송된 값 | 100000 |
appId | STRING | 필수 속성 appId로 전송된 값 | "com.com2us.game.ios" |
appIdGroup | STRING | 필수 속성 appId를 기반으로 Hive 앱센터의 게임명으로 변환된 값 | com.com2us.game |
dateTime | TIMESTAMP | 필수 속성 eventTime을 UTC로 변환한 값 | 2026-07-20T05:01:01Z |
eventName | STRING | 필수 속성 eventName으로 전송된 값 | asset_drop |
checksum | STRING | 이벤트마다 생성되는 해시값 | HW2FTEB56TEEWER |
bigqueryRegistTimestamp | TIMESTAMP | 이벤트가 BigQuery에 저장된 UTC 시각 | 2026-07-20T05:02:01Z |
attributes | JSON | 사용자 정의 속성 및 자동 수집 속성이 저장되는 JSON 필드 | 아래 참조 |
attributes 예시
{
"hiveAttributes": {
"dataSource": "custom_server",
"geoIpCountry": "KR"
},
"eventAttributes": {
"eventTime": "2026-07-20T14:01:01+09:00",
"level": 10,
"character_name": "AA",
"stage_id": "stage_101"
}
}
테이블 구조 주의사항 & Tips¶
- 재전송 등으로 동일 이벤트가 중복 저장될 수 있으니, 조회 시
checksum기준 중복 제거 쿼리를 함께 사용하는 것을 권장합니다. - 전송 규칙을 위반한 이벤트 로그는 이 테이블이 아닌 rescue 테이블에 저장됩니다. 자세한 내용은 데이터 격리를 참고하세요.
attributes 세부 속성¶
Note
attributes 컬럼은 JSON 타입이며, hiveAttributes와 eventAttributes 두 영역으로 구분됩니다.
attributes 예시¶
{
"hiveAttributes": {
"dataSource": "custom_server",
"geoIpCountry": "KR"
},
"eventAttributes": {
"eventTime": "2026-07-20T14:01:01+09:00",
"level": 10,
"character_name": "AA"
}
}
hiveAttributes¶
파이프라인이 자동으로 처리하여 저장하는 영역입니다.
| 속성명 | 자료형 | 설명 | 예시 |
|---|---|---|---|
dataSource | STRING | 이벤트 로그의 전송 주체. 아래 dataSource 상세 참고 | custom_server |
geoIpCountry | STRING | 파이프라인이 IP 기반으로 판정한 국가 코드 (ISO 3166 alpha-2) | KR |
dataSource 상세¶
dataSource는 이벤트 로그의 전송 주체를 나타내며, 다음 값 중 하나가 자동으로 설정됩니다.
| 값 | 설명 |
|---|---|
airbridge | Airbridge를 통해 수집된 이벤트 |
appsflyer | Appsflyer를 통해 수집된 이벤트 |
adjust | Adjust를 통해 수집된 이벤트 |
singular | Singular를 통해 수집된 이벤트 |
hive_server | Hive 인증, 빌링 등을 통해 자동으로 수집하는 이벤트 |
hive_sdk | Hive SDK가 자동으로 수집하는 퍼널 등의 이벤트 |
custom_server | 고객이 서버에서 전송하는 사용자 정의 이벤트 |
custom_sdk | 고객이 Hive SDK의 이벤트 로그 전송 기능을 통해 전송하는 사용자 정의 이벤트 |
custom_sdk_mig | 고객이 Hive SDK의 이벤트 로그 전송 기능을 통해 구버전 애널리틱스로 전송하는 사용자 정의 이벤트 |
custom_server_mig | 고객이 서버에서 구버전 애널리틱스로 전송하는 사용자 정의 이벤트 |
custom_except | 이벤트 전환 과정에서 예외적인 케이스로 eventAttribute, hiveAttribute를 생성하여 전송하는 이벤트 |
eventAttributes¶
사용자가 전송한 속성과 SDK가 자동 수집한 속성이 저장되는 영역입니다.
| 속성명 | 자료형 | 설명 |
|---|---|---|
eventTime | STRING | 필수 속성으로 전송된 eventTime 원본값 |
| (사용자 정의 속성) | 숫자/문자 | 사용자가 직접 전송한 커스텀 속성 |
| (자동 수집 속성) | 속성별 상이 | SDK가 자동 수집한 클라이언트 정보 (클라이언트 전송 시) |
attributes 주의사항 & Tips¶
hiveAttributes는 개발사가 직접 값을 설정하는 영역이 아니라 파이프라인이 자동으로 채우는 영역입니다.dataSource,geoIpCountry외의 값은 저장되지 않습니다.- 사용자 정의 속성과 SDK 자동 수집 속성은 모두
eventAttributes에 함께 저장됩니다. 조회 시 속성명으로 구분해야 합니다. dataSource값으로 이벤트 로그의 전송 경로(SDK/서버/MMP 등)를 구분해 조회할 수 있습니다.
데이터 격리¶
Warning
전송 규칙을 준수하지 않은 이벤트 로그는 정상 테이블(t_raw_event_log)에 저장되지 않고, 격리 테이블(t_raw_event_log_rescue) 에 별도로 저장됩니다. 격리 테이블에는 원본 JSON이 함께 보존되므로, 격리 원인을 파악하고 수정하여 재전송할 수 있습니다.
격리 사유¶
| 오류 사유 | 설명 | 대응 방법 |
|---|---|---|
| 필수 속성 누락 | 7개 필수 속성(userId, identifierProvider, deviceId, appId, eventTime, eventName, appIdGroup) 중 하나라도 없거나 빈 값 | 누락된 필수 속성을 포함하여 재전송 |
| 예약어 사용 | 속성명으로 attributes, eventAttributes, hiveAttributes를 사용한 경우 (대소문자 무관) | 해당 속성명을 다른 이름으로 변경 |
| 허용되지 않는 속성값 | 속성값이 JSON 객체({}) 또는 JSON 배열([]) 형태인 경우 | 속성값을 문자열 또는 숫자로 변경 |
| eventTime 형식 오류 | eventTime이 RFC 3339 형식이 아니거나 파싱할 수 없는 경우 | RFC 3339 형식으로 수정 (타임존 포함) |
| eventTime 범위 초과 | eventTime이 현재 시각 기준 과거 31일 또는 미래 31일을 벗어나는 경우 | eventTime 값 확인 후 정상 범위로 수정 |
| JSON 파싱 실패 | 전송된 메시지가 유효한 JSON 형식이 아닌 경우 | JSON 형식 검증 후 재전송 |
격리 테이블 구조¶
격리된 이벤트 로그는 t_raw_event_log_rescue 테이블에 다음과 같은 구조로 저장 됩니다.
| 컬럼명 | 자료형 | 설명 |
|---|---|---|
userId | STRING | 전송된 userId (파싱 가능한 경우) |
identifierProvider | STRING | 전송된 identifierProvider |
deviceId | STRING | 전송된 deviceId |
appIdGroup | STRING | 전송된 appIdGroup |
dateTime | STRING | 전송된 eventTime 원본값 (문자열 그대로 저장, TIMESTAMP 아님) |
eventName | STRING | 전송된 eventName |
bigqueryRegistTimestamp | TIMESTAMP | BigQuery 저장 시각 |
checksum | STRING | 해시값 |
rawData | STRING | 전송된 원본 JSON 전체 |
errorReason | STRING | 격리 사유 코드 |
errorStackTrace | STRING | 격리 상세 정보 (누락된 필드명 등) |