본문으로 건너뛰기

Google Cloud BigQuery

개요

BigQuery는 GCP의 서버리스 데이터 웨어하우스로, DTA-WIDE 시스템에서 다음과 같은 용도로 사용됩니다:

  • 대용량 데이터 분석
  • 보고서 생성 및 BI
  • 데이터 웨어하우스
  • 실시간 분석 파이프라인
  • 감사 로그 및 이벤트 데이터 장기 보관

구성 및 아키텍처

DTA-WIDE는 다음과 같은 BigQuery 구성을 사용합니다:

  • 리전: europe-west3 (Frankfurt)
  • 데이터셋 모델: 환경별 및 도메인별 분리
  • 파티셔닝: 시간 기반 일별 파티셔닝
  • 클러스터링: 주요 쿼리 필드 기준 최적화

데이터셋 구조

프로젝트에서는 다음과 같은 주요 데이터셋을 사용합니다:

데이터셋 ID목적주요 테이블
log시스템 로그 및 감사 데이터audit, system_events, errors

스키마 설계

BigQuery는 각 도메인 모델을 반영하여 스키마를 설계했습니다. 대표적인 예로 감사 로그 테이블은 다음과 같습니다:

필드명데이터 타입모드설명
timestampTIMESTAMP(3)REQUIRED이벤트 발생 시간 (13자리 Unix 타임스탬프)
user_idSTRINGNULLABLE사용자 ID
actionSTRINGREQUIRED수행된 작업
resourceSTRINGREQUIRED접근한 리소스
statusSTRINGREQUIRED작업 상태
detailsJSONNULLABLE추가 상세 정보

도메인 모델 연계

BigQuery 스키마는 도메인 주도 설계(DDD) 원칙에 따라 설계된 도메인 모델과 밀접하게 연결되어 있습니다. 특히:

  • 감사(Audit) 도메인: Audit 도메인 모델AuditLog 엔티티가 log.audit 테이블로 구현됨
  • 의료(Medical) 도메인: 비식별화된 의료 데이터를 저장하고 분석하기 위한 테이블 구조

이러한 연계를 통해 도메인 모델의 개념이 데이터 분석 레이어까지 일관되게 유지됩니다.

데이터 액세스 패턴

쿼리 패턴

  • 분석 쿼리: 복잡한 데이터 분석을 위한 고급 SQL 쿼리
  • 대시보드 쿼리: 비즈니스 인텔리전스 도구 연결을 위한 최적화된 뷰
  • 스케줄된 쿼리: 주기적인 보고서 생성을 위한 예약 쿼리
  • 임시 분석: 데이터 과학 및 탐색적 분석을 위한 임시 쿼리

최적화 기법

  • 파티셔닝 활용: 시간 기반 파티셔닝을 통한 쿼리 성능 향상
  • 클러스터링: 자주 사용되는 필터링 필드를 기준으로 클러스터링
  • 머티리얼라이즈드 뷰: 복잡한 쿼리의 결과를 사전 계산하여 저장
  • 쿼리 캐싱: 동일한 쿼리의 결과를 캐싱하여 비용 절감

Terraform을 통한 인프라 관리

구현 요소

BigQuery를 Terraform으로 관리하기 위해 다음 요소를 구현했습니다:

  1. Terraform 모듈: 재사용 가능한 BigQuery 구성
  2. Terragrunt 구성: 환경별 설정값 관리
  3. 배포 파이프라인: 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 리소스를 배포하려면 다음 단계를 따릅니다:

사전 요구 사항

  1. 프로젝트가 생성되어 있어야 합니다.
  2. BigQuery API가 활성화되어 있어야 합니다:
    gcloud services enable bigquery.googleapis.com --project=PROJECT_ID
  3. Terraform 및 Terragrunt가 설치되어 있어야 합니다.
  4. 적절한 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에 데이터를 로드하는 주요 방법:

  1. 일괄 로드: CSV, JSON, Avro, Parquet, ORC 형식의 파일에서 로드
  2. 스트리밍 삽입: 실시간 데이터 삽입
  3. 쿼리 결과 저장: SELECT 쿼리 결과를 테이블에 저장
  4. 외부 데이터 소스: Cloud Storage, Google Drive, Bigtable 등 외부 소스와 연결

모니터링 및 운영

주요 모니터링 지표

  • 쿼리 성능: 실행 시간, 처리된 바이트, 슬롯 사용량
  • 스토리지 사용량: 활성/장기 스토리지 크기, 테이블별 사용량
  • 할당량 및 한도: API 요청 수, 동시 쿼리 수
  • 비용: 쿼리 비용, 스토리지 비용, 슬롯 예약 비용

비용 최적화 전략

  • 쿼리에서 필요한 열만 선택
  • 파티셔닝 및 클러스터링을 적절히 사용
  • 중복 쿼리 방지를 위한 캐싱 활용
  • 예약 슬롯 사용으로 비용 예측 가능성 향상
  • 데이터 보존 정책을 통한 스토리지 비용 최적화

모범 사례

  • 스키마 설계 최적화
  • 적절한 파티셔닝 전략 선택
  • 쿼리 성능 최적화
  • 비용 모니터링 및 예산 설정
  • 접근 제어 및 보안 강화

문제 해결

일반적인 문제 및 해결 방법

  • 쿼리 성능 저하: 파티셔닝/클러스터링 검토, 쿼리 최적화
  • 할당량 초과: 프로젝트 할당량 증가 요청, 작업 분산
  • 비용 초과: 비용 경고 설정, 예산 관리, 쿼리 최적화
  • 접근 오류: IAM 권한 확인, 데이터셋 공유 설정 검토

변경 이력

버전날짜작성자변경 내용
0.1.02025-03-25bok@weltcorp.com최초 작성
0.2.02025-03-28bok@weltcorp.comTerraform 관리 및 도메인 모델 연계 정보 추가