pile·
DB / 데이터·NC소프트 DANBINC소프트 DANBI·

ETL 개념과 ETL 개발 시 고려해야 하는 원칙들

엔씨소프트 데이터 조직이 ETL 개발에서 지켜야 할 원칙을 정리한 글이다. ETL은 정답이 정해져 있지 않아 이 설계가 맞는지, 더 효율적인 구조는 없는지 하는 고민이 반복된다. 글은 ETL의 개념과 역할을 먼저 정리한 뒤 멱등성부터 모니터링까지 아홉 가지 원칙, 추가 고려사항 네 가지, 자동화 가능한 워크플로우 패턴 세 가지 순으로 이어진다. Airflow 운영을 전제로 한 예시가 많다.

핵심 포인트
  • ETL은 추출·변환·적재 세 단계로 이뤄진 연속 프로세스이고, 여러 팀의 정형·비정형 데이터를 비즈니스에 쓸 수 있는 형태로 바꾸는 일이다
  • 모든 ETL 실행 결과는 멱등해야 한다. 재실행, 중단 후 재개, 과거 날짜 재적재, 예약 작업의 수동 실행이 모두 같은 결과를 내야 한다
  • 멱등성 확보 수단은 비즈니스 로직 고유 키 기준 OVERWRITE와 MERGE INTO 두 가지이며, 데이터가 많으면 전자가 성능상 유리하다
  • 전체 팩트 테이블을 스캔하는 대신 이전 날짜 파티션만 읽는 점진적 적재로 바꾼다
  • 시간에 따라 소급 적용되는 비즈니스 로직은 하드코딩하지 말고 유효 날짜를 매개변수 테이블에 저장한다
  • 운영과 테스트 환경 분리가 가장 먼저 고려돼야 한다. 테스트가 운영 테이블을 덮어쓰는 사고가 제일 치명적이다
상세 정리
  • 멱등성 정의: 다른 날짜·시간·조건에서 같은 매개변수로 실행해도 결과가 동일하게 유지되는 성질이다
  • 멱등성이 푸는 문제: ETL 실패 후 재실행, 비즈니스 로직 변경에 따른 과거분 재적재, 라이브를 미러링한 개발 환경 구축 세 가지다
  • 멱등성 실패 사례: 중단 시점부터 이어서 적재하면 데이터가 중복되고 원래 의도한 결과를 얻지 못한다
  • 점진적 적재 예시: 전체 기간을 COUNT 하던 쿼리를 어제 요약 테이블 파티션과 오늘 팩트 테이블 파티션의 UNION으로 바꿔 쓴다
  • 과거 데이터 적재: 실행 날짜와 무관하게 시작 매개변수만 과거로 지정하면 그 시점 데이터를 다시 적재할 수 있어야 한다
  • 데이터 분할: 대개 날짜 스탬프로 파티션을 나누고, UPDATE·APPEND·DELETE 대신 특정 파티션을 덮어써 데이터베이스 이상현상을 막는다
  • 중간 데이터: 임시 로컬 파일은 다른 Task가 접근하지 못하는 경우가 생기므로 모든 Task가 접근 가능한 영역에 둔다. 필자 팀은 중간 데이터 전용 DB를 따로 운영한다
  • 작업 단위: 작업 하나가 단일 파티션으로 출력돼야 논리 테이블과 작업, 파티션과 작업 인스턴스의 매핑이 단순해지고 전체가 아닌 셀 하나만 골라 재실행할 수 있다
  • 데이터 검사: 스키마 타입 일치, 제약조건, 도메인 적용, 예상 레코드 수 일치를 본다. 레코드가 과하게 많으면 JOIN 오류를, 적으면 로직 오작동을 의심한다
  • 모니터링: Airflow의 DAGs 탭으로 전체 상태를, Graph View로 실패한 Task를, Gantt Chart로 Task별 소요 시간을, Task Tries로 재시도가 잦은 Task를 확인한다
  • 리소스: DAG 수가 늘면 실행 속도가 느려지고 대기 시간이 길어지는데, 배치 주기가 짧은 DAG일수록 목표 시각을 놓칠 위험이 크다
  • 작명 규칙: 같은 데이터인데 테이블마다 컬럼명이 다르면 매번 열어 확인하는 단계가 붙고, DAG 이름 규칙이 없으면 로그만 보고 어떤 작업이 깨졌는지 알기 어렵다
  • 의존성: 실행 도구와 DAG 코드, 컨테이너와 라이브러리, Airflow 버전과 파이썬 버전까지 초기에 분리해두지 않으면 DAG가 늘수록 얽힌다
  • 자동화 패턴: 증분 계산은 어제 요약 파티션과 오늘 팩트 파티션만으로 누적값을 집계하고, 과거 데이터 적재는 미니 백필로 쪼개 병렬화하며, 비정규화는 팩트 테이블을 조인해 대시보드용 테이블을 만든다
왜 읽나배치 파이프라인에서 반복되는 재실행·백필·검증 문제를 원칙 수준으로 정리해 자기 파이프라인 점검표로 쓸 수 있다.
NC소프트 DANBI
NC소프트 DANBI 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. DB / 데이터·여기어때 (GC컴퍼니)여기어때 (GC컴퍼니)·

    분석가가 직접 만든 마케팅 자동화 시스템 — 오디언스 빌더 제작기

    여기어때 데이터 분석팀(UB팀)이 개발 경험 없이 AI 에이전트 바이브 코딩으로 마케팅 자동화 시스템 '오디언스 빌더'를 구축한 과정이다. SQL 없이 UI에서 타겟 조건을 설정하면 BigQuery에서 수천만 행 대상자를 추출해 Kafka·S3를 통해 마케팅 도구로 전달하는 파이프라인을 직접 만들어, 캠페인 준비 시간을 2~3일에서 10분으로 단축했다.

    요약 이어보기
    #data-pipeline#kafka#postgres+2
  2. DB / 데이터·vercel-blogVercel Blog·

    모든 Vercel 빌드를 지탱하는 데이터베이스 마이그레이션 이야기

    Vercel이 빌드 웜 풀(warm pool) 상태 데이터를 Redis에서 DynamoDB로 마이그레이션한 과정을 다룬다. 빌드 풀의 청구 매핑 데이터가 Redis 장애 시 복구 불가능하다는 구조적 위험이 이주를 결정한 핵심 이유였고, 24/7 프로덕션 트래픽 속에서 다운타임 없이 5단계 점진적 전환을 완료했다.

    요약 이어보기
    #database-migration#zero-downtime#redis+2
  3. DB / 데이터·channel-talk채널톡·

    DynamoDB 핫 파티션을 해결하는 3가지 방법 (3): 조회를 인덱스 테이블로 옮기기

    채널톡이 DynamoDB 핫 파티션을 해결하려 GSI를 별도 인덱스 테이블로 떼어낸 연재의 마지막 편으로, 조회 경로를 GSI에서 인덱스 테이블로 옮긴 과정을 다룬다. 2편에서 쓰기 파이프라인이 완성돼 WriteThrottleEvents가 월 110만 회에서 0회가 됐지만, 조회 코드가 여전히 GSI를 읽고 있어 GSI를 지울 수 없었다. GSI가 읽기에서 대신해주던 키 해석·정확 일치·삭제 필터·페이지 채우기를 사내 공통 라이브러리의 조회 규칙으로 흡수해, 호출부는 GSI든 인덱스 테이블이든 같은 코드를 쓰게 만들었다.

    요약 이어보기
    #migration#dynamodb#hot-partition+5