End-to-End DataOps Portfolio

핀테크 QuickPay
데이터 운영 파이프라인 구축

대용량 트랜잭션 환경을 가정한 로그 설계부터 지표 시각화, 품질 모니터링까지 — DataOps 전 과정을 구현한 End-to-End 프로젝트

8
모듈 구성
28
이벤트 택소노미
15+
품질 검증 규칙
5
핵심 KPI

프로젝트 핵심 목표

데이터 신뢰성, 파이프라인 자동화, 확장 가능한 모델링을 지향합니다

🛡️
Reliability
비즈니스 데이터의
신뢰성 확보
🔭
Observability
파이프라인 자동화 및
가시성 구축
📐
Scalability
확장 가능한
데이터 모델링
📊
Business Value
의사결정을 위한
데이터 시각화

아키텍처 및 데이터 흐름

데이터 수집부터 시각화까지, 전체 파이프라인의 흐름을 한눈에

Source
App Logs · DB
Ingestion
Python Generator
Storage
DuckDB · PostgreSQL
Transform
dbt (ELT)
Orchestration
Apache Airflow
Quality
GE · Slack Alert
Serving / BI
Tableau

핵심 구현 내용

GitHub 코드 구조 기반, DataOps 직무 역량 어필 포인트

Feature 01 — 01_log_design/
로그 설계 및 데이터 거버넌스
무작위로 데이터를 쌓은 것이 아니라, 체계적인 규칙(Taxonomy)을 정의하여 5개 도메인 × 28개 이벤트의 표준화된 로그 체계를 설계했습니다.
Category-Action-Label 구조의 이벤트 택소노미 정의
JSON Schema를 통한 데이터 유효성 검증 설계
{domain}_{action}_{detail} snake_case 네이밍 컨벤션
UUID v4 기반 이벤트 고유 식별자 체계
도메인 이벤트 예시 트리거 비즈니스 용도
Auth auth_signup_completed 가입 완료 가입 완료율, DAU
Payment payment_transfer_completed 송금 성공 매출, GMV
Product product_detail_viewed 상품 상세 조회 상품 인기도
Screen screen_viewed 화면 진입 트래픽 분석
System system_error_occurred 에러 발생 에러 모니터링
sample_events.json
{
  "event_id": "550e8400-e29b-41d4-a716-446655440002",
  "event_name": "payment_transfer_completed",
  "event_timestamp": "2026-02-12T10:23:45.789Z",
  "user_id": "usr_a1b2c3d4",
  "platform": "ios",
  "app_version": "3.2.1",
  "event_properties": {
    "amount": 50000,
    "currency": "KRW",
    "transfer_type": "instant",
    "fee": 0,
    "latency_ms": 342
  }
}
Feature 02 — 04_dbt_mart/
데이터 모델링 및 변환 (dbt)
Raw Data를 분석 가능한 형태로 변환하는 ELT 패턴을 적용하고, Staging → Intermediate → Marts 3계층 구조로 데이터 마트를 설계했습니다.
ELT 패턴 — Load first, Transform later
dbt Lineage — 데이터 의존성 추적 및 관리
3계층 마트 — Staging → Intermediate → Marts
dbt test — 데이터 무결성 자동 검증
dbt Lineage Graph (DAG)
events
stg_events
int_daily_active_users
mart_daily_kpi
int_funnel_conversion
mart_funnel
int_user_cohort
mart_retention
transactions
stg_transactions
mart_revenue
users
stg_users
models/marts/mart_daily_kpi.sql
-- 일간 핵심 KPI 마트: Tableau 대시보드의 메인 데이터 소스
WITH daily_users AS (
    SELECT
        activity_date,
        COUNT(DISTINCT user_id) AS dau,
        COUNT(DISTINCT CASE WHEN user_type = 'new'
              THEN user_id END) AS new_users,
        COUNT(DISTINCT CASE WHEN user_type = 'returning'
              THEN user_id END) AS returning_users
    FROM {{ ref('int_daily_active_users') }}
    GROUP BY 1
),
daily_transactions AS (
    SELECT
        transaction_date,
        SUM(CASE WHEN status = 'completed'
            THEN amount ELSE 0 END) AS gmv,
        SUM(CASE WHEN status = 'completed'
            THEN fee ELSE 0 END) AS total_fee_revenue
    FROM {{ ref('stg_transactions') }}
    GROUP BY 1
)
Feature 03 — 08_airflow_dags/
워크플로우 오케스트레이션 (Airflow)
데이터 파이프라인의 자동화 및 스케줄링을 구현하고, Task 간 의존성 관리와 실패 시 재시도 정책, 조건 분기 로직을 포함했습니다.
Task 의존성 — 데이터 검증 → dbt → 품질 → 시각화
재시도 정책 — retries=2, retry_delay=5min
BranchOperator — 품질 점수 기반 조건 분기
3개 DAG — 일간 지표 / 품질 검증 / Tableau 갱신
Airflow DAG: quickpay_daily_metrics
check_data_freshness
run_dbt_models
run_dbt_tests
run_quality_checks
🔀 branch_on_quality
export_tableau_data
notify_success
dag_daily_metrics.py — 분기 로직
def _check_quality_result(**kwargs):
    """품질 점수에 따라 다음 작업을 분기"""
    report_dir = Path("/opt/airflow/.../reports")
    report_files = sorted(report_dir.glob("quality_report_*.json"))

    with open(report_files[-1]) as f:
        report = json.load(f)

    # 품질 점수 80% 미만이면 실패 경로
    if report["quality_score"] < 80:
        return "notify_failure"
    else:
        return "export_tableau_data"

