일반적으로 IT 분야나 코딩 입문 단계에서 더미데이터(Dummy Data)의 뜻을 검색하면, 단순히 ‘빈 공간을 채우기 위해 임의로 집어넣는 의미 없는 가짜 데이터’라는 사전적 정의를 마주하게 됩니다.
하지만 엔터프라이즈 데이터 거버넌스와 빅데이터 파이프라인 실무에서 더미데이터가 가지는 의미는 완전히 다릅니다. 현업 데이터 엔지니어에게 더미데이터란 우리가 구축한 데이터 품질 지표(DQI) 검증 시스템이 극한의 에러 상황에서도 무너지지 않는지 시험하기 위해 ‘의도적으로 정교하게 오염시킨 스트레스 테스트용 탄약’을 뜻합니다.
본 문서에서는 파이썬(Python)의 Faker 라이브러리를 활용하여, 결측치와 포맷 불량이 난무하는 G2B(나라장터) 공공입찰 더미데이터 1만 건을 순식간에 찍어내는 실무 아키텍처를 공개합니다.
1. 현업 데이터 파이프라인에서 ‘더미데이터’가 반드시 필요한 이유 (실전 경험담)
실제로 G2B 크롤링 파이프라인을 처음 구축했을 때 겪은 일입니다. 처음 몇 페이지의 공고를 긁어보고 코드가 완벽하게 도는 것을 확인한 뒤, 호기롭게 전체 데이터를 수집하도록 배치를 걸어두고 퇴근했죠. 그런데 다음 날 출근해 보니 DB 적재는 중간에 멈춰 있고 화면에는 시뻘건 에러 로그만 가득했습니다.
알고 보니 어떤 발주처 담당자가 금액 칸에 숫자가 아니라 ‘금 일천만 원정(VAT 별도)’이라고 친절하게(?) 한글과 특수문자를 섞어 적어둔 게 화근이었습니다. 제가 짜둔 기본 정규표현식이 이 기상천외한 텍스트를 예상하지 못하고 그대로 뻗어버린 겁니다. 운영 DB에 엉망인 데이터가 섞여 들어가서 집계 쿼리도 전부 먹통이 되었습니다.
그날 뼈저리게 느꼈습니다. 실전 데이터를 돌리기 전에, ‘이래도 되나’ 싶을 정도로 엉망으로 꼬아놓은 더미데이터를 수만 건 만들어서 내 코드를 극한까지 괴롭혀봐야 한다는 사실을요.
2. 파이썬 Faker 라이브러리: 한국어 맞춤형 가짜 데이터의 연금술
파이썬 생태계에서 가장 강력한 더미데이터 생성 도구는 Faker 라이브러리입니다. 특히 Faker('ko_KR')를 초기화하면 그럴듯한 한국어 이름, 기업명을 무한대로 쏟아냅니다. 여기에 의도적인 ‘오염(Dirty)’을 주입하는 것이 엔지니어링의 핵심입니다.
Python
import pandas as pd
import random
import numpy as np
from faker import Faker
# 한국어 더미데이터 생성을 위한 Faker 로케일 초기화
fake = Faker('ko_KR')
def generate_g2b_dirty_dummy_data(num_records):
data = []
for _ in range(num_records):
notice_name = f"{fake.catch_phrase()} 및 인프라 구축 사업"
client_name = fake.company()
# [엔지니어링 핵심] 의도적인 오염 데이터(Dirty Data) 주입
amount_choices = [
str(random.randint(10000000, 99000000)), # 정상: 순수 숫자
f"{random.randint(10, 99)},000,000", # 불량: 콤마(,) 포함
f"금 {random.randint(10, 99)}천만 원 (부가세포함)", # 불량: 한글 및 특수기호 혼용 (장애 원인)
np.nan # 불량: 완전성 테스트용 빈칸(Null)
]
base_amount = random.choices(
population=amount_choices,
weights=[0.6, 0.2, 0.15, 0.05], # 불량 데이터 비율을 강제로 높임
k=1
)[0]
# 비정상적인 날짜 포맷 주입
deadline_choices = [
fake.date_between(start_date='-1y', end_date='+1y').strftime('%Y-%m-%d'), # 정상 포맷
fake.date_between(start_date='-1y', end_date='+1y').strftime('%Y년 %m월 %d일'), # 불량 한글 포맷
"기한 미정" # 극한의 엣지 케이스
]
deadline = random.choice(deadline_choices)
data.append([notice_name, client_name, base_amount, deadline])
df = pd.DataFrame(data, columns=['입찰공고명', '발주처', '기초금액', '입찰마감일시'])
return df
# 10,000건의 오염된 더미데이터 생성 및 CSV 저장
dummy_dataframe = generate_g2b_dirty_dummy_data(10000)
dummy_dataframe.to_csv('g2b_dirty_dummy_data.csv', index=False, encoding='utf-8-sig')
print(dummy_dataframe.head(10))
3. 창(Faker)과 방패(DQI): 거버넌스 아키텍처의 완성
위의 코드를 실행하여 만들어진 g2b_dirty_dummy_data.csv 파일을 열어보면, 기초금액과 날짜 칸은 그야말로 엉망진창일 것입니다. 하지만 바로 이것이 우리가 애타게 찾던 최상급의 테스트 데이터입니다.
이제 이 오염된 파일을 앞서 작성했던 파이썬 정확성 DQI 검증 스크립트에 통과시켜 보십시오. 우리가 심혈을 기울여 짰던 정규표현식 로직(^\d+$ 등)이 한글과 콤마가 섞인 데이터를 얼마나 완벽하게 ‘불량(Fail)’으로 잡아내고 격리하는지 직접 눈으로 확인할 수 있습니다. 거버넌스는 이렇게 치열한 스트레스 테스트를 거칠 때 비로소 완성됩니다.