726 words
4 minutes
[DE Design Pattern]05-3. Metadata Decorator
4. Data Decoration: Metadata Decorator
01. Pattern Overview
- Metadata Decorator는 Wrapper와 비슷하지만, 추가하는 정보가 기술적 메타데이터(job version, processing time 등)인 것
- 메타데이터를 메타데이터 레이어에 숨김
02. 구현 전략
네이티브 메타데이터 지원 (Kafka headers)
from pyspark.sql import functions as F
# Kafka 레코드에 header로 메타데이터 추가visits_with_metadata = ( visits .withColumn("headers", F.array( F.struct( F.lit("job_version").alias("key"), F.lit(b"v1.2.3").alias("value") ), F.struct( F.lit("batch_version").alias("key"), F.lit(str(batch_number).encode("UTF-8")).alias("value") ) )))
(visits_with_metadata.write.format("kafka") .option("kafka.bootstrap.servers", "localhost:9092") .option("includeHeaders", True) # header 포함 명시 .option("topic", "visits-output") .save())네이티브 미지원 (RDB): 별도 메타데이터 테이블
-- 메타데이터 전용 테이블 (기술팀만 접근)CREATE TABLE visits_context ( execution_date_time TIMESTAMPTZ NOT NULL, loading_time TIMESTAMPTZ NOT NULL, code_version VARCHAR(15) NOT NULL, loading_attempt SMALLINT NOT NULL, PRIMARY KEY (execution_date_time));
-- 데이터 테이블에 FK만 추가-- visits 테이블의 visits_context_execution_date 컬럼은-- view나 권한으로 비즈니스 사용자에게 숨김로딩 스크립트 (Airflow Jinja 템플릿)
-- 1) 메타데이터 삽입INSERT INTO visits_context (execution_date_time, loading_time, code_version, loading_attempt)VALUES ( '{{ logical_date }}', '{{ dag_run.start_date }}', '{{ params.code_version }}', {{ task_instance.try_number }});
-- 2) 데이터 + 메타데이터 FK 삽입INSERT INTO weekly_visits SELECT *, '{{ execution_date }}' AS visits_context_execution_date FROM tmp_visits;03 Wrapper vs Metadata Decorator 비교
| 구분 | Wrapper | Metadata Decorator |
|---|---|---|
| 대상 | 비즈니스 + 기술 속성 | 기술 메타데이터만 |
| 노출 | 소비자에게 공개 | 소비자에게 숨김 |
| 위치 | 레코드 내부 (struct) | 메타데이터 레이어 또는 별도 테이블 |
| 용도 | 데이터 가공/변환 결과 | 디버깅, 모니터링, 감사 |
주요 트레이드오프
- 스토어 지원 여부: Kafka headers처럼 네이티브 지원이면 간단하지만, Amazon Kinesis Data Streams는 headers 미지원 → 구현 불가능한 경우도 있음
- 테이블 기반 구현의 추가 노력: 별도 컬럼/테이블 + view/권한 관리가 필요하여 네이티브 지원 대비 복잡
- 비즈니스 데이터 금지: 메타데이터 레이어에 배송 주소, 청구 금액 같은 비즈니스 속성을 넣으면 안 됨. 소비자는 메타데이터를 조회할 생각을 하지 않으므로 데이터가 사실상 숨겨짐
Concept
- Metadata Decorator : 기술적 메타데이터(job version, processing time 등)를 레코드에 추가하되 비즈니스 사용자에게 숨기는 패턴
- Kafka Headers : Kafka 레코드의 key/value 외에 별도로 존재하는 메타데이터 key-value 쌍. 네이티브 메타데이터 레이어의 대표 예
- 메타데이터 정규화 : 별도 테이블에 메타데이터를 저장하여 행마다 중복을 방지하고 FK로 참조하는 방식
- View 기반 숨김 : 메타데이터 컬럼을 제외한 view를 소비자에게 노출하여 기술 정보를 은닉
- Column-level Access Control : 컬럼 단위로 읽기 권한을 제어하여 메타데이터 접근을 차단하는 보안 기법
[DE Design Pattern]05-3. Metadata Decorator
https://yjinheon.netlify.app/posts/02de/de-design-pattern/05_data_value/05-04-metadata_decorator/