Silver 데이터를 집계/요약하여 경영진/실무자가 바로 의사결정에 활용할 수 있는 최종 데이터셋을 구성하는 레이어
Gold Layer 목표
- 대시보드/보고서 — 의사결정을 즉시 수행할 수 있는 요약 데이터
- AI - ML/DL — 모델 학습에 바로 적용 가능한 데이터
- AI - LLM/RAG — 벡터 DB 삽입, 검색증강생성(RAG) 등에 활용할 수 있는 수준의 데이터
상황에 따라 메달리온 아키텍처의 단계를 단축할 수 있음.
Gold 테이블 구성 방식 — 고정 테이블 vs 뷰
고정 테이블 (CTAS / INSERT INTO)
물리적으로 테이블을 구성하는 방식.
| 장점 | 단점 |
| 데이터가 이미 계산되어 저장됨 → 조회 속도 빠름 | 테이블 생성 이후 추가되는 데이터 미반영, (테이블 생성 이후 추가되는 데이터를 테이블은 모름) |
| 대시보드 조회 비용이 적음 | 다음 배치까지 최신 데이터 누락 → 스케줄 관리 중요 |
뷰 (View — 가상 테이블)
물리적 저장 없이 논리적 쿼리만 저장하는 방식. 전형적인 데이터마트 구성.
| 장점 | 단점 |
| Silver 데이터 업데이트 시 즉시 최신 반영 | 조회할 때마다 Silver 전체 데이터를 재계산 |
| 저장공간 미사용 (Silver S3만 참조) | 데이터가 커질수록 조회(연산) 비용 증가 |
Gold 스키마
당일 제품별(그룹화) 판매 수량 / 총액 / 구매 고객 수(중복 제거) 집계.
select item_id,
sum(qty) as total_qty,
sum(total_price) as total_revenue,
count(distinct user_id) as unique_customer,
dt as sales_date
from sales_silver_tbl
where dt = '2026-04-22'
group by dt, item_id;
| 컬럼 | 타입 | 설명 |
| item_id | string | 제품 ID |
| total_qty | bigint | 제품별 총 판매 수량 |
| total_revenue | bigint | 제품별 총 매출액 (price × qty 합산) |
| unique_customer | bigint | 제품별 구매 고객 수 (중복 제거) |
| sales_date | string | 판매 일자 (dt 파티션 값) |
Gold View DAG — 12_aws_ma_gold_view.py
Silver 테이블을 참조하는 View를 매일 갱신하여, 전일 매출 요약 데이터를 제공하는 DAG.
전체 구조
DAG: 12_medallion_silver_to_gold_view
스케줄: @daily (매일 00:00)
└─ Task 1: create_or_replace_gold_view → Gold View 생성/갱신
↓
Silver 테이블 참조 (물리 저장 X)
↓
전일 제품별 매출 요약 뷰
모든 매장이 21시에 마감한다고 가정 → 자정(00시)에 DAG 실행하면 전일 데이터가 완전히 적재된 상태.
1. 모듈 가져오기
from datetime import datetime, timedelta
from airflow import DAG
from airflow.providers.amazon.aws.operators.athena import AthenaOperator
Silver DAG와 동일 구성.
2. 환경 변수 정의
DATABASE_SILVER = 'de_ai_04_ma_sliver_db'
DATABASE_GOLD = 'de_ai_04_ma_gold_db'
ATHENA_RESULTS = 's3://de-ai-04-827913617635-ap-northeast-2-an/athena-results/'
SILVER_TBL_NAME = 'sales_silver_tbl'
GOLD_VIEW_NAME = 'daily_sales_summary_gold_view'
- DATABASE_GOLD — Gold Layer 전용 데이터베이스. Silver와 분리하여 레이어별 관리
- SILVER_TBL_NAME = 'sales_silver_tbl' — CTAS용 Silver 테이블 참조. 증분 테이블이 아닌 CTAS 테이블을 임시로 사용
- GOLD_VIEW_NAME — 생성할 뷰 이름. daily_sales_summary로 일별 매출 요약 목적이 명확히 드러남
3. DAG 정의
with DAG(
dag_id = "12_medallion_silver_to_gold_view",
description = "Gold 단계 View 생성",
default_args= {
'owner' : 'de_2team_manager',
'retries' : 1,
'retry_delay' : timedelta(minutes=1)
},
schedule_interval = '@daily',
start_date = datetime(2026,4,17),
catchup = False,
tags = ['aws', 'medallion', 'gold', 'athena', 'view']
) as dag:
- schedule_interval = '@daily' — 매일 00시 00분 00초에 실행. Silver DAG(매시 10분)와 달리 일 단위 배치
- catchup = False — 과거 미실행 스케줄 소급하지 않음
4. Task 정의
create_gold_view = AthenaOperator(
task_id='create_or_replace_gold_view',
query="""
CREATE or REPLACE VIEW {{params.database_gold}}.{{params.view_name}} as
select
item_id,
sum(qty) as total_qty,
sum(total_price) as total_revenue,
count(distinct user_id) as unique_customer,
dt as sales_date
from {{params.database_silver}}.{{params.tbl_name}}
where dt = '{{ (execution_date-macros.timedelta(days=1)).format('YYYY-MM-DD')}}'
group by dt, item_id;
""",
params={
'database_gold' : DATABASE_GOLD,
'database_silver' : DATABASE_SILVER,
'tbl_name' : SILVER_TBL_NAME,
'view_name' : GOLD_VIEW_NAME
},
database=DATABASE_GOLD,
output_location=ATHENA_RESULTS
)
- CREATE or REPLACE VIEW — 뷰가 없으면 생성, 있으면 덮어쓰기. DROP 없이 안전하게 갱신 가능
- 뷰 = 가상 테이블 — 물리적 데이터 저장 없이 SQL 쿼리 정의만 저장. 조회 시점에 Silver 테이블을 실시간 참조하여 결과 반환
- sum(qty) as total_qty — 제품별 총 판매 수량 집계
- sum(total_price) as total_revenue — 제품별 총 매출액. Silver에서 이미 계산된 total_price(price × qty)를 다시 합산
- count(distinct user_id) as unique_customer — 제품별 고유 구매 고객 수. distinct로 중복 제거
- group by dt, item_id — 날짜 + 제품 단위로 그룹화
- execution_date - macros.timedelta(days=1) — 핵심 날짜 연산. DAG가 00시에 실행되면 execution_date는 당일이므로, 하루를 빼서 전일 데이터를 조회. 어제 데이터를 오늘 새벽에 집계하는 구조
- .format('YYYY-MM-DD') — Pendulum의 format 메서드로 2026-04-21 형태 문자열 생성
날짜 연산 흐름 예시:
DAG 실행 시점 : 2026-04-22 00:00 (UTC)
execution_date : 2026-04-22
-1일 연산 : 2026-04-21
WHERE dt = : '2026-04-21' → 전일 매출 데이터 집계
5. 의존성 정의
create_gold_view
- Task가 1개이므로 별도 의존성 없이 단독 실행
요약
| 구성 요소 | 역할 | 핵심 포인트 |
| Gold View | Silver 참조 가상 테이블 | 물리 저장 X, 조회 시 실시간 계산 |
| @daily 스케줄 | 매일 00시 실행 | 전일 매출 데이터 집계 (execution_date - 1일) |
| CREATE or REPLACE VIEW | 뷰 갱신 | DROP 없이 안전하게 덮어쓰기 |
| GROUP BY dt, item_id | 집계 단위 | 일별 + 제품별 판매량/매출/고객수 요약 |
Gold Layer는 Silver 데이터를 집계하여 의사결정용 최종 데이터셋을 구성하며, View 방식은 물리 저장 없이 최신 Silver 데이터를 즉시 반영하는 대신 조회 시 재계산 비용이 발생함. 고정 테이블과 뷰 중 데이터 신선도와 비용 트레이드오프를 고려하여 선택.
'SK플래닛 ai활용 데이터엔지니어 과정 2기 > Airflow' 카테고리의 다른 글
| Kafka 개념 정리 + CLI 테스트 (1) | 2026.04.23 |
|---|---|
| OpenSearch 개념 정리 (1) | 2026.04.23 |
| Medallion Architecture - 4 — Silver DAG 코드 구현 (0) | 2026.04.22 |
| Medallion Architecture - 3 — Silver Layer (0) | 2026.04.22 |
| Medallion Architecture - 2 — Bronze 코드 구현 (0) | 2026.04.21 |