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 |