데이터 조직이 일정 규모를 넘어서면 두 가지 인프라를 동시에 운영하는 비용에 직면합니다. 원천 로그와 비정형 데이터를 담는 데이터 레이크, 그리고 BI와 리포팅을 위한 데이터 웨어하우스입니다. 두 시스템 사이에서 데이터를 복제하다 보면 동일한 지표가 두 곳에서 다른 값을 내는 일이 흔합니다. 레이크하우스는 이 이중 구조를 단일 저장 계층으로 통합하려는 시도입니다.
이 글에서는 레이크하우스가 해결하려는 문제부터 테이블 포맷 선택, 계층 설계, 운영 시 마주치는 함정까지 단계적으로 다룹니다. 약 500TB 규모의 분석 환경을 기준으로 설명하지만 원리는 더 작은 환경에도 그대로 적용됩니다.
왜 레이크하우스인가
전통적인 구조에서는 객체 스토리지(S3, GCS)에 원본을 쌓고, ETL로 정제한 뒤 별도의 웨어하우스로 적재합니다. 문제는 두 가지입니다. 첫째, 웨어하우스 스토리지 비용이 객체 스토리지의 5배에서 10배에 달합니다. 둘째, 복제 지연 때문에 데이터 신선도가 떨어집니다.
레이크하우스는 값싼 객체 스토리지 위에 ACID 트랜잭션, 스키마 강제, 타임 트래블 같은 웨어하우스급 기능을 제공하는 테이블 포맷을 얹어 이 문제를 해결합니다. 동일한 데이터를 SQL 엔진과 ML 프레임워크가 함께 읽을 수 있다는 점이 핵심 가치입니다.
테이블 포맷 선택
레이크하우스의 심장은 테이블 포맷입니다. 대표적으로 Delta Lake, Apache Iceberg, Apache Hudi 세 가지가 경쟁합니다. 선택 기준을 표로 정리하면 다음과 같습니다.
| 포맷 | 강점 | 적합 시나리오 |
|---|---|---|
| Delta Lake | Spark 생태계 통합, 성숙도 | Databricks 중심 환경 |
| Iceberg | 엔진 중립성, 숨은 파티셔닝 | 멀티 엔진 운영 |
| Hudi | 업서트, 증분 처리 | CDC 기반 적재 |
여러 쿼리 엔진(Trino, Spark, Flink)을 함께 쓴다면 Iceberg의 엔진 중립성이 유리합니다. CDC로 잦은 업데이트가 발생한다면 Hudi의 업서트 성능이 빛을 발합니다.
메달리온 계층 설계
실무에서 가장 널리 쓰이는 구조는 브론즈-실버-골드로 나누는 메달리온 아키텍처입니다. 브론즈는 원천을 거의 그대로 적재한 불변 레이어, 실버는 정제와 조인을 거친 레이어, 골드는 비즈니스 지표가 집계된 소비 레이어입니다.
- 브론즈: append-only, 스키마 검증 최소화, 재처리 기준점
- 실버: 중복 제거, 타입 정규화, 품질 규칙 적용
- 골드: 차원 모델 또는 와이드 테이블, BI 직접 연결
이 분리의 이점은 명확합니다. 비즈니스 로직이 바뀌어도 브론즈는 그대로 두고 실버부터 다시 만들면 됩니다. 원본 손실 없이 전체 파이프라인을 재현할 수 있다는 뜻입니다.
운영과 트러블슈팅
레이크하우스에서 가장 흔한 운영 이슈는 작은 파일 문제입니다. 스트리밍이나 잦은 커밋으로 수십 KB짜리 파일이 수백만 개 쌓이면 쿼리 시 메타데이터 스캔만으로 수십 초가 소요됩니다. 해결책은 정기적인 컴팩션(OPTIMIZE)과 적절한 파일 크기 목표(128MB에서 1GB) 설정입니다.
또 하나는 메타데이터 누적입니다. 타임 트래블을 위해 보관하는 스냅샷이 무한정 쌓이면 스토리지와 메타 처리 비용이 증가합니다. VACUUM 또는 expire_snapshots를 7일에서 30일 보존 정책으로 스케줄링하세요. 단, 진행 중인 장기 쿼리가 참조하는 스냅샷을 삭제하지 않도록 보존 기간을 보수적으로 잡는 것이 안전합니다.
레이크하우스의 성패는 포맷 선택보다 컴팩션과 보존 정책 같은 운영 자동화에서 갈립니다.
정리
레이크하우스는 레이크와 웨어하우스의 이중 구조를 단일 계층으로 합쳐 비용과 신선도를 동시에 개선합니다. 핵심은 적합한 테이블 포맷을 고르고, 메달리온 계층으로 책임을 분리하며, 컴팩션과 스냅샷 관리를 자동화하는 것입니다. 작게 시작해 브론즈부터 구축하고 점진적으로 골드 레이어를 확장하는 접근을 권합니다.





