데이터 웨어하우스가 필요한 이유 – OLTP 한계부터 BigQuery·Snowflake 실무 적용까지


“우리 DB에 데이터가 다 있는데, 굳이 데이터 웨어하우스가 따로 필요한가요?” 데이터 분석 인프라를 처음 구축하는 팀이라면 반드시 한 번쯤 하는 질문입니다. 데이터 웨어하우스 필요한 이유는 단순히 “더 많은 데이터를 저장하기 위해서”가 아닙니다. 운영 데이터베이스와 분석 시스템은 태생적으로 목적이 다르게 설계되어 있으며, 이 둘을 혼용하는 순간 서비스 성능 저하와 분석 품질 하락이 동시에 찾아옵니다. 이 글에서는 운영 DB의 구조적 한계, OLTP와 OLAP의 근본적 차이, ETL 파이프라인 설계, 클라우드 DW 선택 기준까지 데이터 엔지니어링의 핵심을 처음부터 끝까지 정리합니다.


목차

  1. 데이터 웨어하우스란 무엇인가 – 개념과 탄생 배경
  2. 운영 DB(OLTP)만으로는 왜 부족한가 – 구조적 한계
  3. OLTP vs OLAP – 두 시스템의 근본적 차이
  4. ETL 파이프라인 – 데이터가 웨어하우스에 쌓이는 과정
  5. 데이터 웨어하우스 vs 데이터 레이크 vs 레이크하우스
  6. 클라우드 DW 실무 가이드 – BigQuery·Redshift·Snowflake 비교

1. 데이터 웨어하우스란 무엇인가 – 개념과 탄생 배경

**데이터 웨어하우스(Data Warehouse)**는 여러 소스의 현재 및 과거 데이터를 비즈니스에서 쉽게 인사이트와 보고서를 얻을 수 있도록 저장하는 데이터 관리 시스템입니다. 일반적으로 비즈니스 인텔리전스(BI), 보고 및 데이터 분석에 사용합니다. Databricks

이름에 “창고(Warehouse)”가 들어간 이유가 있습니다. 공장(운영 시스템)에서 만들어진 제품(데이터)을 바로 판매하지 않고, 창고(웨어하우스)에 일단 모아두고 정리한 뒤에 필요할 때 꺼내 쓰는 것처럼, 데이터 웨어하우스는 여러 운영 시스템의 데이터를 한 곳에 모아 분석 목적으로 재정비하는 공간입니다.

데이터 웨어하우스의 4가지 핵심 특성

데이터 웨어하우스를 처음 체계화한 빌 인먼(Bill Inmon)은 1990년대에 DW의 핵심 특성을 네 가지로 정의했습니다.

특성설명예시
주제 지향적 (Subject-Oriented)업무 프로세스가 아닌 분석 주제 중심으로 데이터 구성고객, 제품, 매출 중심
통합성 (Integrated)여러 소스의 데이터를 일관된 형식으로 통합CRM + ERP + 앱 로그 통합
시계열성 (Time-Variant)시간에 따른 데이터 변화 이력을 보존월별·분기별 매출 추이
비휘발성 (Non-Volatile)한번 적재된 데이터는 수정·삭제하지 않음과거 거래 내역 영구 보존

DW가 탄생한 역사적 배경

1980년대 기업들은 각 부서마다 별도의 운영 시스템을 구축했습니다. 영업팀은 CRM, 물류팀은 ERP, 마케팅팀은 광고 플랫폼을 사용했고, 각 시스템의 데이터는 서로 연결되지 않은 **데이터 사일로(Data Silo)**를 형성했습니다. 경영진이 “지난 분기 매출 대비 마케팅 비용 효율이 어떻게 되나요?”라는 질문을 하면, 각 부서 담당자가 엑셀로 데이터를 취합하는 데 며칠이 걸렸습니다. DWH는 수집된 데이터를 분석 목적으로 시계열 형식으로 정리하여 저장하는 대용량 데이터베이스로, 일반적인 데이터베이스와 달리 정형화된 구조와 분석 최적화된 스키마를 바탕으로 고속 조회 및 대용량 처리를 목적으로 설계됩니다. 이 문제를 해결하기 위해 등장한 것이 데이터 웨어하우스입니다. Trocco


