Great Expectations 2026: 데이터 품질 검증과 면접 대비 가이드

Great Expectations(GX)를 활용한 데이터 품질 검증의 실용적인 가이드입니다. 프로덕션 파이프라인에서의 구현 방법부터 데이터 엔지니어 면접에서 자주 나오는 질문까지 2026년 최신 정보를 다룹니다.

Great Expectations data quality validation

Great Expectations(GX)는 Python 기반 데이터 파이프라인에서 데이터 품질 검증을 위한 표준 오픈소스 프레임워크입니다. 2026년 8월에 출시된 버전 1.22에서는 GX 1.0에서 도입된 API 변경 사항이 안정화되었고, 실험적인 Python 3.14 지원이 추가되었습니다. 프로덕션급 파이프라인을 구축하는 데이터 엔지니어에게 필수적인 도구입니다.

GX Core와 GX Cloud의 차이

GX Core는 GitHub에서 11,400개 이상의 스타를 받은 오픈소스 라이브러리(Apache 2.0 라이선스)입니다. GX Cloud는 이를 기반으로 구축된 관리형 SaaS 플랫폼으로, 협업 도구와 실시간 모니터링 대시보드를 제공합니다. 이 글에서는 GX Core에 초점을 맞춥니다.

Great Expectations가 데이터 파이프라인에서 해결하는 문제

데이터 파이프라인은 종종 조용히 실패합니다. 업스트림의 스키마 변경, 존재해서는 안 되는 null 값, ISO에서 Unix 타임스탬프로 변경된 날짜 형식 등 이러한 문제는 누군가가 알아채기 전에 대시보드나 ML 모델에 도달하는 경우가 많습니다. Great Expectations는 데이터를 코드처럼 취급하여, 파이프라인의 체크포인트에서 자동으로 실행되는 어서션(Expectations라고 함)을 적용합니다.

이 프레임워크는 Apache Airflow, Databricks, Snowflake, 그리고 AWS S3 및 Azure Blob Storage와 같은 클라우드 스토리지 서비스와 통합됩니다. 각 검증은 비기술 이해관계자도 읽을 수 있는 HTML 보고서인 Data Docs를 생성합니다.

핵심 개념: Data Context, Data Sources, Expectations

GX 1.22는 Data Context, Data Sources, Data Assets, Expectation Suites의 네 가지 컴포넌트를 중심으로 검증을 구성합니다.

Data Context는 중앙 설정 객체입니다. Data Sources, Expectation Suites, Checkpoints, 과거 Validation Results의 메타데이터를 저장합니다. 대부분의 프로젝트에서 단일 gx/ 디렉토리에 YAML 설정 파일과 생성된 Data Docs가 저장됩니다.

Data Source는 데이터베이스, 데이터 웨어하우스 또는 파일 시스템에 대한 연결을 나타냅니다. Data Asset은 해당 소스 내 레코드의 논리적 컬렉션으로, 테이블이나 쿼리 결과 집합에 해당합니다.

python
# gx_setup.py
import great_expectations as gx

# 기존 Data Context를 초기화하거나 로드
context = gx.get_context()

# 로컬 파일용 Pandas Data Source 추가
data_source = context.data_sources.add_pandas("local_files")

# 특정 CSV 패턴을 가리키는 Data Asset 정의
data_asset = data_source.add_csv_asset(
    name="user_events",
    filepath_or_buffer="data/user_events_*.csv"  # Glob 패턴
)

이 설정을 통해 GX는 data/ 디렉토리에서 user_events_*.csv와 일치하는 모든 CSV를 검증할 수 있습니다.

컬럼 검증을 위한 Expectation Suite 구축

Expectation Suite는 Data Asset에 대한 어서션의 모음입니다. 각 Expectation은 데이터가 충족해야 하는 조건을 선언합니다. 예를 들어, "컬럼 user_id는 null이어서는 안 된다" 또는 "컬럼 age는 0에서 120 사이의 값을 포함해야 한다"와 같습니다.

python
# build_suite.py
import great_expectations as gx

context = gx.get_context()

