데이터 무결성 검증을 위한 SQL Test 작성법

2025. 3. 26. 10:43·SQL
728x90

데이터 무결성(Data Integrity)은 데이터가 정확하고 일관되게 유지되는 것을 보장하는 개념이다.

데이터 무결성이 깨지면 잘못된 정보가 시스템에 반영될 수 있어 비즈니스 의사결정에 큰 영향을 미칠 수 있다.

1. 데이터 무결성이란?

데이터 무결성은 크게 다음과 같은 네 가지 유형으로 분류된다.

1.1 엔터티 무결성(Entity Integrity)

  • 각 행(row)의 기본 키(Primary Key, PK)는 반드시 고유해야 한다.
  • 예제 : users 테이블에서 중복된 id 값이 있는지 확인
SELECT id, COUNT(*) 
FROM users 
GROUP BY id 
HAVING COUNT(*) > 1;
  • 테스트 목적 : 기본 키 id의 중복 여부 검증
  • 오류 발생 시 영향 : 중복된 키로 인해 참조 무결성이 깨질 수 있음

1.2 참조 무결성(Referential Integrity)

  • 외래 키(Foreign Key, FK)가 부모 테이블의 기본 키와 일치해야 한다.
  • 예제 : child 테이블에서 부모 테이블에 없는 parent_id가 있는지 확인
SELECT child.id 
FROM child 
LEFT JOIN parent
    ON child.parent_id = parent.id 
WHERE parent.id IS NULL;
  • 테스트 목적 : 존재하지 않는 parent_id 값을 참조하는 데이터 검축
  • 오류 발생 시 영향 : 삭제된 부모 데이터를 참조하는 레코드가 남아 있을 수 있음

1.3 도메인 무결성(Domain Integrity)

  • 컬럼 값이 허용된 데이터 타입과 범위를 준수해야 한다.
  • 예제 : amount 컬럼이 음수인지 확인
SELECT *
FROM orders
WHERE amount < 0;
  • 테스트 목적 : 비정상적인 값(예 : 음수 금액) 검출
  • 오류 발생 시 영향 : 잘못된 수치로 인해 재무 데이터 오류 발생 가능

1.4 비즈니스 무결성(Business Integrity)

  • 특정 비즈니스 로직을 위반하지 않아야 한다.
  • 예제 : order_date가 delivery_date보다 늦은 주문 검출
SELECT *
FROM orders
WHERE order_date > delivery_date;
  • 테스트 목적 : 논리적으로 말이 안 되는 데이터 검출
  • 오류 발생 시 영향 : 잘못된 주문 처리로 인한 고객 불만 증가

2. SQL을 활용한 데이터 무결성 검증 테스트

2.1 NULL 값 체크

SELECT *
FROM users
WHERE email IS NULL;
  • 목표 : 필수 필드(email)가 누락된 데이터 확인
  • 해결 방법 : NOT NULL 제약 조건 추가

2.2 중복 데이터 검출

SELECT email, COUNT(*)
FROM users
GROUP BY email
HAVING COUNT(*) > 1;
  • 목표 : 동일한 email이 여러 번 저장된 경우 탐지
  • 해결 방법 : UNIQUE 제약 조건 추가

2.3 FK 관계 검증

SELECT child.id
FROM child
LEFT JOIN parent 
    ON child.parent_id = parent.id 
WHERE parent.id IS NULL;
  • 목표 : 존재하지 않은 부모 데이터를 참조하는 행 탐지
  • 해결 방법 : ON DELETE CASEADE 또는 ON DELETE SET NULL 적용 고려

2.4 값 범위 체크

SELECT *
FROM sales
WHERE amount < 0;
  • 목표 : 비정상적인 음수 거래 금액 확인
  • 해결 방법 : CHECK 제약 조건 추가

3. SQL 테스트 자동화 및 CI/CD 적용

3.1 DBT (Data Build Tool) 테스트 적용

DBT는 데이터 변환 및 검증을 자동화하는 오픈소스 도구

version: 2
models:
  - name: test_null_values
    tests:
      - not_null:
          column_name: email
  • 목표 : `email` 컬럼이 NULL이 아닌지 검증

