필사 모드: 데이터 엔지니어링 완전 가이드 — Lakehouse·Streaming·dbt·Orchestration·Data Mesh (Season 2 Ep 8, 2025)
한국어들어가며 — 데이터 엔지니어의 2025년 기대치
10년 전 데이터 엔지니어는 "ETL 스크립트 작성 + Hadoop 운영"이었다. 2025년의 기대치:
- **Lakehouse 설계**: Iceberg/Delta/Hudi 중 선택·운영
- **Streaming + Batch 통합**: Lambda는 가고 Kappa, 이제 진짜 통합
- **Modern Data Stack**: dbt + Airflow/Dagster + Fivetran/Airbyte + BigQuery/Snowflake
- **Data Mesh**: 중앙 집중 vs 분산 조직 모델
- **Data Contract**: Protobuf 같은 스키마 계약
- **AI/ML 연계**: MLOps와의 접점, Feature Store, Vector DB
- **비용 관리**: 클라우드 데이터 비용 통제 (FinOps)
이 글은 2025년 데이터 엔지니어의 **사고 프레임**을 한 편에 담는다.
1부 — Lakehouse: Data Lake + Data Warehouse의 통합
1.1 역사적 맥락
| 시대 | 아키텍처 | 한계 |
|-----|---------|-----|
| 2000s | Data Warehouse (Teradata, Oracle) | 정형 데이터만, 비쌈 |
| 2010s | Data Lake (Hadoop, S3) | 정형·비정형 OK, 쿼리 성능·트랜잭션 부재 |
| 2020s | **Lakehouse** (Iceberg, Delta, Hudi) | 둘의 장점 결합 |
**Lakehouse 정의**: 오브젝트 스토리지(S3, GCS, ADLS) + 테이블 포맷(Iceberg 등) + 쿼리 엔진(Spark, Trino, DuckDB) 조합으로 Warehouse급 ACID와 성능 제공.
1.2 세 가지 테이블 포맷 비교 (2024~2025)
| 항목 | Iceberg | Delta Lake | Hudi |
|-----|---------|-----------|------|
| 시작 | Netflix | Databricks | Uber |
| 거버넌스 | Apache 재단 | Linux Foundation | Apache 재단 |
| 엔진 중립성 | 최고 | Databricks 강함 | 중립 |
| 실시간 upsert | 좋음 | 좋음 | 최상 |
| 시간 여행 | ✅ | ✅ | ✅ |
| Schema Evolution | 강력 | 강력 | 중 |
| 2025 점유율 | 급성장 | 선두 (하락세) | 니치 |
**2024년 결정적 사건**: Databricks가 Tabular(Iceberg 창업사)를 인수 → Iceberg와 Delta 통합 방향.
**2025 추천**: 새 프로젝트는 **Iceberg**. Databricks 환경이면 Delta도 OK.
1.3 Iceberg 기본 구조
Metadata (JSON):
↓
Manifest List (Avro):
├─ Manifest 1 (Avro)
│ └─ Data Files (Parquet)
├─ Manifest 2
│ └─ Data Files
└─ ...
- **Snapshot**: 특정 시점 상태 (시간 여행 가능)
- **Partition Evolution**: 파티션 스키마 변경 가능
- **Hidden Partitioning**: 사용자가 WHERE year=2025 써도 내부 파티션 자동 사용
1.4 Lakehouse 쿼리 엔진 2025
| 엔진 | 강점 |
|-----|-----|
| **Spark** | 범용 최강, Delta 네이티브 |
| **Trino** (Presto) | 인터랙티브 SQL, 멀티 소스 |
| **DuckDB** | 로컬·임베디드, 초고속 |
| **Snowflake** | 운영 관리 최고 |
| **BigQuery** | Serverless, GCP 통합 |
| **ClickHouse** | 실시간 분석 |
| **Databricks SQL** | Delta 최적화 |
2부 — Streaming: Kappa 아키텍처의 승리
2.1 Lambda vs Kappa
**Lambda (2010s):**
- Batch Layer (정확) + Speed Layer (빠름) + Serving Layer
- **문제**: 같은 로직을 두 번 구현 → 유지보수 지옥
**Kappa (2014, Jay Kreps):**
- Streaming만. 재처리 필요하면 스트림 재시작
- 2025년 표준
2.2 2025 Streaming 엔진
| 엔진 | 특징 |
|-----|-----|
| **Apache Flink** | 최고 기능·성숙도, Stateful |
| **Kafka Streams** | Kafka 네이티브, Java 라이브러리 |
| **Spark Structured Streaming** | Batch API와 통합 |
| **Materialize** | PostgreSQL-compatible SQL |
| **RisingWave** | Materialize 대안, Rust |
| **Arroyo** | 새로운 Rust 기반 |
2.3 Streaming 핵심 개념 10
1. **Event Time vs Processing Time**: 이벤트 발생 시각 vs 시스템 처리 시각
2. **Watermark**: "이 시간까지의 이벤트는 다 왔다" 신호
3. **Windowing**: Tumbling, Sliding, Session
4. **Stateful Processing**: 상태를 유지하며 처리
5. **Exactly-Once**: 정확히 한 번 처리 보장
6. **Backpressure**: 하류가 느릴 때 상류 속도 조절
7. **Checkpointing**: 장애 복구 지점
8. **Join**: Stream-Stream, Stream-Table
9. **CDC (Change Data Capture)**: DB 변경 → 스트림
10. **Deduplication**: 중복 제거
2.4 CDC — 현대 데이터 통합의 핵심
PostgreSQL/MySQL → Debezium → Kafka → Flink/Spark → Iceberg
**장점**: 배치 ETL 제거, 실시간에 가까운 동기화.
**도구**: Debezium (오픈소스), Fivetran, Airbyte.
2.5 2025 실시간 데이터 플랫폼 예시
[Kafka] → [Flink SQL] → [Iceberg (bronze/silver/gold)] → [Trino/DuckDB]
↓
[Materialize] (실시간 대시보드)
↓
[Redis] (저지연 서빙)
3부 — Medallion Architecture: Bronze/Silver/Gold
3.1 3계층 구조
1. **Bronze (Raw)**: 원본 그대로. 스키마 변화 흡수.
2. **Silver (Cleansed)**: 정제·검증·중복 제거·스키마 통일.
3. **Gold (Business)**: 비즈니스 도메인별 집계, BI/ML 바로 쓸 수 있는 형태.
3.2 각 계층의 책임
| 계층 | 담당 | 빈도 |
|-----|-----|-----|
| Bronze | 데이터 엔지니어 | 실시간~시간당 |
| Silver | 데이터 엔지니어 | 시간~일 |
| Gold | 애널리틱스 엔지니어 + 도메인 팀 | 일~주 |
3.3 장점
- 재처리 가능 (Bronze 보존)
- 계약 명확 (Silver = 표준 스키마)
- 비즈니스 로직 분리 (Gold)
4부 — dbt: Analytics Engineering의 표준
4.1 dbt란
**"SQL로 데이터 모델링을 소프트웨어 엔지니어링처럼"** — 버전 관리, 테스트, 문서화, 의존성 그래프.
4.2 핵심 구성 요소
models/
staging/
stg_orders.sql -- Bronze -> Silver 수준
stg_customers.sql
marts/
orders.sql -- Gold, 비즈니스 로직
revenue_daily.sql
tests/
assert_total_revenue.sql
seeds/
country_codes.csv
macros/
generate_schema_name.sql
4.3 모델 예제
-- models/marts/orders.sql
{{ config(materialized='table', partition_by={'field': 'order_date', 'data_type': 'date'}) }}
with orders as (
select * from {{ ref('stg_orders') }}
),
customers as (
select * from {{ ref('stg_customers') }}
)
select
o.order_id,
o.order_date,
c.country,
o.amount
from orders o
join customers c using (customer_id)
where o.status = 'completed'
`{{ ref('stg_orders') }}` — dbt가 의존성 그래프 자동 구축.
4.4 Test와 Documentation
schema.yml
models:
- name: orders
description: "완료된 주문 (Gold 레이어)"
columns:
- name: order_id
tests:
- unique
- not_null
- name: amount
tests:
- dbt_utils.expression_is_true:
expression: ">= 0"
dbt test # 모든 테스트 실행
dbt docs generate && dbt docs serve # 문서 사이트
4.5 2025 dbt 생태계
- **dbt Core**: 오픈소스 CLI
- **dbt Cloud**: 상용 SaaS (IDE·스케줄링)
- **dbt-osmosis**: 메타데이터 자동 전파
- **Elementary**: 데이터 품질·옵저버빌리티
- **SQLMesh**: dbt 대안, 더 강력한 의존성 관리
- **Dagster + dbt 통합**: 오케스트레이션 강화
5부 — Orchestration: Airflow vs Dagster vs Prefect vs Temporal
5.1 2025 비교
| 도구 | 강점 | 약점 | 적합 |
|-----|-----|-----|-----|
| **Airflow** | 성숙, 생태계 최대 | UX 구식 | 대규모·성숙한 팀 |
| **Dagster** | 데이터 인식, 타입 안전 | 학습 곡선 | 데이터 중심 팀 |
| **Prefect** | Pythonic, 2.x에서 대폭 개선 | 커뮤니티 작음 | 중소 팀 |
| **Temporal** | 워크플로우 신뢰성 최상 | 데이터 특화 아님 | 장기 워크플로우 |
| **Kestra** | 선언적, YAML | 신생 | 간단 파이프라인 |
5.2 Dagster의 철학: "Data-aware Orchestration"
Airflow는 "태스크"를 관리. Dagster는 "**Asset**"(데이터 결과물)을 관리.
from dagster import asset
@asset
def raw_orders():
return fetch_from_postgres("orders")
@asset
def cleaned_orders(raw_orders):
return raw_orders.dropna()
@asset
def revenue_by_day(cleaned_orders):
return cleaned_orders.groupby("date").sum()
의존성·스키마·타입이 명시적. 실행 그래프 = Asset 그래프.
5.3 Airflow 2.x의 개선
- TaskFlow API (Pythonic)
- Dynamic Task Mapping
- Dataset Triggering (Dagster에 영감)
- Airflow 3.0 (2025 예정): 데이터 중심 개편
6부 — Data Mesh: 조직의 데이터 아키텍처
6.1 배경
**중앙집중 데이터 팀의 한계:**
- 도메인 지식 부족
- 병목 (한 팀이 전체 요청 처리)
- 우선순위 충돌
6.2 Data Mesh 4원칙 (Zhamak Dehghani, 2019)
1. **Domain Ownership**: 데이터는 도메인 팀이 소유 (마케팅 팀이 마케팅 데이터)
2. **Data as a Product**: 데이터셋 = 제품 (품질·문서·SLA)
3. **Self-serve Platform**: 중앙 팀은 "플랫폼" 제공 (도메인 팀이 자율 사용)
4. **Federated Governance**: 중앙 규칙 + 도메인 실행
6.3 Data Mesh 실전 고려사항
**잘 될 때:**
- 조직 규모 500+ 엔지니어
- 도메인 간 명확한 경계
- 플랫폼 엔지니어링 조직 성숙
**실패할 때:**
- 100명 미만 스타트업 (과공학)
- 도메인 팀 역량 부족
- 중앙 플랫폼 없이 "자유방임"
**2025 현실**: 이상론에서 실용 조정으로. "Hub-and-Spoke" 혹은 부분 Mesh가 흔함.
7부 — Data Contract: 팀 간 인터페이스
7.1 왜 필요한가
**문제**: 프론트엔드 팀이 `user.full_name`을 `user.name`으로 리네임 → 데이터 파이프라인 100개 깨짐 → 추적 불가.
7.2 Data Contract 정의
**스키마 + 의미론 + SLA**의 공식 약속. Protobuf나 JSON Schema 같은 형태.
user_contract.yml
name: user_events
version: 1.2.0
owner: user-platform-team
schema:
event_id: string (uuid)
user_id: string
event_type: enum [signup, login, logout, purchase]
timestamp: timestamp (UTC)
properties: map<string, any>
sla:
freshness: <5 minutes
availability: 99.9%
breaking_change_notice: 30 days
consumers:
- analytics-team
- ml-team
- finance-team
7.3 도구 (2024~2025)
- **Protobuf + Buf**: 엔지니어링 팀 중심
- **Great Expectations**: 데이터 품질 검증
- **dbt Contracts** (1.5+): 모델 간 계약
- **DataHub**: 메타데이터 카탈로그
- **Apache Atlas**: Hadoop 생태계
7.4 Contract-first 파이프라인
Producer Team Consumer Team
│ │
├─ Commits schema change to Buf ──→ Review
│ │
├─ CI: backward compat check │
│ │
├─ Deploy producer │
│ │
└─ Update event emission ─── Kafka ──→ Update consumer
8부 — Data Quality: 신뢰의 기반
8.1 데이터 품질 6차원
1. **정확성** (Accuracy): 현실 반영
2. **완전성** (Completeness): 결측 없음
3. **일관성** (Consistency): 시스템 간 동일
4. **적시성** (Timeliness): 최신성
5. **유일성** (Uniqueness): 중복 없음
6. **유효성** (Validity): 형식·범위
8.2 Data Observability 5 Pillars (Monte Carlo)
1. **Freshness**: 언제 마지막 업데이트?
2. **Volume**: 예상 행 수 범위?
3. **Schema**: 컬럼·타입 변화?
4. **Distribution**: 값 분포 변화?
5. **Lineage**: 어디서 왔고 어디로 가는가?
8.3 2025 도구
- **Great Expectations**: 오픈소스, 강력
- **Soda**: SQL 기반, 단순
- **Monte Carlo**: 상용, ML 기반 이상 감지
- **Bigeye**: 자동 SLA 학습
- **Elementary**: dbt 통합
9부 — 모던 데이터 스택 2025
9.1 표준 구성
[Sources]
├─ OLTP DBs (Postgres/MySQL)
├─ SaaS APIs (Salesforce, Stripe)
└─ Event Streams (Kafka, Kinesis)
↓
[Ingestion]
├─ Fivetran / Airbyte (SaaS → Warehouse)
└─ Debezium (CDC)
↓
[Warehouse/Lakehouse]
├─ Snowflake / BigQuery / Databricks
└─ Iceberg on S3 + Trino
↓
[Transformation]
└─ dbt (또는 SQLMesh)
↓
[Orchestration]
└─ Dagster / Airflow
↓
[Serving]
├─ BI: Looker, Metabase, Hex, Preset
├─ ML: Feature Store (Feast)
└─ Reverse ETL: Census, Hightouch (to SaaS)
↓
[Observability]
├─ Monte Carlo / Elementary (데이터)
└─ DataHub (카탈로그)
9.2 2025 새 트렌드
- **Semantic Layer**: dbt Semantic Layer, Cube, MetricFlow (지표 통일)
- **Reverse ETL**: Warehouse → CRM·광고 플랫폼
- **Zero-copy Cloning**: Snowflake·Databricks 데이터 복사 없이 복제
- **Open Table Format 수렴**: Iceberg 중심 재편
- **AI-assisted Data Engineering**: 코파일럿이 dbt 모델 초안 작성
10부 — 데이터 엔지니어 로드맵 6개월
Month 1: SQL + 웨어하우스
- PostgreSQL 고급 (window 함수, CTE, recursive)
- dbt 기본 프로젝트
Month 2: 오케스트레이션 + 파이프라인
- Airflow 또는 Dagster
- 스케줄링·의존성·재시도 전략
Month 3: Lakehouse
- Iceberg 또는 Delta 실전
- Trino 또는 DuckDB로 쿼리
- Parquet 튜닝
Month 4: Streaming
- Kafka 기본
- Flink 또는 Spark Streaming
- CDC (Debezium)
Month 5: 품질·관측성
- Great Expectations 또는 Soda
- DataHub 카탈로그
- Data Contract 시도
Month 6: 운영 + ML 연결
- 비용 모니터링 (FinOps)
- Feature Store (Feast)
- Semantic Layer
11부 — 데이터 엔지니어 체크리스트 12
1. **Lakehouse 3가지 테이블 포맷** 차이를 안다
2. **Lambda vs Kappa** 아키텍처 차이를 안다
3. **Event Time vs Processing Time + Watermark**를 설명할 수 있다
4. **Medallion (Bronze/Silver/Gold)** 각 계층 책임을 안다
5. **dbt의 `ref()`**로 의존성 그래프가 어떻게 생기는지 안다
6. **CDC** 파이프라인 구성을 안다
7. **Dagster의 Asset vs Airflow의 Task** 차이를 안다
8. **Data Mesh 4원칙**을 말할 수 있다
9. **Data Contract**가 무엇이고 왜 필요한지 안다
10. **데이터 품질 6차원**을 안다
11. **Data Observability 5 Pillars**를 안다
12. **Semantic Layer**의 목적을 안다
12부 — 데이터 엔지니어링 안티패턴 10
1. **Bronze 없이 Silver로 직접**: 재처리 불가. 원본 보존 필수
2. **Lambda 아키텍처 고집**: 로직 중복. Kappa 전환 고려
3. **dbt 없이 SQL 난립**: 의존성·테스트·문서화 부재
4. **Data Contract 없이 팀 간 데이터 공유**: 깨짐·추적 불가
5. **파티션 설계 없이 Parquet**: 쿼리 느림. Hidden Partitioning 활용
6. **UPSERT를 매 시간 배치**: Merge on Read가 안 되면 compaction 필요
7. **Airflow DAG에 비즈니스 로직**: 오케스트레이션에 상태 저장 ❌. dbt·Flink로 분리
8. **관측성 나중에**: 품질 지표 처음부터
9. **파이프라인 실패 시 재시도 전략 없음**: 멱등성 설계 필수
10. **비용 모니터링 없음**: 클라우드 warehouse 비용 폭주 흔함
마치며 — 데이터 엔지니어링은 "계약의 공학"
소프트웨어 엔지니어링이 "함수와 인터페이스의 공학"이라면, 데이터 엔지니어링은 **"스키마와 계약의 공학"**이다.
2025년의 본질은 그대로다:
- **신뢰할 수 있는 데이터**를 필요한 시점에 필요한 형태로 제공
- **조직의 의사결정·ML·제품**이 의존할 수 있는 기반
그러나 도구는 매년 바뀐다. Lakehouse, Streaming, dbt, Dagster, Data Contract — 2020년엔 없던 것들. 2030년엔 또 다른 것들.
핵심은 **원리**다:
- 데이터의 역사성 (Bronze 보존)
- 스키마 진화 (Contract)
- 처리의 멱등성 (안전한 재시도)
- 관측성 (문제 감지)
이것만 유지되면 도구는 필요에 따라 교체된다.
다음 글 예고 — "Observability 완전 가이드: Metric·Log·Trace·OpenTelemetry·eBPF·SLO"
Season 2 Ep 9는 현대 시스템의 신경계, **Observability**. 다음 글은:
- Metric·Log·Trace 3축 + Profile 4축 (Pyroscope)
- OpenTelemetry의 진짜 가치
- eBPF와 커널 수준 관측
- SLO·SLI·Error Budget 실전 설계
- Grafana Stack vs Elastic Stack vs Datadog
- 비용 통제 (로그 폭주 막기)
"관측할 수 없으면 운영할 수 없다", 다음 글에서 이어진다.
현재 단락 (1/318)
10년 전 데이터 엔지니어는 "ETL 스크립트 작성 + Hadoop 운영"이었다. 2025년의 기대치: