본문으로 건너뛰기
0
r/jeffnews HN 약 4분

dbt를 10년 늦게 시작한 후기 (DuckDB 에디션)

backend

요약

dbt를 10년 늦게 발견한 저자가 DuckDB와 조합해 UK 홍수 모니터링 API 데이터 파이프라인을 구축한 경험기. source 분리, staging 모델, Jinja 매크로, 테스트, 자동 문서화, Dagster 오케스트레이션까지 전체 과정을 다룸.

기사 전체 정리

dbt를 10년 늦게 시작한 후기 (DuckDB 에디션)

Sources: 추출과 변환의 분리

  • dbt의 source 개념으로 데이터 추출(Extract)과 변환(Transform)을 깔끔하게 분리할 수 있음
  • DuckDB의 read_json으로 API 데이터를 직접 읽어올 수 있지만, dbt에서는 이를 source로 정의해서 관리함
  • source 정의에 Markdown 설명을 넣으면 나중에 자동 문서화에 그대로 활용됨
  • 비행기 안처럼 API 접근이 안 되는 환경에서는 정적 데이터셋으로 source만 교체하면 됨

Staging 모델과 매크로

  • staging 모델에서 원본 데이터를 정리하고, 이후 mart 모델에서 비즈니스 로직을 적용하는 계층 구조를 사용함
  • Jinja 템플릿으로 반복 로직을 매크로화할 수 있어서 SQL의 boilerplate를 크게 줄임
  • {{ source() }}{{ ref() }}로 모델 간 의존성을 선언적으로 관리함

테스트: freshness부터 커스텀 테스트까지

  • not_null, unique 같은 기본 테스트를 YAML 한 줄로 설정 가능함
  • source freshness 테스트로 데이터가 얼마나 오래됐는지 자동 체크함
  • singular test로 비즈니스 로직에 맞는 커스텀 검증도 SQL 파일 하나로 추가할 수 있음

문서화: 자동 생성 리니지 그래프

  • dbt docs generate로 전체 파이프라인의 리니지 그래프가 자동 생성됨
  • 모델 간 의존 관계가 시각적으로 표현되어 데이터 흐름을 한눈에 파악 가능함
  • YAML에 작성한 description이 문서에 자동 반영되므로 별도 문서 관리가 필요 없음

Dagster로 오케스트레이션

  • Dagster가 dbt와 네이티브로 통합되어 dbt 모델을 asset으로 인식함
  • 실행 이력 추적, 스케줄링, 모니터링을 Dagster UI에서 한 번에 관리할 수 있음
  • Dagster 설정 코드는 Claude가 작성해줬다고 저자가 직접 밝힘

핵심 인사이트

  • dbt는 대규모 프로젝트만을 위한 도구가 아님 — 소규모 개인 프로젝트에서도 변환 로직에 구조와 엄격함을 부여해줌
  • UK Environment Agency 홍수 모니터링 API 데이터를 DuckDB + dbt + Dagster로 엮은 전체 파이프라인 예제가 포함됨
  • 10년 늦게 시작했지만 dbt가 가져다주는 체계적인 데이터 변환 관리의 가치를 실감했다는 후기임

핵심 포인트

  • dbt source로 추출/변환 분리하여 체계적 데이터 관리 가능
  • DuckDB read_json으로 API 데이터 직접 수집
  • freshness, not_null, unique 등 선언적 테스트와 커스텀 singular 테스트 지원
  • dbt docs로 리니지 그래프 포함 문서 자동 생성
  • Dagster로 dbt 모델을 asset 기반 오케스트레이션

인사이트

dbt는 대규모 프로젝트 전용이 아니라 소규모 개인 프로젝트에서도 데이터 변환에 구조와 엄격함을 부여하는 도구임

댓글

댓글

댓글을 불러오는 중...

backend

Redis 8.0 출시 — I/O 스레딩 갈아엎고 처리량 3배, 2.1M ops/sec 달성

Redis 8.0이 I/O 스레딩 모델을 완전히 재설계해서 16코어 기준 2.1M ops/sec를 달성함 (7.4 대비 3배). Hash field expiration, Vector search HNSW, Client-side caching v2, Redis Functions 2.0 async 실행 등 굵직한 기능이 추가되고, jemalloc 통합으로 메모리 fragmentation도 25% 줄어듦.

backend

칩셋 레이턴시를 측정해봤더니 — 쓸모는 없지만 재밌는 실험

Vulkan GPU 벤치마크로 여러 세대 마더보드 칩셋의 PCIe 레이턴시를 측정한 실험. CPU 직결 대비 칩셋 경유 시 수백 ns 레이턴시가 추가되며, 의외로 2012년 Skylake Z170이 가장 낮은 추가 레이턴시를 보임.

backend

ForgeKV — Rust로 만든 멀티코어 Redis 대체제

Rust로 만든 Redis 드롭인 대체제. 64-샤드 잠금 아키텍처로 멀티코어 스케일링 지원. 2코어 환경에서 Redis 7 대비 41% 빠른 SET 처리량(158K ops/s). 고동시성에서는 약점 있음. Source-available 라이선스.

backend

AI 바이브 코딩에 Go를 쓰는 이유 — Rust도 Python도 아닌

AI가 코드의 90%를 쓰는 바이브 코딩 시대에 Go가 최적의 언어라는 주장. Python은 안전장치가 없고, Rust는 언어 자체의 문제까지 인간에게 떠넘기지만, Go는 중요한 것만 잡고 비켜준다는 논리. 실제로 한 세션에 3도메인 풀스택 블로그를 7커밋으로 완성한 사례 제시.

backend

rsloop: Rust로 만든 Python asyncio 이벤트 루프 (io_uring 지원)

PyO3 기반으로 Python asyncio 이벤트 루프를 Rust로 재구현한 rsloop. Linux에서 compio + io_uring을 사용하고, asyncio 호환 표면이 넓어 drop-in 교체가 가능하다. uvloop과는 다른 접근으로 이벤트 루프 성능을 노리는 프로젝트.