# Expectation Suite 생성 또는 가져오기
suite = context.suites.add(
    gx.ExpectationSuite(name="user_events_suite")
)

# Suite에 expectations 추가
suite.add_expectation(
    gx.expectations.ExpectColumnToExist(column="user_id")
)
suite.add_expectation(
    gx.expectations.ExpectColumnValuesToNotBeNull(column="user_id")
)
suite.add_expectation(
    gx.expectations.ExpectColumnValuesToBeBetween(
        column="age",
        min_value=0,
        max_value=120
    )
)
suite.add_expectation(
    gx.expectations.ExpectColumnValuesToMatchRegex(
        column="email",
        regex=r"^[\w.-]+@[\w.-]+\.\w+$"
    )
)

# Suite를 Data Context에 저장
context.suites.save(suite)

GX 1.0 이상에서는 Expectations에 클래스 기반 API를 사용합니다. 이전의 딕셔너리 기반 구문(expect_column_to_exist)도 여전히 사용 가능하지만, 클래스 기반 접근 방식이 더 나은 IDE 자동 완성과 타입 안전성을 제공합니다.

Checkpoints를 통한 검증 실행

Checkpoint는 Data Asset, Expectation Suite, 그리고 검증이 성공하거나 실패할 때 트리거되는 선택적 Actions을 연결합니다. Checkpoints는 프로덕션에서 자동화된 검증의 주요 진입점입니다.

python
# run_checkpoint.py
import great_expectations as gx

context = gx.get_context()

# Checkpoint 생성
checkpoint = context.checkpoints.add(
    gx.Checkpoint(
        name="user_events_checkpoint",
        validation_definitions=[
            gx.ValidationDefinition(
                name="validate_user_events",
                data=context.data_sources.get("local_files")
                    .get_asset("user_events")
                    .build_batch_request(),
                suite=context.suites.get("user_events_suite")
            )
        ],
        actions=[
            gx.checkpoint.UpdateDataDocsAction(name="update_docs"),
        ]
    )
)

# Checkpoint 실행
result = checkpoint.run()

# 전체 성공 여부 확인
if result.success:
    print("모든 검증이 성공했습니다")
else:
    print("검증 실패가 감지되었습니다")
    for validation_result in result.run_results.values():
        for expectation_result in validation_result.results:
            if not expectation_result.success:
                print(f"  실패: {expectation_result.expectation_config}")

Checkpoint가 실행되면 GX는 배치를 로드하고, 각 Expectation을 적용하고, Data Docs를 업데이트합니다. 검증이 실패하면 설정된 Actions에 따라 Slack 알림, PagerDuty 경고 또는 파이프라인 종료를 트리거할 수 있습니다.

Data Engineering 면접 준비가 되셨나요?

인터랙티브 시뮬레이터, flashcards, 기술 테스트로 연습하세요.

Apache Airflow DAGs에 GX 통합

대부분의 프로덕션 데이터 파이프라인은 Apache Airflow와 같은 오케스트레이터를 사용합니다. GX는 Checkpoint 실행을 오퍼레이터로 래핑하는 공식 Airflow 통합을 제공합니다.

python
# dags/user_events_pipeline.py
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime
import great_expectations as gx

def validate_user_events():
    """사용자 이벤트 데이터에 대해 GX Checkpoint를 실행합니다."""
    context = gx.get_context(context_root_dir="/opt/airflow/gx")
    checkpoint = context.checkpoints.get("user_events_checkpoint")
    result = checkpoint.run()
    
    if not result.success:
        # Airflow 태스크를 실패시키기 위해 예외 발생
        raise ValueError("데이터 검증에 실패했습니다. 자세한 내용은 Data Docs를 확인하세요.")

with DAG(
    dag_id="user_events_pipeline",
    start_date=datetime(2026, 1, 1),
    schedule_interval="@daily",
    catchup=False
) as dag:
    
    validate_task = PythonOperator(
        task_id="validate_user_events",
        python_callable=validate_user_events
    )
    
    # 다운스트림 태스크는 검증 성공에 의존
    # transform_task >> load_task

