Tag: ELT

  • dbt로 데이터 변환 모델링하기: 분석 엔지니어링의 표준

    dbt로 데이터 변환 모델링하기: 분석 엔지니어링의 표준

    웨어하우스에 데이터를 적재한 뒤 그것을 분석 가능한 형태로 변환하는 일은 오랫동안 복잡한 SQL 스크립트 더미와 수작업으로 이뤄졌습니다. 누가 어떤 테이블을 만들었는지, 의존 관계가 무엇인지 아무도 모르는 상태가 흔했습니다. dbt는 이 변환 계층(ELT의 T)을 소프트웨어 엔지니어링 원칙으로 다루게 해주는 도구입니다.

    이 글에서는 dbt의 모델, 참조 시스템, 테스트, 문서화를 차례로 살펴보고, 실무에서 모델 구조를 어떻게 잡아야 하는지 다룹니다.

    dbt가 바꾸는 것

    dbt의 출발점은 단순합니다. 모든 변환은 SELECT 문 하나로 표현되는 모델이고, dbt가 그것을 CREATE TABLE 또는 VIEW로 감싸 실행합니다. 엔지니어는 결과 테이블이 아니라 그 테이블을 정의하는 쿼리에 집중합니다. 여기에 버전 관리, 테스트, 의존성 그래프가 따라옵니다.

    핵심 마법은 ref 함수입니다. 모델끼리 직접 테이블명을 쓰지 않고 ref로 참조하면 dbt가 의존 그래프를 자동 구성하고 올바른 순서로 빌드합니다. 환경(dev, prod) 간 스키마 전환도 ref가 알아서 처리합니다.

    모델 계층 구조

    잘 설계된 dbt 프로젝트는 보통 세 계층으로 나눕니다. 이 구조는 변경에 강하고 재사용이 쉽습니다.

    • staging: 원천 테이블당 1:1, 컬럼명 정리와 타입 캐스팅만
    • intermediate: 여러 staging을 조합한 중간 로직, 재사용 단위
    • marts: 비즈니스 도메인별 최종 산출물, BI 연결
    -- models/marts/fct_orders.sql
    with orders as (
        select * from {{ ref('stg_orders') }}
    ),
    payments as (
        select * from {{ ref('stg_payments') }}
    )
    select o.order_id, o.customer_id, sum(p.amount) as total
    from orders o left join payments p using (order_id)
    group by 1, 2

    테스트와 문서화

    dbt의 진짜 강점은 데이터 품질 테스트를 선언적으로 붙일 수 있다는 점입니다. YAML에 not_null, unique, accepted_values, relationships 같은 제약을 명시하면 빌드마다 자동 검증됩니다. 기본 테스트로 부족하면 SQL로 커스텀 테스트를 작성합니다.

    같은 YAML에 컬럼 설명을 적으면 dbt docs가 자동으로 데이터 카탈로그와 계보 그래프를 생성합니다. 코드와 문서가 한곳에 있어 문서가 낡지 않는다는 점이 큰 가치입니다.

    운영과 성능

    모델이 수백 개를 넘으면 전체 빌드 시간이 부담스러워집니다. 매번 전체 테이블을 새로 만드는 대신 incremental 모델로 새 데이터만 추가 처리하세요. is_incremental 분기로 증분 조건을 걸면 빌드 시간이 수십 분에서 수 분으로 줄어듭니다.

    또한 dbt build와 함께 상태 비교 선택(state:modified)을 쓰면 변경된 모델과 그 하위만 빌드해 CI 시간을 절약할 수 있습니다. 한 가지 주의점은 증분 모델의 고유 키 설정 오류로 인한 중복인데, unique 테스트로 반드시 방어하세요.

    dbt는 분석가를 엔지니어로 만든다. 버전 관리, 테스트, 문서화가 SQL 워크플로에 자연스럽게 녹아들기 때문이다.

    정리

    dbt는 변환 계층을 모듈화된 SQL 모델로 다루며 ref 기반 의존성, 선언적 테스트, 자동 문서화를 제공합니다. staging-intermediate-marts 계층으로 구조를 잡고, 증분 모델로 성능을 확보하며, 테스트로 품질을 지키는 것이 분석 엔지니어링의 표준 워크플로입니다.

  • ETL vs ELT: 어떤 데이터 통합 방식을 선택해야 할까

    ETL vs ELT: 어떤 데이터 통합 방식을 선택해야 할까

    데이터 통합 전략을 논할 때 가장 먼저 마주치는 갈림길이 ETL과 ELT입니다. 글자 순서만 바뀐 듯 보이지만, 변환을 적재 전에 하느냐 후에 하느냐는 아키텍처 전체, 비용 구조, 팀 역할 분담까지 바꿉니다. 클라우드 웨어하우스의 등장으로 무게중심이 ELT로 옮겨갔지만, ETL이 여전히 우월한 영역도 분명히 있습니다.

    이 글은 두 방식의 동작 원리를 비교하고, 비용과 거버넌스 관점에서 어떤 상황에 무엇을 골라야 하는지 정리합니다.

    두 방식의 기본 흐름

    ETL은 추출(Extract) 후 별도의 처리 엔진에서 변환(Transform)을 마친 뒤 정제된 데이터만 웨어하우스에 적재(Load)합니다. ELT는 원본을 먼저 웨어하우스에 그대로 적재한 다음, 웨어하우스의 연산 능력으로 그 안에서 변환합니다.

    이 차이의 핵심은 변환이 일어나는 장소입니다. ETL은 외부 처리 클러스터에서, ELT는 웨어하우스 내부에서 변환합니다. 클라우드 웨어하우스의 연산이 저렴하고 탄력적이 되면서 ELT가 부상한 배경이 여기 있습니다.

    정면 비교

    기준ETLELT
    변환 위치외부 처리 엔진웨어하우스 내부
    원본 보존적재 안 됨그대로 보존
    유연성스키마 사전 고정나중에 재변환 용이
    민감정보적재 전 마스킹 가능적재 후 처리 필요
    적합 환경온프레미스, 규제클라우드 웨어하우스

    ELT가 유리한 경우

    대부분의 클라우드 네이티브 분석 환경에서는 ELT가 기본 선택입니다. 원본을 먼저 보존하므로 비즈니스 로직이 바뀌어도 재추출 없이 다시 변환만 하면 됩니다. dbt 같은 도구가 웨어하우스 내부 변환을 SQL로 관리해주면서 분석가도 직접 변환을 다룰 수 있게 되었습니다.

    또한 변환 로직을 추가하거나 새 지표를 만들 때 파이프라인을 다시 짤 필요 없이 SQL 모델만 더하면 됩니다. 이 민첩성이 ELT의 가장 큰 매력입니다.

    ETL이 여전히 옳은 경우

    반면 개인정보나 결제 정보처럼 원본을 웨어하우스에 그대로 두면 안 되는 규제 환경에서는 ETL이 필요합니다. 적재 전에 마스킹이나 토큰화를 끝내야 하기 때문입니다. 또한 웨어하우스 연산 비용이 비싼 환경이라면, 적재 전 변환으로 데이터 양을 줄여 비용을 통제하는 편이 낫습니다.

    • 규제·컴플라이언스: 적재 전 PII 제거 필요 시 ETL
    • 복잡한 비정형 변환: 웨어하우스 SQL로 표현하기 어려운 로직은 ETL
    • 비용 통제: 적재량을 줄여야 할 때 ETL 사전 필터링

    실무에서는 둘을 섞은 하이브리드도 흔합니다. 민감정보는 ETL로 사전 처리하고 나머지는 ELT로 유연하게 다루는 식입니다. 정답은 하나가 아니라 데이터 성격과 규제 요건에 달려 있습니다.

    정리

    ETL과 ELT의 차이는 변환의 시점과 장소입니다. 클라우드 웨어하우스 환경에서 유연성과 민첩성이 중요하면 ELT, 규제·민감정보·비용 통제가 우선이면 ETL이 적합합니다. 많은 조직은 두 방식을 상황에 맞게 혼합합니다. 데이터의 민감도와 변환 복잡성을 기준으로 선택하세요.