branch_on_quality = BranchPythonOperator(
    task_id="branch_on_quality",
    python_callable=_check_quality_result,
)
Feature 04 — 07_data_quality/
데이터 품질 관리 (Data Quality & QA)
"쓰레기 데이터(GIGO)"를 막기 위한 다층 방어 체계를 구축하고, 이상 발생 시 Slack 알림 자동화로 운영 대응 속도를 확보했습니다.
Great Expectations + dbt test 이중 검증 체계
15+ 검증 규칙 — Null, Unique, 비즈니스 로직
Slack Webhook — Block Kit 기반 리포트 알림
Z-score 이상 탐지 — 볼륨 이상치 자동 감지
93%
Quality Score
14
Passed
1
Failed
15
Total Checks
events_not_null_event_id
events_unique_event_id
events_valid_event_name
events_valid_platform
events_not_null_timestamp
txn_not_null_id
txn_valid_amount
txn_no_negative_fee
txn_valid_status
volume_z_score_normal
events_semantic_version
events_user_id_pattern
txn_success_rate_above_90
freshness_within_24h
🟡 txn_users_exist_in_users
🤖
QuickPay DataBot APP 오전 6:31
✅ QuickPay 데이터 품질 리포트
품질 점수
93.3%
검증 결과
✅ 14 / ❌ 1 / 전체 15
실행 시각
2026-02-13 06:30
환경
DuckDB (dev)
Feature 05 — 06_tableau_dashboard/
데이터 시각화 및 인사이트
구축한 파이프라인을 통해 최종적으로 비즈니스 가치를 창출하는 결과물을 생성하고, 의사결정자를 위한 직관적인 대시보드를 설계했습니다.
5개 핵심 KPI — DAU, GMV, ARPPU, 전환율, 리텐션
4개 대시보드 — KPI 종합 / 퍼널 / 리텐션 / 매출
인터랙티브 필터 — 날짜, 플랫폼, 코호트별
Metrics Tree — NSM → KPI → 운영지표 분해 체계
📈 QuickPay Executive KPI Dashboard
📅 최근 30일
📱 전체 플랫폼
DAU
85.2K
▲ 12.3%
MAU
342K
▲ 8.7%
GMV
₩48.2B
▲ 15.1%
수수료 매출
₩2.1B
▲ 9.4%
성공률
97.8%
▲ 0.3%
📊 DAU Trend (7일 이동평균)
🔄 Conversion Funnel
가입 시작 100%
정보 제출 85%
가입 완료 72%
본인인증 58%
첫 송금 시도 45%
첫 송금 완료 38%
📊 Retention Cohort Heatmap
D0
D1
D3
D7
D14
D30
W1
100%
62%
48%
38%
29%
22%
W2
100%
58%
45%
35%
26%
20%
W3
100%
65%
51%
42%
32%
24%
W4
100%
60%
47%
36%
28%
21%

트러블슈팅 및 배운 점

단순히 "완성했다"보다 "어려움을 극복했다"가 더 큰 성장입니다