변환 태스크 전에 검증을 배치하면 잘못된 데이터가 다운스트림으로 전파되는 것을 방지합니다. 이 패턴은 "시프트-레프트 테스팅"이라고도 불리며, 비용이 많이 드는 계산 작업이 완료된 후가 아니라 수집 시점에 문제를 포착합니다.

Great Expectations 관련 면접 빈출 질문

2026년 데이터 엔지니어링 면접에는 데이터 품질 도구에 대한 질문이 자주 포함됩니다. 아래는 기술 스크리닝에서 나오는 질문과 경험 많은 후보자와 주니어를 구분하는 답변입니다.

"프로덕션 파이프라인에서 데이터 품질 검사를 어떻게 구현하시겠습니까?"

훌륭한 답변은 검증을 별도의 대시보드가 아닌 파이프라인 단계로 포함시키는 것을 언급합니다. 구체적으로:

  • 수집 시 스키마 검증으로 구조적 문제(예: 정수가 예상되는 곳에 문자열이 나타나는 경우)를 즉시 감지합니다
  • 비즈니스 로직 검증은 양수 가격, 날짜 범위 등의 도메인 제약 조건을 확인합니다
  • 자동 경고는 검증 실패 시 온콜 엔지니어에게 알려 무음 데이터 손상을 방지합니다
  • dbt 테스트는 변환 레이어 검사를 처리하고, GX는 수집 및 출력 검증을 처리합니다

"Expectation Suite와 Checkpoint의 차이점은 무엇입니까?"

Expectation Suite에는 어서션 자체가 포함됩니다: 존재해야 할 컬럼, 허용되는 값 범위, 일치해야 할 정규식 패턴 등. 무엇을 검사할지 정의합니다.

Checkpoint는 이러한 검사를 언제, 어떻게 실행할지 정의합니다. 특정 Data Asset(검증할 데이터), Expectation Suite(적용할 규칙), 그리고 Actions(검증 후 발생하는 작업)을 연결합니다.

"환경에 따라 다른 Expectations를 어떻게 처리하시겠습니까?"

프로덕션 데이터는 종종 스테이징 데이터와 다른 특성을 가집니다. 두 가지 접근 방식이 있습니다:

  1. 매개변수화된 Expectations: 환경 변수나 런타임 매개변수를 사용하여 임계값을 조정합니다. 예를 들어, min_value=int(os.getenv("AGE_MIN", 0)).

  2. 다중 Suites: 스테이징과 프로덕션용으로 별도의 Suites를 유지합니다. 스테이징에서는 불완전한 데이터 흐름 테스트를 위해 선택적 필드에서 null을 허용할 수 있습니다.

"스케줄된 파이프라인에서 Checkpoint가 실패하면 어떻게 됩니까?"

Checkpoint는 success=FalseCheckpointResult를 반환합니다. 파이프라인 동작은 오케스트레이터가 실패를 처리하는 방식에 따라 달라집니다:

  • Airflow에서 예외를 발생시키면 태스크가 실패로 표시되고 다운스트림 태스크가 차단됩니다
  • Databricks에서 노트북은 오류 상태로 종료할 수 있습니다
  • Checkpoint에 연결된 Actions은 Slack 메시지 전송, Jira 티켓 생성 또는 롤백 절차 트리거가 가능합니다

도메인별 검증을 위한 커스텀 Expectations

GX에는 300개 이상의 내장 Expectations가 포함되어 있지만, 도메인별 규칙에는 종종 커스텀 구현이 필요합니다. 커스텀 Expectation은 기본 클래스를 확장하고 검증 로직을 구현합니다.

python
# custom_expectations/expect_valid_iso_country_code.py
from great_expectations.expectations import Expectation
from great_expectations.core import ExpectationConfiguration
import pycountry