2. 운영 DB(OLTP)만으로는 왜 부족한가 – 구조적 한계

데이터 웨어하우스 필요한 이유 중 가장 근본적인 것은 운영 데이터베이스(OLTP)가 분석 쿼리에 적합하지 않게 설계되어 있다는 구조적 사실입니다.

운영 DB에서 분석 쿼리를 실행하면 생기는 일

운영 DB는 초당 수천 건의 빠른 읽기·쓰기 트랜잭션에 최적화되어 있습니다. 그런데 분석 쿼리는 완전히 다른 부하를 만들어냅니다.

sql

-- 운영 DB에서 마케터가 실행하고 싶은 분석 쿼리 예시
SELECT
    p.category,
    DATE_TRUNC('month', o.created_at) AS month,
    COUNT(DISTINCT o.user_id)         AS unique_buyers,
    SUM(oi.quantity * oi.price)       AS revenue,
    AVG(u.age)                        AS avg_buyer_age
FROM orders o
JOIN order_items oi  ON o.id = oi.order_id
JOIN products p      ON oi.product_id = p.id
JOIN users u         ON o.user_id = u.id
WHERE o.created_at >= '2022-01-01'
GROUP BY p.category, month
ORDER BY month, revenue DESC;

-- 문제: orders 테이블 5,000만 건 풀스캔 → 실행 시간 수십 분
-- 결과: 동시 접속 사용자의 주문 API 응답 시간 급증 → 서비스 장애

OLTP 데이터베이스에 다운타임이 발생하는 경우 막대한 비용이 발생하고 심지어는 비즈니스가 중단될 수도 있습니다. 분석 쿼리가 운영 DB를 점령하면, 실제 사용자의 주문·결제가 느려지거나 중단되는 최악의 상황이 발생합니다. Integrate.io

OLTP의 구조적 한계 4가지

한계 1: 행 지향(Row-Oriented) 저장 구조

운영 DB는 한 행(row)의 모든 컬럼을 함께 저장합니다. 주문 한 건을 INSERT할 때 빠르지만, “지난 3년간 모든 주문의 금액 합계”를 구하려면 금액 컬럼만 읽으면 되는데도 불필요한 수십 개 컬럼을 모두 읽어야 합니다.

[행 지향 저장 구조 – OLTP에 최적화]
디스크 블록:
| user_id | name   | email           | created_at | status | amount |
| 1001    | 김철수 | kim@example.com | 2024-01-01 | PAID   | 35000  |
| 1002    | 이영희 | lee@example.com | 2024-01-02 | PAID   | 12000  |

분석 쿼리 "금액 합계" → 모든 행을 읽으며 amount만 추출 → 비효율

[컬럼 지향 저장 구조 – DW/OLAP에 최적화]
amount 컬럼 블록: | 35000 | 12000 | 89000 | 45000 | ...
→ amount 컬럼 블록만 읽으면 즉시 합산 → 고효율

한계 2: 정규화로 인한 과도한 JOIN

운영 DB는 데이터 중복을 없애기 위해 테이블을 잘게 나눕니다(정규화). 분석 쿼리에서 이것은 수십 개 테이블을 JOIN해야 한다는 의미이며, 이는 엄청난 성능 저하를 유발합니다.

한계 3: 이력 데이터 부재

실제로 OLTP 환경에서 기록 데이터는 성능 개선을 위해 보관되거나 아예 삭제되는 경우도 많습니다. 운영 DB는 현재 상태를 빠르게 조회하는 데 최적화되어 있어, 과거 변경 이력이나 수년 치 트렌드 분석에 필요한 데이터가 없는 경우가 많습니다. Oracle

한계 4: 여러 시스템의 데이터 통합 불가