Problem
대량의 로그 데이터 적재 시 Airflow Worker 메모리 부족 현상 발생
Solution
배치를 Chunking으로 분할하고, SQL 기반 연산(ELT 패턴)으로 부하를 DB로 위임하여 해결. Python에서의 데이터 처리를 최소화하고 DuckDB/PostgreSQL 내부에서 변환 수행.
Problem
파이프라인 재실행 시 중복 데이터 적재 이슈 발생
Solution
dbt incremental 모델 적용 및 unique_key 설정을 통한 멱등성(Idempotency) 보장. 재실행해도 동일한 결과가 보장되는 파이프라인 설계.
Problem
품질 검증 결과가 있어도 알림 없이 방치되어 데이터 이슈 늦게 발견
Solution
Slack Webhook + Block Kit 기반 자동 알림 시스템 구축. 심각도(Critical/Warning)에 따른 차등 알림으로 운영 대응 속도 개선.
Problem
지표 정의가 팀마다 다르게 해석되어 데이터 정합성 이슈 발생
Solution
Metrics Dictionary(지표 정의서)와 Data Lineage 문서를 작성하여 단일 진실 공급원(Single Source of Truth) 확보. dbt docs를 통한 자동 문서화.

기술 스택

프로젝트에 사용된 핵심 기술과 도구들

Languages
Python 3.11+
데이터 생성, 품질 검증, ETL
SQL
dbt 모델링, 지표 추출 쿼리
Frameworks & Tools
dbt (Data Build Tool)
데이터 변환 및 마트 구축
Apache Airflow
워크플로우 오케스트레이션
Great Expectations
데이터 품질 검증 프레임워크
Infrastructure
DuckDB
로컬 분석용 In-Process DB
PostgreSQL
프로덕션 데이터 웨어하우스
Docker
컨테이너 기반 로컬 환경
Visualization & Monitoring
Tableau
KPI 대시보드 시각화
Slack Webhook
품질 알림 자동화

📁 프로젝트 구조

fintech-dataops-portfolio/
├── README.md                          # 프로젝트 개요
├── requirements.txt                   # Python 의존성
│
├── 01_log_design/                     # ① 서비스 로그 설계
│   ├── event_taxonomy.md              # 이벤트 택소노미 (28개 이벤트)
│   ├── log_schema.md                  # 로그 스키마 정의서
│   ├── event_schema.json              # JSON Schema 유효성 검증
│   └── sample_events.json             # 샘플 이벤트 데이터
│
├── 02_metrics_definition/             # ② 핵심 지표 정의
│   ├── metrics_dictionary.md          # KPI 정의서 (NSM → 5 KPIs → 10 OPs)
│   ├── metrics_tree.md                # 지표 트리 & 문제 진단 시나리오
│   └── data_lineage.md               # 데이터 리니지 문서
│
├── 03_data_generation/                # 시뮬레이션 데이터 생성
│   ├── generate_events.py             # Faker 기반 이벤트 로그 생성
│   ├── generate_transactions.py       # 거래 데이터 생성기
│   └── load_to_db.py                  # DuckDB/PostgreSQL 적재
│
├── 04_dbt_mart/                       # ③ dbt 데이터 마트
│   ├── models/staging/                # 스테이징: 타임존 변환, 필터링
│   ├── models/intermediate/           # 중간: DAU, 퍼널, 코호트 계산
│   ├── models/marts/                  # 최종: KPI, 리텐션, 매출 마트
│   └── tests/                         # dbt 테스트 (DAU>0, 매출≥0)
│
├── 05_sql_queries/                    # ④ SQL 지표 추출 쿼리
│
├── 06_tableau_dashboard/              # ⑤ Tableau 시각화
│   ├── dashboard_design.md            # 대시보드 설계서 (4개 시트)
│   └── exports/                       # Tableau용 CSV (4종)
│
├── 07_data_quality/                   # ⑥ 품질 모니터링
│   ├── great_expectations/            # GE 검증 스위트
│   ├── run_quality_checks.py          # 15+ 품질 규칙 실행기
│   └── slack_alert.py                 # Slack Block Kit 알림
│
└── 08_airflow_dags/                   # ⑦ 운영 자동화
    ├── dag_daily_metrics.py           # 일간 지표 파이프라인
    ├── dag_data_quality.py            # 6시간 주기 품질 검증
    └── dag_tableau_refresh.py         # Tableau 데이터 갱신