class ExpectValidISOCountryCode(Expectation):
    """유효한 ISO 3166-1 alpha-2 국가 코드를 검증합니다."""
    
    column: str
    
    def _validate(
        self,
        metrics: dict,
        runtime_configuration: dict = None,
        execution_engine = None
    ):
        column_values = metrics.get("column_values.value_set")
        
        invalid_codes = []
        for code in column_values:
            if code is not None:
                try:
                    pycountry.countries.get(alpha_2=code.upper())
                except KeyError:
                    invalid_codes.append(code)
        
        success = len(invalid_codes) == 0
        return {
            "success": success,
            "result": {
                "observed_value": f"{len(invalid_codes)} invalid codes",
                "invalid_codes": invalid_codes[:10]  # 처음 10개만 표시
            }
        }

커스텀 Expectations는 Data Context에 등록하여 내장 Expectations와 동일하게 사용할 수 있습니다. 이를 통해 금융 거래 ID 형식이나 의료 기록 식별자와 같은 비즈니스별 검증이 가능합니다.

데이터 웨어하우스 연결: Snowflake 예시

GX는 다양한 SQL 데이터 웨어하우스에 직접 연결할 수 있습니다. 다음은 Snowflake를 사용한 예시입니다.

python
# snowflake_validation.py
import great_expectations as gx

context = gx.get_context()

# Snowflake Data Source 추가
snowflake_source = context.data_sources.add_snowflake(
    "snowflake_warehouse",
    connection_string=(
        "snowflake://user:password@account/"
        "database/schema?warehouse=compute_wh"
    )
)

# 쿼리 기반 Data Asset 추가
orders_asset = snowflake_source.add_query_asset(
    name="recent_orders",
    query="SELECT * FROM orders WHERE order_date >= CURRENT_DATE - 7"
)

# 이 asset에 대해 Expectation 적용
suite = context.suites.get("orders_suite")
validation_definition = gx.ValidationDefinition(
    name="validate_recent_orders",
    data=orders_asset.build_batch_request(),
    suite=suite
)

result = validation_definition.run()

쿼리 기반 Data Assets를 사용하면 전체 테이블이 아닌 관련 데이터만 검증할 수 있습니다. 이는 대규모 팩트 테이블에서 검증 비용을 줄이는 데 중요합니다.

테스트 환경에서의 GX 설정

CI/CD 파이프라인에서 GX 검증을 실행하려면 테스트 환경의 적절한 설정이 필요합니다.

yaml
# .github/workflows/data-validation.yml
name: Data Validation

on:
  push:
    branches: [main]
  schedule:
    - cron: '0 */6 * * *'  # 6시간마다

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.12'
      
      - name: Install dependencies
        run: |
          pip install great-expectations[snowflake]==1.22.0
      
      - name: Run GX Checkpoints
        env:
          SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }}
        run: |
          python scripts/run_all_checkpoints.py
      
      - name: Upload Data Docs
        uses: actions/upload-artifact@v4
        with:
          name: data-docs
          path: gx/uncommitted/data_docs/

결론

Great Expectations는 데이터 파이프라인에 품질 검증을 통합하기 위한 성숙한 프레임워크입니다. 2026년에도 그 중요성은 변하지 않습니다. Expectation Suites, Checkpoints, Data Context의 개념을 이해하고, Airflow와 같은 오케스트레이터와의 통합 방법을 숙달하면 데이터 엔지니어링 면접에서 경쟁 우위를 확보할 수 있습니다.

면접에서는 검증을 독립적인 프로세스가 아닌 파이프라인의 일부로 포함시키는 것의 중요성을 강조해야 합니다. 시프트-레프트 테스팅 접근 방식을 통해 다운스트림에서의 데이터 품질 문제를 최소화하고, 신뢰할 수 있는 데이터 기반을 구축할 수 있습니다.

오늘의 챌린지

Data Engineering 코드의 버그를 찾을 수 있나요

실제 코드 한 조각, 숨은 버그 하나, 하루 한 번. 계정 없이 바로 도전할 수 있습니다.

Anthony Fillion-Maillet

작성자

Anthony Fillion-Maillet

SharpSkill 창업자

10년 이상 풀스택 개발을 해왔습니다. SharpSkill을 운영하며 이곳에 게시되는 모든 내용에 책임을 집니다.

2026년 9월 13일 업데이트

태그

#great-expectations
#data-quality
#python
#data-engineering
#testing

공유

관련 기사