본문으로 건너뛰기
김신건의 로그

데이터 웨어하우스

· 수정 · 📖 약 5분 · 1,975자/단어 #data-engineering #data-warehouse #olap #analytics #dimensional-modeling
Data Warehouse, DW, DWH, 데이터웨어하우스, OLAP 저장소, Enterprise Data Warehouse, EDW

정의

데이터 웨어하우스 (Data Warehouse, DW) 는 여러 운영 시스템에서 흘러 들어온 이력 데이터를 통합해, 대규모 분석 쿼리를 빠르게 실행하도록 최적화된 중앙 저장소. 트랜잭션 처리 (OLTP) 가 아니라 의사결정 지원 (OLAP, BI, 리포팅, ML 특징 엔지니어링) 이 목적.

Bill Inmon (1990) 정의: 주제 지향 (subject-oriented), 통합 (integrated), 시변 (time-variant), 비휘발성 (non-volatile) 데이터 컬렉션.

왜 필요한가

운영 DB (PostgreSQL, RDS, MySQL) 를 그대로 분석에 쓰면 문제가 쌓임:

  • OLTP 최적화: row-based 저장, 인덱스는 point-lookup 위주 -> SELECT SUM(x) FROM huge_table GROUP BY y 가 초 단위 -> 시간 단위로 느려짐
  • 자원 경합: 분석 쿼리가 트랜잭션을 락, latency spike
  • 스키마 분산: 서비스별 DB 가 나뉘어 있어 join 이 불가능
  • 이력 부족: 운영 DB 는 최신 상태만, 과거 시점 재구성이 안 됨

DW 는 분석 전용 이라 다음을 뒤집음:

  • 컬럼형 저장 (필요한 컬럼만 스캔)
  • 압축 (컬럼 값이 비슷 -> 5-10배 압축)
  • 병렬 실행 (MPP) (수십/수백 노드로 분산 스캔)
  • append/bulk load 위주 (row-level update 는 거의 없음)
  • 스키마 통합 + 시계열 보존 (fact + dimension 모델)

OLTP vs OLAP

OLTPOLAP (DW)
목적트랜잭션 처리분석 / BI / ML
저장 형식Row-basedColumn-based
쿼리 형태소량 row 조회/갱신대량 aggregation
동시성수천 사용자 point 쿼리수십 분석가 heavy 쿼리
정규화3NF (중복 최소화)Denormalized (join 최소화)
인덱스B-tree point-lookupZone map, min-max, columnar
데이터 신선도실시간분/시간/일 단위 (배치)
변경 빈도Row 단위 UPDATE 자주Bulk INSERT/APPEND 위주
트랜잭션ACID 필수배치 로드 후 read-only 가까움
대표 예[[postgresqlPostgres]], MySQL, DynamoDB

아키텍처 계층

flowchart LR
    subgraph Sources["소스 (OLTP, 이벤트)"]
        RDS[("RDS/Aurora")]
        Kafka[Kafka/Kinesis]
        SaaS["SaaS API<br/>(Stripe, Salesforce)"]
        Logs[Application Logs]
    end

    Sources -->|"Extract + Load"| Raw

    subgraph Warehouse["Data Warehouse"]
        Raw["Raw / Landing<br/>(원본 그대로)"]
        Staging["Staging<br/>(타입 정리)"]
        Marts["Data Marts<br/>(dim + fact)"]
        Raw --> Staging
        Staging --> Marts
    end

    Marts -->|"SQL / BI"| BI[BI / 대시보드]
    Marts -->|"Feature Store"| ML[ML 학습]
    Marts -->|"Reverse ETL"| Ops["운영 시스템<br/>(활성화)"]
  • Raw / Landing: 소스 그대로. 재처리 가능하도록 원본 보존
  • Staging: 타입 캐스팅, dedup, timestamp 표준화
  • Marts / Curated: 비즈니스 도메인별 dimension + fact 테이블. 소비자가 직접 쿼리

데이터 모델링 방법론

Kimball (Dimensional / Star Schema)

업무 프로세스 중심 으로 fact 테이블 + 주변 dimension 테이블. Bottom-up.

       dim_date            dim_product
          │                     │
          └─────► fact_sales ◄──┘


                dim_customer


                 dim_store
  • Fact table: 이벤트/측정 (수량, 금액). 좁고 길다 (많은 row).
  • Dimension table: 컨텍스트 (누가, 무엇을, 언제, 어디서). 넓고 짧다.
  • Grain: fact 한 행이 무엇을 의미하는지 (한 주문 line, 한 클릭 등) 명확히 정의.
  • SCD (Slowly Changing Dimension): Type 1 (overwrite), Type 2 (버전), Type 3 (이전 값 컬럼) 등.

쉬운 SQL, BI 도구 친화 -> 사실상 산업 표준.

Inmon (Corporate Information Factory)