단일 앱의 DB에는 그 앱의 데이터만 있습니다. “쇼핑몰 구매 이력 + 광고 클릭 데이터 + 고객 센터 문의 이력”을 동시에 분석하려면 세 개의 서로 다른 DB를 조인해야 하는데, 이는 운영 DB 구조에서는 사실상 불가능합니다.


3. OLTP vs OLAP – 두 시스템의 근본적 차이

데이터 웨어하우스를 이해하는 핵심은 **OLTP(Online Transaction Processing)**와 **OLAP(Online Analytical Processing)**의 차이를 명확히 아는 것입니다.

OLTP와 OLAP 완전 비교표

비교 항목OLTP (운영 DB)OLAP (데이터 웨어하우스)
주요 목적빠른 트랜잭션 처리대규모 데이터 분석
사용자앱 서버, 고객분석가, BI 도구, 경영진
쿼리 패턴단순 INSERT/UPDATE/SELECT복잡한 집계·조인·그룹핑
데이터 범위현재 상태 중심과거 이력 전체 (수년)
저장 구조행 지향(Row-Oriented)컬럼 지향(Column-Oriented)
데이터 크기GB ~ 수십 GBTB ~ PB
응답 시간밀리초 단위초 ~ 수십 분
동시 사용자수천~수만 명수십~수백 명
정규화높음 (3NF 이상)낮음 (스타 스키마)
대표 제품MySQL, PostgreSQL, OracleBigQuery, Redshift, Snowflake

OLAP의 핵심 구조: 스타 스키마

OLAP 시스템은 열 기반(column-oriented) 데이터베이스 구조를 주로 사용하여 데이터를 열 단위로 저장합니다. 이 구조는 분석 쿼리가 특정 열의 데이터를 대량으로 스캔하거나 집계할 때 매우 효율적입니다. HEARTCOUNT COMMUNITY

데이터 웨어하우스에서 가장 많이 사용하는 스키마는 **스타 스키마(Star Schema)**입니다. 중앙의 팩트 테이블(Fact Table)에 수치 데이터(매출, 수량 등)를 두고, 주변의 차원 테이블(Dimension Table)에 맥락 정보(날짜, 상품, 고객 등)를 연결합니다.

[스타 스키마 구조]

          dim_date
          (날짜 차원)
              │
dim_product ──┤── fact_sales ──┤── dim_customer
(상품 차원)   │   (판매 팩트)       (고객 차원)
              │
          dim_store
          (매장 차원)

fact_sales 컬럼:
  date_key       INT     → dim_date.date_key
  product_key    INT     → dim_product.product_key
  customer_key   INT     → dim_customer.customer_key
  store_key      INT     → dim_store.store_key
  quantity       INT     ← 측정값
  unit_price     DECIMAL ← 측정값
  discount_amt   DECIMAL ← 측정값
  total_revenue  DECIMAL ← 측정값

OLAP 데이터베이스에서 쿼리에 실패하더라도 고객을 위한 거래 처리가 중단되거나 지연되지 않습니다. 운영 시스템과 분석 시스템이 완전히 분리되어 있기 때문에, 분석가가 무거운 쿼리를 실행해도 서비스 장애로 이어지지 않습니다. Databricks


4. ETL 파이프라인 – 데이터가 웨어하우스에 쌓이는 과정

데이터 웨어하우스에 데이터를 채우는 과정을 **ETL(Extract, Transform, Load)**이라고 합니다. 각 운영 시스템의 데이터를 추출(E)하고, 분석에 적합한 형태로 변환(T)한 뒤, 웨어하우스에 적재(L)합니다.

ETL 3단계 상세 설명

[ETL 전체 파이프라인]

