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 비교#

구분WrapperMetadata 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/
Author
Datamind
Published at
2025-03-14
License
CC BY-NC-SA 4.0