전사 통합 3NF 모델 (EDW) 을 먼저 만들고, 그 위에 부서별 mart 를 파생. Top-down.

  • 엄격한 통합: 회사 전체 개념 하나의 스키마
  • 느린 구축: 몇 년 걸림
  • 일관성 최우선: 규제 산업 (금융/보험) 에 어울림

Data Vault 2.0

Hub (business key) + Link (관계) + Satellite (속성 변경 이력) 3 컴포넌트.

  • 소스 시스템 변화에 강함
  • 감사/이력 추적이 first-class
  • 쿼리는 복잡 -> 소비 계층에서 star schema 로 pivot

현대 실무: raw/staging 은 Data Vault 스타일, 소비 계층은 Kimball star schema 조합이 많음.

DW vs Data Lake vs Data Lakehouse

Data WarehouseData LakeData Lakehouse
저장구조화 (컬럼형)원본 파일 (apache-parquet, JSON, CSV)원본 파일 + 트랜잭션 메타
스키마Schema-on-writeSchema-on-read둘 다
엔진자체 SQL (Redshift, BigQuery)다양 (Athena, Spark)Delta Lake, Iceberg, Hudi
워크로드BI, SQL 분석ML, batch, 로그 원본BI + ML 통합
비용저장 비쌈, 쿼리 저렴저장 매우 저렴 (S3), 쿼리 유료중간
트랜잭션ACID없음ACID (Iceberg/Delta/Hudi)
거버넌스성숙어려움 (“data swamp”)개선됨
대표Redshift, Snowflake, BigQueryS3 + Athena + GlueDatabricks, Iceberg on S3

Lakehouse 는 lake 의 저비용 + warehouse 의 트랜잭션/거버넌스를 결합하려는 시도. 2020 이후 표준 방향.

주요 관리형 데이터 웨어하우스

제품특징강점약점
Amazon RedshiftPostgreSQL 기반 MPP, RA3 + ServerlessAWS 통합, Spectrum, Glue 연계AWS 락인
Google BigQueryServerless, Dremel 기반인프라 걱정 없음, 스토리지/쿼리 분리 과금GCP 락인
SnowflakeMulti-cloud, virtual warehouseUX 우수, 데이터 공유벤더 비용
Azure SynapseAzure 통합Power BI 연계성숙도
Databricks SQLDelta Lake + PhotonLakehouse, ML 통합세팅 필요
ClickHouse오픈소스 컬럼 DB초고속, 셀프 호스팅관리 부담
DuckDB임베디드 OLAP로컬/노트북 분석단일 노드

컬럼형 저장이 빠른 이유

Row-based:
  [row1: col1, col2, col3, col4, ..., col50]
  [row2: col1, col2, col3, col4, ..., col50]
  → SELECT AVG(col3) 도 전체 row 를 읽어야 함

Column-based:
  [col1: v1, v2, v3, ..., vN]
  [col2: v1, v2, v3, ..., vN]
  [col3: v1, v2, v3, ..., vN]    ← 이 컬럼만 스캔
  → I/O 가 필요한 컬럼만

추가 이득:

  • 압축: 같은 컬럼 값의 카디널리티가 낮음 -> RLE, Dictionary, Delta 등으로 5-10배 압축
  • SIMD: 같은 타입이 연속 -> CPU 벡터 명령
  • Zone map / min-max: 블록 skip
  • Late materialization: 필터 통과한 row 만 실제 조합

자세히: apache-parquet (파일 포맷), Redshift (엔진 사례).

로딩 패턴

배치 etl / ELT

가장 흔함. 시간/일 단위 배치.

[Source DB] ──dump──> [S3 raw] ──[aws-glue|Glue] transform──> [DW]

CDC (Change Data Capture)

소스 DB 의 WAL/binlog 을 스트림으로 수신, 거의 실시간 반영.

  • Debezium, AWS DMS, Redshift Zero-ETL
  • 지연: 초 단위
  • 부하: 소스 DB 에 로그 리더 프로세스

스트리밍 인제스션

Kafka, Kinesis 에서 직접 DW 로 append.

  • Redshift Streaming Ingestion, Snowpipe Streaming, BigQuery Storage Write API
  • Materialized view 로 auto-aggregate

Reverse ETL

DW 에서 계산된 지표를 다시 SaaS/운영 시스템으로 push (Hightouch, Census).

성능 최적화의 축

  1. 파티셔닝 / 정렬 키: filter predicate 컬럼으로 물리 분리 -> 블록 skip
  2. 분산 키 (MPP): join 키가 같은 노드에 -> shuffle 제거
  3. 파일 포맷: apache-parquet / ORC (컬럼형, 통계, 압축)
  4. 파일 크기: 128 MB ~ 1 GB 권장. 작은 파일 수천 개 = small files problem
  5. 압축 encoding: 컬럼별 특성에 맞는 코덱
  6. Materialized view / pre-aggregation: 반복 쿼리를 미리 계산
  7. Result cache: 같은 쿼리 결과 재사용
  8. Concurrency scaling: 읽기 부하 시 클러스터 자동 확장