┌─────────────────────────────────────────────────────────┐
│                      데이터 소스                          │
│  MySQL(주문DB) │ PostgreSQL(사용자DB) │ GA(웹로그) │ S3 │
└──────┬─────────────────┬────────────────┬──────────┬──┘
       │                 │                │          │
       └─────────────────┴────────────────┴──────────┘
                                │
                    ┌───────────▼───────────┐
                    │  E (Extract, 추출)     │
                    │  - 증분 추출(CDC)      │
                    │  - 전체 추출(Full)     │
                    │  - API 수집            │
                    └───────────┬───────────┘
                                │
                    ┌───────────▼───────────┐
                    │  T (Transform, 변환)   │
                    │  - 데이터 정제·정규화  │
                    │  - 타입 통일           │
                    │  - 비즈니스 룰 적용    │
                    │  - 중복 제거           │
                    └───────────┬───────────┘
                                │
                    ┌───────────▼───────────┐
                    │  L (Load, 적재)        │
                    │  - 스타 스키마로 변환  │
                    │  - 팩트/차원 테이블    │
                    │  - 파티션 최적화       │
                    └───────────┬───────────┘
                                │
                    ┌───────────▼───────────┐
                    │    데이터 웨어하우스    │
                    │  (BigQuery/Redshift)   │
                    └───────────────────────┘

Python + Apache Airflow로 구현하는 ETL 예시

python

# Apache Airflow DAG: MySQL → BigQuery ETL 파이프라인
from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.providers.mysql.hooks.mysql import MySqlHook
from airflow.providers.google.cloud.hooks.bigquery import BigQueryHook
from datetime import datetime, timedelta
import pandas as pd

default_args = {
    'owner': 'data-engineering',
    'retries': 3,
    'retry_delay': timedelta(minutes=5),
}

def extract_orders(**context):
    """MySQL 운영 DB에서 전날 주문 데이터 증분 추출"""
    mysql_hook = MySqlHook(mysql_conn_id='prod_mysql')
    yesterday = context['ds']  # Airflow 실행 날짜

    query = f"""
        SELECT
            order_id, user_id, product_id,
            quantity, unit_price, status,
            created_at
        FROM orders
        WHERE DATE(created_at) = '{yesterday}'
          AND status IN ('PAID', 'DELIVERED')
    """
    df = mysql_hook.get_pandas_df(query)
    # XCom으로 다음 태스크에 전달 (소규모 데이터)
    return df.to_json()

def transform_orders(**context):
    """분석에 맞게 데이터 변환 및 정제"""
    raw_json = context['task_instance'].xcom_pull(task_ids='extract')
    df = pd.read_json(raw_json)

    # 변환 1: 총 금액 계산
    df['total_revenue'] = df['quantity'] * df['unit_price']

    # 변환 2: 날짜 차원 키 생성 (YYYYMMDD 형식)
    df['date_key'] = pd.to_datetime(df['created_at']).dt.strftime('%Y%m%d').astype(int)

    # 변환 3: 상태 코드 표준화 (운영 DB와 DW 간 코드 통일)
    status_map = {'PAID': 'COMPLETED', 'DELIVERED': 'COMPLETED'}
    df['status'] = df['status'].map(status_map)

    # 변환 4: 불필요 컬럼 제거
    df = df.drop(columns=['created_at'])

    return df.to_json()

def load_to_bigquery(**context):
    """변환된 데이터를 BigQuery fact_orders 테이블에 적재"""
    transformed_json = context['task_instance'].xcom_pull(task_ids='transform')
    df = pd.read_json(transformed_json)

    bq_hook = BigQueryHook(gcp_conn_id='google_cloud_default')
    bq_hook.insert_rows_from_dataframe(
        dataframe=df,
        project_id='my-project',
        dataset_id='dw_sales',
        table_id='fact_orders',
        chunk_size=10000
    )

with DAG(
    dag_id='orders_etl_pipeline',
    default_args=default_args,
    schedule_interval='0 2 * * *',  # 매일 새벽 2시 실행
    start_date=datetime(2024, 1, 1),
    catchup=False,
) as dag:

    extract = PythonOperator(task_id='extract', python_callable=extract_orders)
    transform = PythonOperator(task_id='transform', python_callable=transform_orders)
    load = PythonOperator(task_id='load', python_callable=load_to_bigquery)

    extract >> transform >> load  # 순서 정의

