데이터 자산의 설계자, 댁스터(Dagster)는 무엇을 꿈꾸는가

이동휘·2025년 7월 28일
0

매일매일 블로그

목록 보기
46/49

안녕하세요! 지난 글들에서 우리는 데이터 파이프라인의 클래식 '에어플로우'와 실패를 지배하는 파일럿 '프리펙트'를 만나보았습니다. 두 도구 모두 '어떻게 하면 작업을 성공적으로 실행할까?'라는 질문에 훌륭한 답을 제시했죠.

하지만 데이터 엔지니어링의 세계는 또 다른 질문을 던지기 시작했습니다.

"Task가 성공적으로 실행되었다고 해서, 그 결과로 만들어진 데이터가 정말 올바를까?"
"이 테이블을 수정하면, 도대체 어떤 다운스트림 리포트와 대시보드에 영향을 미치는지 한눈에 알 수 없을까?"
"파이프라인을 단순한 스크립트가 아니라, 테스트하고 유지보수할 수 있는 진짜 '소프트웨어'처럼 만들 수는 없을까?"

이러한 근본적인 고민 속에서, 데이터 파이프라인을 바라보는 패러다임 자체를 바꾸는 도구가 등장했습니다. 바로 오늘 우리가 깊이 파헤쳐 볼 댁스터(Dagster)입니다. 댁스터는 '작업'이 아닌 '데이터 자산'을 무대의 주인공으로 내세우며, 데이터 파이프라인에 전례 없는 수준의 '관측가능성''신뢰성'을 부여합니다.

1. 핵심 철학: 최첨단 베이커리 공장으로 이해하기

댁스터란? 데이터 파이프라인을 통해 생성되는 모든 결과물, 즉 '데이터 자산(Data Asset)'을 중심으로 전체 워크플로우를 개발하고, 테스트하며, 관찰하는 데이터 개발 플랫폼입니다.

댁스터의 가장 중요한 키워드는 바로 '데이터 자산(Data Asset)'입니다. 댁스터는 파이프라인을 단순히 '수행해야 할 작업의 연속'으로 보지 않고, '가치 있는 데이터 자산을 만들어내는 공장(Factory)'으로 바라봅니다.

이 관점의 전환을 '완전 자동화된 최첨단 베이커리 공장'에 비유해 봅시다.

  • 생산품 & 중간 재료 (Data Asset): 이 공장의 목표는 맛있는 빵, 케이크, 쿠키를 만드는 것입니다. 이 최종 생산품들이 바로 우리의 목표 '데이터 자산'입니다. 또한, 빵을 만들기 위해 필요한 반죽, 크림, 초콜릿 칩 같은 중간 재료들도 모두 중요한 '데이터 자산'에 해당합니다.
  • 레시피 (Op & Graph): 각각의 빵이나 재료를 만드는 구체적인 방법, 즉 레시피입니다. 댁스터에서는 이 개별 레시피 단계를 Op라고 부릅니다.
  • 공장의 생산 라인 관리 시스템 (Dagster Engine & UI): 여기가 댁스터의 진정한 마법이 일어나는 곳입니다. 이 시스템은 단순히 레시피 순서대로 기계를 돌리는 것을 넘어, 모든 재료와 생산품의 상태를 관리합니다.
    • 재료의 신선도 추적 (Data Lineage & Observability): 이 초콜릿 케이크에 들어간 초콜릿 칩은 어제 어떤 공정으로 만들어졌고, 그 원료는 어디서 왔는지 그 출처를 모두 추적할 수 있습니다. 만약 특정 재료에 문제가 생기면, 그 재료를 사용한 모든 빵을 즉시 찾아낼 수 있습니다.
    • 품질 검사 및 테스트 (Testing): 반죽이 완성될 때마다 '점도가 적절한지', 빵이 구워질 때마다 '색깔이 균일한지' 자동으로 품질 검사를 할 수 있습니다. 댁스터는 파이프라인의 각 단계에서 데이터의 품질을 검증하는 기능을 내장하고 있습니다.
    • 선언적 스케줄링 (Declarative Scheduling): "매일 아침 9시에 식빵 생산 라인을 가동해"라고 명령하는 것이 아니라, "매일 아침 9시까지 '오늘의 신선한 식빵' 재고가 100개 채워져 있어야 한다"고 선언합니다. 그러면 시스템이 알아서 재고를 확인하고, 부족한 만큼만 생산 라인을 가동합니다. 이것이 바로 '자산 중심' 스케줄링입니다.
  • 중앙 관제 센터 (Dagit UI): 공장의 모든 것을 한눈에 볼 수 있는 곳입니다. 단순히 생산 라인이 돌아가는지만 보는 것이 아니라, 모든 빵, 케이크, 반죽(데이터 자산)의 목록과 각각의 현재 상태(최신인지, 오래되었는지), 품질, 그리고 어떤 레시피(Op)로부터 만들어졌는지를 그래픽으로 명확하게 보여줍니다.