3.2 pytest + SQLAlchemy 활용

from sqlalchemy import create_engine, text

def test_null_values():
    engine = create_engine("postgresql://user:password@localhost/db")
    with engine.connect() as conn:
        result = conn.execute(text("SELECT COUNT(*) FROM users WHERE email IS NULL"))
        assert result.scalar() == 0
  • 목표 : email 컬럼이 NULL 값 여부를 자동화 테스트

3.3 Great Expectations 활용

from great_expectations.dataset import PandasDataset

df = PandasDataset.load_from_database("SELECT * FROM users")
df.expect_column_values_to_not_be_null("email")
  • 목표 : email 컬럼의 무결성을 검증하는 데이터 품질 테스트 수행

3.4 CI/CD와 연계하여 자동화 실행

  • GitHub Actions, Jenkins, Airflow 등을 활용하여 정기적으로 데이터 검증 테스트 실행

4. 실전 적용: ETL 파이프라인에서 데이터 검증

ETL(Extract, Transform, Load) 과정에서 데이터 무결성을 검증하여 데이터 품질을 보장할 수 있다.

4.1 ETL 단계에서 SQL 테스트 적용 예제

WITH source_data AS (
    SELECT * FROM staging_table
)
SELECT *
FROM source_data 
WHERE order_date > delivery_date;
  • 목표 : 데이터가 적재되기 전에 유효성을 검증

4.2 대량 데이터 무결성 검증 예제

SELECT product_id, COUNT(*)
FROM sales
GROUP BY product_id
HAVING COUNT(*) > 1000;
  • 목표 : 특정 제품이 비정상적으로 많이 팔린 경우 감지

4.3 모니터링 및 자동 알람

  • SQL 테스트 결과를 로그로 남기고, 이상 발생 시 Slack, Email 알람을 전송
  • Airflow + SQL 테스트 연계
from airflow.operators.python import PythonOperator

def check_data_quality():
    engine = create_engine("postgresql://user:password@localhost/db")
    with engine.connect() as conn:
        result = conn.execute(text("SELECT COUNT(*) FROM users WHERE email IS NULL"))
        if result.scalar() > 0:
            raise ValueError("데이터 무결성 오류: NULL 값 발견")

data_quality_task = PythonOperator(
    task_id='check_data_quality',
    python_callable=check_data_quality
)
  • 목표 : ETL 실행 시 자동으로 데이터 검증을 수행하고, 오류 발생 시 즉시 중단

이와 같은 SQL 테스트를 적용하면 데이터 무결성을 보장하고 비즈니스 로직을 안전하게 유지할 수 있다.

데이터 품질 확보를 위해 정기적인 SQL 테스트를 실행 하는 것이 중요하다.

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'SQL' 카테고리의 다른 글

DB 쿼리가 느릴 때 확인해야 할 것  (0) 2025.03.24
SQL에서 WHERE 1=1을 사용하는 이유는?  (0) 2025.03.14
[SQL] IN 과 JOIN의 대한 궁금중  (0) 2024.04.23
[SQL] Date Format 함수 (formatting parameter)  (1) 2024.03.28
[MYSQL] 함수 만들기 (FUNCTION)  (0) 2024.03.20
'SQL' 카테고리의 다른 글
  • DB 쿼리가 느릴 때 확인해야 할 것
  • SQL에서 WHERE 1=1을 사용하는 이유는?
  • [SQL] IN 과 JOIN의 대한 궁금중
  • [SQL] Date Format 함수 (formatting parameter)
Balang
Balang
음악 전공생의 개발일지
  • Balang
    Balang
    Balang
  • 전체
    오늘
    어제
  • 반응형
    • All Post (147)
      • python (45)
        • selenium (4)
        • algorithm (9)
        • Django (6)
        • Pandas | Numpy (22)
      • SQL (9)
      • Data Engineer (29)
      • Data Scientist (3)
      • Data Analysis (9)
      • Computer Science (35)
      • Why? (15)
      • 마음가짐 (2)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
Balang
데이터 무결성 검증을 위한 SQL Test 작성법
상단으로

티스토리툴바