ETL vs ELT – 현대적 접근법의 차이

ELT는 먼저 원래의 형식으로 데이터 웨어하우스에 데이터를 로드하고 처리와 동시에 정리와 구조화를 실행합니다. BigQuery나 Snowflake처럼 웨어하우스 자체의 처리 성능이 강력해지면서, 변환을 웨어하우스 안에서 수행하는 ELT가 최근 주류로 자리 잡고 있습니다. Databricks

[ETL vs ELT 비교]

ETL (전통적 방식):
소스 → 변환(외부 서버) → DW 적재
장점: DW 저장 공간 절약
단점: 변환 서버 별도 필요, 재처리 어려움

ELT (현대적 방식):
소스 → DW 적재(Raw) → DW 내부에서 변환 (dbt 활용)
장점: 원본 데이터 보존, 재처리 용이, 변환 로직 버전 관리
단점: DW 스토리지 비용 증가 가능

5. 데이터 웨어하우스 vs 데이터 레이크 vs 레이크하우스

데이터 인프라를 공부하다 보면 세 가지 개념이 혼재합니다. 각각의 역할과 차이를 명확히 구분해야 올바른 아키텍처를 선택할 수 있습니다.

세 가지 데이터 저장소 비교

데이터 웨어하우스는 정제되고 처리된 데이터를 저장하는 반면, 데이터 레이크는 원시 데이터를 기본 형식으로 저장합니다. 데이터 웨어하우스에는 Analytics Engine과 보고 툴이 내장되어 있는 반면, 데이터 레이크에는 처리를 위한 외부 툴이 필요합니다. IBM

구분데이터 웨어하우스데이터 레이크데이터 레이크하우스
저장 데이터정제된 정형 데이터원시 데이터 (정형·비정형)두 가지 모두
스키마적재 전 정의 (Schema on Write)읽을 때 정의 (Schema on Read)유연한 스키마
주요 사용자BI 분석가, 경영진데이터 사이언티스트, ML 엔지니어모든 데이터 직군
쿼리 성능빠름 (최적화됨)느림 (별도 처리 필요)빠름
비용상대적으로 높음저렴 (오브젝트 스토리지)중간
대표 도구BigQuery, Redshift, SnowflakeS3 + Hadoop, Azure Data LakeDatabricks, Delta Lake

언제 무엇을 선택해야 하는가

[데이터 인프라 선택 가이드]

데이터가 주로 정형(테이블 형태)?
→ YES: 분석 목적이 SQL 쿼리·BI 대시보드 중심
         → 데이터 웨어하우스 선택
→ NO:  비정형(이미지, 로그, JSON 등) 또는 ML 학습 데이터
         → 데이터 레이크 선택

정형 + 비정형 동시에 필요하고
ML과 BI를 함께 사용?
         → 데이터 레이크하우스 선택
           (Databricks, Snowflake 통합 플랫폼)

데이터 웨어하우스와 레이크는 서로 다른 용도로 사용되기 때문에 많은 조직이 데이터 스택에서 두 가지 모두를 구현합니다. 그러나 이는 사용자가 서로 다른 데이터 시스템에 걸쳐 있어야 한다는 것을 의미하며, 이로 인해 비효율적인 워크플로, 중복된 데이터, 거버넌스 문제 및 기타 문제가 발생할 수 있습니다. 이 문제를 해결하는 것이 레이크하우스 아키텍처의 핵심 목표입니다. IBM


6. 클라우드 DW 실무 가이드 – BigQuery·Redshift·Snowflake 비교

현재 시장에서 가장 인기 있는 데이터 웨어하우스 서비스는 클라우드 기반의 구글 빅쿼리(Google BigQuery), 아마존 레드시프트(Amazon Redshift), 스노우플레이크(Snowflake) 등입니다. Mindful Analytics

3대 클라우드 DW 상세 비교