데이터 품질 & 거버넌스

DW 는 “회사의 단일 진실 (Single Source of Truth)” 목표. 품질/거버넌스 없으면 data swamp.

  • Data contracts: 소스와 target 간 스키마/의미 합의
  • Lineage: 컬럼 값이 어디서 왔는지 추적 (Glue Data Catalog, dbt docs)
  • Testing: dbt test, Great Expectations, Soda 로 not null / unique / accepted values 검증
  • Access control: 컬럼/row 단위 접근 (Redshift RLS, BigQuery column-level security)
  • PII 관리: KMS 암호화, 마스킹, tokenization
  • Cost governance: 사용자별 쿼리 한도, workgroup 예산 알림

함정

WARNING

DW 를 운영 DB 로 쓰면 재앙. Row-level UPDATE/DELETE 가 느리고 비쌈. 트랜잭션 워크로드는 Postgres 같은 OLTP 로.

CAUTION

INSERT 한 행씩 = MPP 의 최악의 워크로드. 항상 bulk load (COPY, Parquet batch).

WARNING

정규화 그대로 이식 = star schema 없이 3NF 를 DW 에 넣으면 join 지옥. Kimball 스타일로 denormalize.

IMPORTANT

schema-on-read 만 믿지 말 것. Data lake 에 원본만 넣고 스키마 안 잡으면 시간 지날수록 아무도 못 씀. Contract + validation 필수.

CAUTION

비용 폭탄 3대 원인: SELECT *, 파티션 없는 스캔, 작은 파일 수천 개. Athena / Spectrum 은 스캔량 과금이라 특히.

WARNING

DW 는 단일 진실이 아니라 “합의된 진실” 이다. 소스 시스템의 semantics 를 명시적으로 문서화하지 않으면 지표가 팀마다 달라짐.

관련 위키

이 글의 용어 (11개)
[AWS] Amazon RDS (Relational Database Service)cloud
정의 Amazon RDS (Relational Database Service) 는 AWS 가 관리하는 관계형 데이터베이스 서비스 입니다. 6개 엔진 (MySQL, PostgreS…
[AWS] Amazon Redshiftcloud
정의 Amazon Redshift 는 AWS 가 관리하는 페타바이트 규모 컬럼형 데이터 웨어하우스 입니다. 2012년 PostgreSQL 8.0.2 를 기반으로 시작해 MPP (…
[AWS] Athena: 서버리스 SQL on S3cloud
정의 Amazon Athena 는 S3 에 있는 데이터를 서버 없이 SQL 로 쿼리 하는 서비스. 클러스터 프로비저닝, 스키마 로딩, 인덱스 생성 없이 데이터 파일 (Parque…
[AWS] Glue: 서버리스 ETL + Data Catalogcloud
정의 AWS Glue 는 서버리스 ETL + 통합 메타데이터 카탈로그 플랫폼. Apache Spark 로 데이터 변환을 실행하고, Hive 호환 Data Catalog 로 스키마…
[AWS] Redshift Spectrum: S3 데이터 직접 쿼리cloud
정의 Redshift Spectrum 은 Redshift 에서 S3 에 있는 데이터를 로드하지 않고 직접 SQL 로 쿼리 하는 기능. 별도 Spectrum 실행 계층 (Spect…
[AWS] S3 Glacier: Instant / Flexible / Deep Archivecloud
정의 Amazon S3 Glacier 는 S3 의 장기 아카이빙 스토리지 클래스 3종. 자주 접근하지 않는 데이터를 극도로 저렴하게 (Standard 대비 최대 95% 절감) 저…
[AWS] S3: object storage, storage classes, lifecyclecloud
정의 S3 = AWS 의 object storage. bucket + key + object. 11 9's durability (99.999999999%), 무한 확장. 2026…
[DB] PostgreSQL: 프로세스 모델, MVCC, WAL, 확장성database-internals
정의 PostgreSQL 은 오픈소스 ORDBMS. 1986 UC Berkeley POSTGRES 의 후예. MVCC, 확장 가능 타입, JSONB, full-text searc…
[DB] Sharding vs Partitioning: 수평 확장의 두 얼굴database-internals
정의 | | Partitioning | Sharding | |---|---|---| | 범위 | 한 DB 안 | 여러 DB 노드 | | 목적 | 큰 테이블 관리 | 수평 확장 (…
Apache Parquetdata-engineering
정의 Apache Parquet 은 분석 쿼리에 최적화된 오픈소스 컬럼형 이진 파일 포맷. 2013년 Twitter + Cloudera 가 Google Dremel 논문 (201…
ETL / ELTdata-engineering
정의 ETL = Extract (추출) + Transform (변환) + Load (적재). 여러 소스에서 데이터를 뽑아 정제한 뒤 데이터 웨어하우스 에 저장하는 파이프라인. E…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기