이 비유처럼, 댁스터는 '무엇을 할 것인가'보다 '무엇을 만들 것인가'에 집중하여, 데이터 파이프라인의 개발, 테스트, 유지보수를 완전히 새로운 차원으로 끌어올립니다.

2. 코드 해독하기: 댁스터 핵심 개념 Deep Dive

댁스터의 핵심은 @asset 데코레이터 하나로 요약될 수 있습니다. 이 단순한 데코레이터가 어떻게 데이터 파이프라인의 패러다임을 바꾸는지 살펴보겠습니다.

Asset: 데이터 중심의 선언

자산(Asset)은 댁스터의 가장 핵심적인 추상화 개념입니다. 데이터베이스 테이블, 파일, 머신러닝 모델 등 파이프라인이 만들어내는 모든 결과물을 의미합니다.

  • @asset: 데이터 자산을 생성하는 파이썬 함수에 이 데코레이터를 붙입니다. 이 함수는 특정 자산을 계산하고 반환(또는 저장)하는 로직을 담습니다.
  • 자동 의존성 추론: 댁스터의 가장 강력한 기능 중 하나입니다. 하나의 자산 함수가 다른 자산을 인자로 받으면, 댁스터는 그 함수 시그니처를 보고 자동으로 자산 간의 의존 관계 그래프(Data Lineage)를 그려줍니다.
# 간단한 Asset 파일 예시 (my_assets.py)
from dagster import asset
import pandas as pd

@asset # 'raw_sales' 자산을 정의
def raw_sales() -> pd.DataFrame:
    # 원본 데이터를 DB나 파일에서 읽어오는 로직
    data = {'date': ['2023-10-26', '2023-10-26'], 'store': ['A', 'B'], 'amount': [100, 150]}
    return pd.DataFrame(data)

@asset # 'daily_summary' 자산을 정의
def daily_summary(raw_sales: pd.DataFrame) -> pd.DataFrame:
    # raw_sales 자산을 입력으로 받아 일별 요약 로직 수행
    # 댁스터는 이 함수의 인자를 보고 'raw_sales' -> 'daily_summary' 의존성을 자동으로 파악함
    return raw_sales.groupby('date').sum()

@asset
def store_a_sales(raw_sales: pd.DataFrame) -> pd.DataFrame:
    # 'raw_sales' 자산은 여러 다운스트림 자산에서 재사용될 수 있음
    return raw_sales[raw_sales['store'] == 'A']

위 코드만으로 댁스터는 raw_salesdaily_summarystore_a_sales 두 자산의 상위 자산이라는 사실을 완벽하게 이해하고 시각화해 줍니다. 더 이상 task_a >> task_b 와 같은 의존성을 수동으로 설정할 필요가 없습니다.

3. 무대 뒤의 시스템: 댁스터의 개발자 친화적 아키텍처

댁스터는 개발자의 생산성을 극대화하기 위한 독보적인 도구와 개념을 제공합니다.

Dagit: 단순한 UI를 넘어선 통합 개발 환경

Dagit은 댁스터의 웹 인터페이스이자, 로컬과 서버 환경 모두에서 사용할 수 있는 매우 강력한 개발 도구입니다.

  • 자산 그래프 (Asset Graph): 모든 데이터 자산과 그들의 의존 관계를 시각적으로 보여줍니다. 각 자산의 최신 상태, 마지막 업데이트 시간, 관련 메타데이터 등을 한눈에 볼 수 있습니다.
  • 실행 런치패드 (Launchpad): UI에서 직접 파이프라인을 실행하고, 설정을 변경하며 테스트할 수 있습니다. 코드를 수정하면 Dagit UI가 실시간으로 변경 사항을 반영하여, 개발 단계에서 매우 빠른 피드백 루프를 제공합니다.
  • 관측가능성 (Observability): 실행 기록, 로그, 각 자산이 '구체화(Materialization)'될 때 기록된 메타데이터(예: 테이블의 행 수, 파일 크기)를 상세히 볼 수 있습니다.

구체화 (Materialization)와 선언적 스케줄링

댁스터의 세계에서는 "Task를 실행한다"고 말하지 않고, "자산을 구체화(Materialize)한다"고 말합니다. 이는 자산을 계산하여 물리적인 저장소(파일, DB 테이블 등)에 저장하는 행위를 의미합니다.

사용자가 "daily_summary 자산을 구체화해줘"라고 요청하면, 댁스터는 의존성을 파악하여, 만약 raw_sales 자산이 최신이 아니라면 먼저 raw_sales를 구체화한 다음 daily_summary를 구체화하는 최적의 실행 계획을 세웁니다.