항목Google BigQueryAmazon RedshiftSnowflake
아키텍처서버리스클러스터 기반가상 웨어하우스
과금 방식쿼리 스캔 용량 기준인스턴스 시간 기준컴퓨팅 크레딧
스케일링자동 (완전 관리형)수동 노드 추가웨어하우스 크기 조절
멀티 클라우드GCP 중심AWS 중심AWS·GCP·Azure 모두
ML 통합BigQuery ML 내장SageMaker 연동Snowpark ML
최적 선택 상황GCP 스택, 서버리스 선호AWS 기존 사용자멀티 클라우드·데이터 공유

BigQuery 실전 활용 예시

sql

-- BigQuery: 파티션과 클러스터링으로 쿼리 비용 최적화

-- 테이블 생성 (파티션 + 클러스터링)
CREATE TABLE `project.dw_sales.fact_orders`
(
    order_id      INT64,
    user_id       INT64,
    product_id    INT64,
    category      STRING,
    total_revenue FLOAT64,
    order_date    DATE
)
PARTITION BY order_date          -- 날짜로 파티셔닝 (스캔 범위 축소)
CLUSTER BY category, product_id; -- 자주 필터링하는 컬럼으로 클러스터링

-- 파티션 활용 쿼리: 특정 월 데이터만 스캔 (비용 절감)
SELECT
    category,
    SUM(total_revenue)  AS monthly_revenue,
    COUNT(DISTINCT user_id) AS unique_buyers
FROM `project.dw_sales.fact_orders`
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31'  -- 파티션 필터
  AND category = 'Electronics'                           -- 클러스터 필터
GROUP BY category
ORDER BY monthly_revenue DESC;

-- 비용 예측: 파티션 없으면 전체 테이블 스캔 → 파티션 사용 시 1/365 스캔

데이터 웨어하우스 도입 체크리스트

도입을 결정하기 전에 아래 항목을 점검하세요.

[DW 도입 필요 신호 체크리스트]

✅ 분석 쿼리가 운영 DB 성능에 영향을 미치기 시작했다
✅ 여러 시스템의 데이터를 통합 분석할 필요가 생겼다
✅ 수개월~수년 치 이력 데이터 분석이 필요해졌다
✅ BI 도구(Tableau, Looker, Superset)를 도입할 계획이다
✅ 데이터 분석가·사이언티스트가 팀에 합류했다
✅ 데이터 기반 의사결정이 비즈니스의 핵심이 되었다

[DW가 아직 불필요한 신호]

⬜ 데이터 소스가 DB 1개뿐이다
⬜ 팀 전체가 10명 이하이고 분석 업무가 드물다
⬜ 실시간 운영 데이터만 필요하고 이력 분석은 없다

데이터 웨어하우스는 기업 데이터를 통합하고 데이터 기반 의사결정을 지원하는 시스템으로, 최근 들어 데이터 유형이 다양해지고 실시간에 준하는 데이터 제공이 지속적으로 요구되고 있습니다. 클라우드 기반 DW는 초기 인프라 비용 없이 시작할 수 있으므로, 스타트업도 빠르게 데이터 분석 인프라를 구축할 수 있습니다. Samsung SDS


결론

데이터 웨어하우스 필요한 이유는 명확합니다. 운영 DB는 빠른 트랜잭션 처리를 위해 설계되었고, 분석 시스템은 대용량 이력 데이터의 복잡한 집계를 위해 설계되었습니다. 두 가지 전혀 다른 목적을 하나의 시스템으로 처리하려 하면, 서비스 장애와 분석 품질 저하가 동시에 발생합니다. ETL 파이프라인으로 운영 데이터를 웨어하우스에 통합하고, 컬럼형 스타 스키마로 분석을 최적화하면, 비로소 데이터가 진짜 의사결정 도구로 작동합니다. BigQuery, Redshift, Snowflake 중 팀의 클라우드 환경과 사용 패턴에 맞는 것을 선택해 오늘 당장 작은 규모로 시작해보세요.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다