Google Cloud BigQuery
개요
BigQuery는 GCP의 서버리스 데이터 웨어하우스로, DTA-WIDE 시스템에서 다음과 같은 용도로 사용됩니다:
- 대용량 데이터 분석
- 보고서 생성 및 BI
- 데이터 웨어하우스
- 실시간 분석 파이프라인
- 감사 로그 및 이벤트 데이터 장기 보관
구성 및 아키텍처
DTA-WIDE는 다음과 같은 BigQuery 구성을 사용합니다:
- 리전: europe-west3 (Frankfurt)
- 데이터셋 모델: 환경별 및 도메인별 분리
- 파티셔닝: 시간 기반 일별 파티셔닝
- 클러스터링: 주요 쿼리 필드 기준 최적화
데이터셋 구조
프로젝트에서는 다음과 같은 주요 데이터셋을 사용합니다:
| 데이터셋 ID | 목적 | 주요 테이블 |
|---|---|---|
| log | 시스템 로그 및 감사 데이터 | audit, system_events, errors |
스키마 설계
BigQuery는 각 도메인 모델을 반영하여 스키마를 설계했습니다. 대표적인 예로 감사 로그 테이블은 다음과 같습니다:
| 필드명 | 데이터 타입 | 모드 | 설명 |
|---|---|---|---|
| timestamp | TIMESTAMP(3) | REQUIRED | 이벤트 발생 시간 (13자리 Unix 타임스탬프) |
| user_id | STRING | NULLABLE | 사용자 ID |
| action | STRING | REQUIRED | 수행된 작업 |
| resource | STRING | REQUIRED | 접근한 리소스 |
| status | STRING | REQUIRED | 작업 상태 |
| details | JSON | NULLABLE | 추가 상세 정보 |
도메인 모델 연계
BigQuery 스키마는 도메인 주도 설계(DDD) 원칙에 따라 설계된 도메인 모델과 밀접하게 연결되어 있습니다. 특히:
- 감사(Audit) 도메인: Audit 도메인 모델의
AuditLog엔티티가log.audit테이블로 구현됨 - 의료(Medical) 도메인: 비식별화된 의료 데이터를 저장하고 분석하기 위한 테이블 구조
이러한 연계를 통해 도메인 모델의 개념이 데이터 분석 레이어까지 일관되게 유지됩니다.
데이터 액세스 패턴
쿼리 패턴
- 분석 쿼리: 복잡한 데이터 분석을 위한 고급 SQL 쿼리
- 대시보드 쿼리: 비즈니스 인텔리전스 도구 연결을 위한 최적화된 뷰
- 스케줄된 쿼리: 주기적인 보고서 생성을 위한 예약 쿼리
- 임시 분석: 데이터 과학 및 탐색적 분석을 위한 임시 쿼리
최적화 기법
- 파티셔닝 활용: 시간 기반 파티셔닝을 통한 쿼리 성능 향상
- 클러스터링: 자주 사용되는 필터링 필드를 기준으로 클러스터링
- 머티리얼라이즈드 뷰: 복잡한 쿼리의 결과를 사전 계산하여 저장
- 쿼리 캐싱: 동일한 쿼리의 결과를 캐싱하여 비용 절감
Terraform을 통한 인프라 관리
구현 요소
BigQuery를 Terraform으로 관리하기 위해 다음 요소를 구현했습니다:
- Terraform 모듈: 재사용 가능한 BigQuery 구성
- Terragrunt 구성: 환경별 설정값 관리
- 배포 파이프라인: CI/CD와 통합
Terraform 모듈 구조
BigQuery 모듈은 다음과 같은 구조로 구현되어 있습니다:
infrastructure/
└── terraform/
└── modules/
└── bigquery/
├── main.tf # 리소스 정의
├── variables.tf # 입력 변수
├── outputs.tf # 출력 변수
└── README.md # 사용 가이드
주요 기능
- 데이터셋 생성 및 관리
- 테이블 및 뷰 정의
- 파티셔닝 및 클러스터링 구성
- 접근 제어 설정
- 데이터 보존 정책 관리
환경별 Terragrunt 구성
개발, 스테이징, 프로덕션 환경별로 다음과 같이 Terragrunt 구성 파일이 작성되어 있습니다:
infrastructure/
└── terragrunt/
├── dev/
│ └── bigquery/
│ └── terragrunt.hcl # 개발 환경 구성
├── stage/
│ └── bigquery/
│ └── terragrunt.hcl # 스테이징 환경 구성
└── prod/
└── bigquery/
└── terragrunt.hcl # 프로덕션 환경 구성
환경별 주요 설정
- 개발 환경: 작은 규모의 테이블, 짧은 데이터 보존 기간, 모든 테이블 포함
- 스테이징 환경: 중간 규모의 테이블, 중간 데이터 보존 기간, 모든 테이블 포함
- 프로덕션 환경: 실제 규모의 테이블, 완전한 데이터 보존 정책, 필요한 모든 테이블 포함
배포 방법
BigQuery 리소스를 배포하려면 다음 단계를 따릅니다:
사전 요구 사항
- 프로젝트가 생성되어 있어야 합니다.
- BigQuery API가 활성화되어 있어야 합니다:
gcloud services enable bigquery.googleapis.com --project=PROJECT_ID - Terraform 및 Terragrunt가 설치되어 있어야 합니다.
- 적절한 GCP 권한이 필요합니다.
배포 단계
개발 환경 배포:
cd infrastructure/terragrunt/dev/bigquery
terragrunt init
terragrunt plan
terragrunt apply
프로덕션 환경은 변경 관리 절차를 따라야 합니다:
cd infrastructure/terragrunt/prod/bigquery
terragrunt init
terragrunt plan -out=bigquery-plan.tfplan
# 계획 검토 및 승인 후
terragrunt apply bigquery-plan.tfplan
보안 설정
BigQuery의 데이터에 대한 접근은 다음과 같은 방법으로 제어됩니다:
- IAM 역할 및 권한: 프로젝트, 데이터셋, 테이블 수준의 세분화된 접근 제어
- 열 수준 보안: 특정 열에 대한 접근 제한
- 행 수준 액세스 정책: 데이터베이스 뷰 또는 정책 태그를 통한 행 수준 접근 제어
- 데이터 암호화: 기본 Google 관리 키 또는 고객 관리 암호화 키(CMEK) 사용
연결 방법
클라이언트 라이브러리
다양한 언어로 BigQuery에 연결할 수 있습니다:
-
Python:
from google.cloud import bigquery
# 클라이언트 초기화
client = bigquery.Client()
# 쿼리 실행
query = """
SELECT UNIX_MILLIS(timestamp) as timestamp, user_id, action
FROM `PROJECT_ID.log.audit`
WHERE DATE(timestamp) = CURRENT_DATE()
LIMIT 10
"""
results = client.query(query)
# 결과 처리
for row in results:
print(f"{row.timestamp}: {row.user_id} performed {row.action}") -
Node.js:
const {BigQuery} = require('@google-cloud/bigquery');
// 클라이언트 초기화
const bigquery = new BigQuery();
async function queryAuditLogs() {
const query = `
SELECT UNIX_MILLIS(timestamp) as timestamp, user_id, action
FROM \`PROJECT_ID.log.audit\`
WHERE DATE(timestamp) = CURRENT_DATE()
LIMIT 10
`;
const [rows] = await bigquery.query(query);
rows.forEach(row => {
console.log(`${row.timestamp}: ${row.user_id} performed ${row.action}`);
});
}
queryAuditLogs();
데이터 로드 방법
BigQuery에 데이터를 로드하는 주요 방법:
- 일괄 로드: CSV, JSON, Avro, Parquet, ORC 형식의 파일에서 로드
- 스트리밍 삽입: 실시간 데이터 삽입
- 쿼리 결과 저장: SELECT 쿼리 결과를 테이블에 저장
- 외부 데이터 소스: Cloud Storage, Google Drive, Bigtable 등 외부 소스와 연결
모니터링 및 운영
주요 모니터링 지표
- 쿼리 성능: 실행 시간, 처리된 바이트, 슬롯 사용량
- 스토리지 사용량: 활성/장기 스토리지 크기, 테이블별 사용량
- 할당량 및 한도: API 요청 수, 동시 쿼리 수
- 비용: 쿼리 비용, 스토리지 비용, 슬롯 예약 비용
비용 최적화 전략
- 쿼리에서 필요한 열만 선택
- 파티셔닝 및 클러스터링을 적절히 사용
- 중복 쿼리 방지를 위한 캐싱 활용
- 예약 슬롯 사용으로 비용 예측 가능성 향상
- 데이터 보존 정책을 통한 스토리지 비용 최적화
모범 사례
- 스키마 설계 최적화
- 적절한 파티셔닝 전략 선택
- 쿼리 성능 최적화
- 비용 모니터링 및 예산 설정
- 접근 제어 및 보안 강화
문제 해결
일반적인 문제 및 해결 방법
- 쿼리 성능 저하: 파티셔닝/클러스터링 검토, 쿼리 최적화
- 할당량 초과: 프로젝트 할당량 증가 요청, 작업 분산
- 비용 초과: 비용 경고 설정, 예산 관리, 쿼리 최적화
- 접근 오류: IAM 권한 확인, 데이터셋 공유 설정 검토
변경 이력
| 버전 | 날짜 | 작성자 | 변경 내용 |
|---|---|---|---|
| 0.1.0 | 2025-03-25 | bok@weltcorp.com | 최초 작성 |
| 0.2.0 | 2025-03-28 | bok@weltcorp.com | Terraform 관리 및 도메인 모델 연계 정보 추가 |