[data architecture] Medallion Architecture

Hyunjun Kim·2025년 7월 8일
0

Data_Engineering

목록 보기
93/153

Medallion Architecture란?

Medallion Architecture는 데이터 레이크 기반 환경에서 대용량 데이터를 계층적으로 정제하고 품질을 향상시키기 위한 설계 패턴이다.

Bronze → Silver → Gold 3계층으로 구성되며, 각각은 데이터 품질, 정제 수준, 활용 목적에 따라 명확히 분리된다.

이 구조는 다음과 같은 문제를 해결하기 위해 등장하였다:

  • 원시 로그(raw log)를 직접 분석에 쓰기에는 품질, 구조, 오류 제어가 부족한 경우가 많음
  • 정제된 데이터를 다양한 팀이나 파이프라인에서 재사용하기 어려움
  • 데이터가 저장되었더라도, 어떤 품질 수준까지 처리되었는지 추적이 어려움

따라서 아래와 같은 목적에 적합하다:

  • 데이터 레이크 기반의 분석 및 정제 파이프라인 구성
  • 머신러닝 피처 추출/학습용 테이블 설계
  • KPI, 리포트, 대시보드 등 비즈니스 활용을 위한 계층적 데이터 구조 설계

주로 DatabricksApache Spark 기반의 Delta Lake 환경에서 사용되며,
Delta Lake의 ACID 트랜잭션, Time Travel, MERGE 기능은 Medallion 구조를 안정적으로 지원하는 핵심 기술 요소다.


1. Bronze / Silver / Gold 계층 설명

1.1 Bronze Layer: 원시 데이터 저장

  • 목적: 수집된 데이터를 가공 없이 그대로 저장 (raw ingestion)
  • 데이터 소스: Kafka, CDC 로그, 이벤트 스트림, API 등
  • 특징
    • 스키마 제약 없음
    • 오류 데이터도 허용하여 로스리스 수집
    • 재처리 및 감사(log replay)를 위한 원본 보존
{
  "user_id": 123,
  "event": "click",
  "timestamp": "2023-07-01T12:00:00Z"
}

1.2 Silver Layer: 정제 및 표준화 계층

  • 목적: 스키마 적용, 품질 검사, 참조 데이터 조인을 통해 의미 있는 분석 단위로 변환
  • 처리 내용
    • 결측치 및 오류 처리
    • 조인 및 유효성 검증
    • 파싱, 포맷 정규화
SELECT 
  u.user_id, 
  u.gender, 
  e.event, 
  TO_TIMESTAMP(e.timestamp) AS event_time
FROM bronze.user_events e
JOIN silver.user_profiles u
  ON e.user_id = u.user_id
WHERE e.event IS NOT NULL

1.3 Gold Layer: 집계 및 비즈니스 모델

  • 목적: KPI, 리포팅, 머신러닝 피처 등으로 활용 가능한 최종 형태 제공
  • 처리 내용
    • 일/주/월 단위 집계
    • 피벗, KPI 산출
    • 피처 엔지니어링
SELECT 
  user_id,
  COUNT(*) AS total_clicks,
  COUNT(DISTINCT DATE(event_time)) AS active_days
FROM silver.cleaned_user_events
GROUP BY user_id

2. 계층 구조와 SQL 네이밍의 관계

Medallion Architecture에서 사용하는 Bronze / Silver / Gold 계층은
실제 구현 시 테이블이나 디렉터리의 논리적 네임스페이스(schema) 또는 디렉토리 prefix로 사용되는 것이 일반적이다.

예제에서 사용한 silver.user_profiles, bronze.user_events 같은 테이블 명은
실제로는 아래와 같은 의미로 쓰이며, 각 계층을 명확히 식별할 수 있도록 도와준다.


2.1 테이블/디렉터리 네이밍 예시

  • bronze.user_events → Bronze 계층에 저장된 원시 이벤트 로그 테이블
  • silver.user_profiles → Silver 계층의 정제된 사용자 프로필 데이터
  • gold.kpi_metrics → Gold 계층의 KPI 집계 결과 테이블

이는 단지 명명 규칙(naming convention)일 뿐이며, 물리적으로 강제되는 것은 아니다.
하지만 계층별 데이터 품질 수준을 명확히 관리하고, 유지보수 및 관측성을 높이기 위한 실무적 표준으로 널리 사용된다.


2.2 디렉터리 기반 구조 예시

데이터 레이크에서의 저장 구조 예시:

/datalake
  ├─ /bronze
  │   └─ user_events.parquet
  ├─ /silver
  │   └─ cleaned_user_events.parquet
  └─ /gold
      └─ kpi_daily_metrics.parquet

SQL 처리 엔진(Spark, Databricks 등)에서는 디렉터리를 테이블로 매핑하거나,
스키마 단위(bronze, silver, gold)로 카탈로그를 구성하여 다음과 같이 쿼리할 수 있다:

SELECT * FROM silver.cleaned_user_events

2.3 논리적 계층과 SQL 예제 관계 요약

표현의미Medallion 계층
bronze.user_events원시 로그 저장 테이블 (raw ingestion)🟫 Bronze
silver.user_profiles정제된 사용자 프로필 데이터🥈 Silver
gold.kpi_metrics집계된 KPI 리포팅 테이블🥇 Gold

이처럼 SQL 예제에서 사용된 bronze. 또는 silver. 접두어는 Medallion Architecture의 계층 구조를 반영한 명명 관례고,
Delta Lake 기반의 실무 파이프라인에서 자주 사용된다.


📌 실제 구현 팁

  • 디렉터리 구조, DB schema, catalog naming을 계층 기준으로 나누면 관리가 쉬움
  • 계층별로 다른 권한, 다른 스토리지 정책, 다른 거버넌스를 적용할 수 있음
  • silver → gold로 갈수록 품질, 의미, SLA가 높아지는 구조로 설계해야 유지보수와 협업이 쉬움

3. Delta Lake 기반 구현 전략

3.1. Delta Format

  • Apache Parquet 기반에 ACID 트랜잭션, 버전 관리, 머지 지원 기능을 추가한 포맷
  • 동시성 제어, 스키마 검증이 가능

3.2. 핵심 기능

기능설명
Time Travel특정 시점의 데이터를 조회 (버전 관리)
Schema Enforcement컬럼 타입, 필드 누락 등 스키마 오류 방지
MERGE (UPSERT)조건 기반 데이터 병합 (CDC, SCD 처리)

3.3. 예시: CDC 기반 UPSERT

MERGE INTO silver.customers AS target
USING bronze.customer_cdc AS source
ON target.customer_id = source.customer_id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *

3.4. 예시: Time Travel

SELECT * 
FROM silver.transactions
VERSION AS OF 10
profile
Data Analytics Engineer 가 되

0개의 댓글