4. 댁스터, 무엇을 해결했는가?: 탄생의 이유

댁스터는 기존 오케스트레이션 도구들이 미처 해결하지 못했던 데이터 엔지니어링의 근본적인 문제들을 해결하고자 합니다.

  • 문제 1: Task의 성공 ≠ 데이터의 성공 → 해결: 데이터 품질 내재화
    기존 도구들은 Task의 성공 여부에만 집중합니다. 댁스터는 데이터 자체에 타입을 정의하고, 제약 조건을 걸며, 품질 테스트를 파이프라인의 일부로 내장할 수 있게 하여, "성공적으로 실행되었지만, 결과물은 신뢰할 수 있는 데이터"를 보장하고자 합니다.

  • 문제 2: 파편화된 개발과 운영 → 해결: 통합된 개발 경험
    Dagit이라는 강력한 로컬 개발 도구를 통해, 개발 환경과 운영 환경의 경험을 거의 동일하게 만듭니다. 로컬에서 코드를 작성하고 즉시 시각화하며 단위 테스트를 실행하는 경험은 개발 생산성을 극적으로 높입니다.

  • 문제 3: 유지보수의 어려움 → 해결: 데이터 계보(Lineage)의 자동화
    파이프라인이 수백 개로 늘어나면 그 관계를 파악하고 유지보수하는 것이 지옥이 됩니다. 댁스터는 모든 데이터 자산과 그들 사이의 의존 관계를 자동으로 추적하고 시각화해 줍니다. 이를 통해 "이 테이블을 수정하면 어떤 다운스트림에 영향을 미치지?"라는 질문에 즉시 답할 수 있게 됩니다.

5. 그래서, 댁스터를 선택해야 할 이유 (그리고 고려할 점)

댁스터가 빛을 발하는 순간 (장점)

  • 강력한 데이터 인식: '자산' 개념을 통해 파이프라인의 목적(데이터 생성)을 명확히 하고, 데이터의 계보(Lineage)와 상태를 추적하는 데 독보적입니다.
  • 뛰어난 개발자 경험 및 테스트 용이성: Dagit을 이용한 로컬 개발 및 디버깅 환경은 타의 추종을 불허합니다. 코드 변경 시 즉시 UI에 반영되고, 단위/통합 테스트를 쉽게 구성할 수 있습니다.
  • 선언적 접근법: "무엇을 할지(How)"가 아닌 "어떤 상태여야 하는지(What)"를 정의함으로써, 시스템이 최적의 실행 계획을 세우게 하여 유지보수성과 예측 가능성을 높입니다.
  • 점진적 도입 가능: 기존의 에어플로우나 dbt 워크플로우를 댁스터의 자산으로 감싸서, 점진적으로 통합하고 전체 데이터 흐름을 관찰하는 데 사용할 수도 있습니다.

댁스터가 어울리지 않을 수 있는 순간 (단점)

  • 높은 학습 곡선: 자산, Op, 리소스 등 댁스터 고유의 개념과 철학을 이해하는 데 시간이 걸릴 수 있습니다. 특히 기존의 Task 중심 도구에 익숙한 사용자에게는 사고방식의 전환이 필요합니다.
  • 상대적으로 복잡한 설정: 강력한 기능을 제공하는 만큼, 초기 설정이나 '리소스(Resource)' 같은 개념을 제대로 활용하려면 더 많은 것을 배워야 합니다.
  • 아직 성장 중인 생태계: 커뮤니티와 통합 라이브러리가 빠르게 성장하고 있지만, 에어플로우만큼 방대하지는 않을 수 있습니다.

결론: 데이터 파이프라인을 '소프트웨어'의 영역으로

댁스터는 최첨단 베이커리 공장처럼, 단순히 레시피(작업)를 순서대로 실행하는 것을 넘어, 최종 생산품인 빵과 케이크(데이터 자산)와 그 재료들의 품질, 신선도, 생산 이력(Lineage)을 완벽하게 관리하고 추적하는 데이터 개발 플랫폼입니다.

'무엇을 할 것인가'가 아닌 '어떤 가치 있는 데이터를 만들 것인가'에 초점을 맞춤으로써, 데이터 파이프라인을 단순한 자동화 스크립트에서 신뢰할 수 있고 유지보수 가능한 소프트웨어 엔지니어링의 영역으로 끌어올린 혁신적인 도구라고 할 수 있습니다.

만약 여러분의 팀이 데이터의 품질과 신뢰성을 최우선으로 생각하고, 복잡한 데이터 생태계를 체계적으로 관리하고 싶다면, 이 꼼꼼한 아키텍트, 댁스터와 함께 데이터 플랫폼의 청사진을 그려보는 것은 어떨까요?

0개의 댓글