엔터프라이즈 환경에서 데이터 거버넌스와 데이터 레이크를 완벽하게 구축했더라도, 피할 수 없는 최후의 장벽이 하나 존재합니다. 바로 여러 시스템에서 유입된 데이터들의 ‘명칭 불일치’로 인한 파편화(Fragmentation) 현상입니다.
아무리 철저하게 결측치를 막아내고 포맷을 통일(DQI)하더라도, 본질적으로 입력된 ‘이름’ 자체가 제각각이라면 시스템은 이를 완전히 다른 데이터로 인식해 버립니다. 본 문서에서는 파이썬(Python) 데이터 엔지니어링의 핵심 기술인 퍼지 매칭(Fuzzy Matching)을 활용하여, 뿔뿔이 흩어진 파편화 데이터를 하나의 ‘단일 진실 공급원(SSOT, Single Source of Truth)’으로 묶어내는 마스터 데이터 관리(MDM) 실무 아키텍처를 공유합니다.
1. 실전 경험: 파편화된 데이터가 불러온 집계 쿼리의 붕괴
과거 G2B(나라장터)와 LH 공공입찰 공고를 연동하여 모바일 최적화 웹앱인 ‘부동산 단지 정보 관리’ 시스템을 개발할 때 겪었던 치명적인 문제입니다.
하남 미사 지역의 아파트와 오피스텔 유지보수 입찰 내역을 하나로 묶어 대시보드에 띄우려 했는데, 막상 집계 쿼리(GROUP BY)를 돌려보니 데이터가 수십 개로 쪼개져서 나왔습니다. 원인을 파악해 보니 각 발주처 담당자마다, 혹은 연동된 외부 API 시스템마다 단지를 부르는 명칭이 전부 달랐기 때문입니다.
- A 시스템 (LH 공고):
미사강변 푸르지오 1차 - B 시스템 (G2B 입찰):
하남미사지구 푸르지오아파트 - C 시스템 (수기 입력):
미사 푸루지오(오타 포함)
이 3개의 데이터는 사람의 눈에는 명백히 같은 단지를 가리키지만, 데이터베이스 엔진에게는 완전히 남남입니다. 이를 방치하면 특정 단지의 입찰 이력이나 실거래가가 분산되어 반쪽짜리 통계만 나오게 됩니다. 즉, 각 부서가 서로 다른 데이터를 들고 싸우는 ‘데이터 사일로(Silo)’의 비극이 시작되는 것입니다.
2. 구원 투수: 파이썬 퍼지 매칭(Fuzzy Matching) 알고리즘
단순한 SQL의 JOIN이나 REPLACE 함수로는 띄어쓰기, 오타, 수식어의 차이를 절대 극복할 수 없습니다. 이때 도입해야 하는 거버넌스 엔지니어링 기술이 바로 레벤슈타인 거리(Levenshtein Distance) 알고리즘을 기반으로 한 문자열 유사도 분석입니다.
파이썬의 thefuzz 라이브러리를 활용하면 두 문자열이 얼마나 유사한지 0부터 100까지의 점수(Score)로 수치화할 수 있습니다. 이를 통해 엉망으로 수집된 원시 데이터(Raw Data)를 우리가 미리 정의해 둔 ‘골든 레코드(마스터 기준 데이터)’에 강제로 병합시키는 아키텍처를 구현할 수 있습니다.
3. 단일 진실 공급원(SSOT) 구축을 위한 실무 파이썬 스크립트
다음은 외부에서 유입된 파편화된 단지 명칭을, 내부 마스터 데이터베이스의 ‘표준 명칭’으로 자동 매핑(Mapping)해 주는 실전 파이썬 코드입니다.
Python
import pandas as pd
from thefuzz import fuzz
from thefuzz import process
# 1. 마스터 데이터 (우리가 기준으로 삼을 완벽한 '골든 레코드' SSOT)
master_db = ['미사강변푸르지오', '하남미사롯데캐슬', '미사역헤리움']
df_master = pd.DataFrame(master_db, columns=['표준_마스터_명칭'])
# 2. 파편화된 원시 데이터 (G2B, LH 등에서 수집된 오염된 텍스트)
raw_data = [
'미사강변 푸루지오 1단지', # 오타 및 수식어 포함
'하남 미사지구 롯데케슬', # 오타 및 지역명 추가
'미사역 헤리움 오피스텔', # 용도명 추가
'전혀 관계없는 상가건물' # 매칭 실패 테스트용
]
df_raw = pd.DataFrame(raw_data, columns=['수집된_원시_명칭'])
def mdm_fuzzy_matcher(target_name, standard_choices, threshold=75):
"""
수집된 텍스트를 마스터 표준 명칭과 비교하여,
유사도(임계치 75점 이상)가 가장 높은 골든 레코드를 반환합니다.
"""
# token_set_ratio는 단어의 순서나 띄어쓰기, 중복을 무시하고 핵심 토큰의 유사도를 평가합니다.
best_match, score = process.extractOne(target_name, standard_choices, scorer=fuzz.token_set_ratio)
if score >= threshold:
return best_match, score
else:
return "매칭 실패 (격리 필요)", score
# 3. MDM 파이프라인 매칭 실행
df_raw['매칭된_골든레코드'] = df_raw['수집된_원시_명칭'].apply(lambda x: mdm_fuzzy_matcher(x, df_master['표준_마스터_명칭'])[0])
df_raw['유사도_점수'] = df_raw['수집된_원시_명칭'].apply(lambda x: mdm_fuzzy_matcher(x, df_master['표준_마스터_명칭'])[1])
print("=== MDM 기반 단일 진실 공급원(SSOT) 병합 결과 ===")
print(df_raw.to_string(index=False))
이 스크립트를 거치면 아무리 제멋대로 쓰인 ‘미사강변 푸루지오 1단지’라도 내부 기준인 미사강변푸르지오라는 단일 식별자로 통합됩니다.
4. 거버넌스 아키텍처의 완성: 실버 존(Silver Zone)에서 골드 존(Gold Zone)으로
이 퍼지 매칭 로직은 결코 단순한 전처리 스크립트가 아닙니다. 앞서 다루었던 ‘메달리온 아키텍처’ 관점에서 볼 때, 이 과정은 실버 존(Silver Zone)의 최후방을 담당하는 핵심 품질 게이트(Quality Gate)입니다.
포맷 검증(DQI)을 거친 데이터들이 이 MDM 통합 과정을 통해 흩어진 파편을 모아 ‘단일 진실 공급원(SSOT)’으로 병합된 후에야, 비로소 대시보드와 BI 툴이 바라보는 무결점의 골드 존(Gold Zone)에 적재될 자격을 얻게 됩니다. 데이터를 쌓아두는 것을 넘어, 서로 다른 시스템의 언어를 하나로 통역해 내는 마스터 데이터 관리(MDM)를 통해 진정한 의미의 데이터 거버넌스를 완성해 보시길 바랍니다.