데이터베이스 프로젝트에서 SQL 성능을 개선한 결과를 검증하기 위해, 대용량의 더미 데이터가 필요했다.
| 항목 | 내용 |
|---|---|
| 언어 | Python 3.10 |
| 더미 데이터 생성 | Faker (ko_KR 설정) |
| 데이터 저장 방식 | SQL INSERT 쿼리 |
| 데이터 규모 | 사용자 10,000건 |
| 실행 환경 | VSCode + Python 환경 (로컬 실행) |
| 사용 모듈 | faker, random, hashlib |
| 대상 데이터베이스 | MariaDB 10.6.22 |
| 스키마 기반 | 사용자 테이블 CREATE TABLE 문 활용 |
CREATE TABLE users (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
birth_date DATE,
phone_number VARCHAR(20),
home_number VARCHAR(20),
address VARCHAR(255),
role ENUM('일반 사용자', '생산자') DEFAULT '일반 사용자',
password_hash VARCHAR(255) NOT NULL,
created_at DATE DEFAULT CURRENT_DATE
);
from faker import Faker
import random
import hashlib
fake = Faker('ko_KR')
def hash_password(password):
return hashlib.sha256(password.encode()).hexdigest()
used_emails = set() # 중복 체크용 집합
with open('users_insert.sql', 'w', encoding='utf-8') as f:
user_id = 1
while user_id <= 10000:
name = fake.name().replace("'", "''")
email = fake.email().replace("'", "''")
if email in used_emails:
continue # 중복이면 건너뜀
used_emails.add(email)
birth_date = fake.date_of_birth(minimum_age=18, maximum_age=65).strftime('%Y-%m-%d')
phone = fake.phone_number()
home = fake.phone_number()
address = fake.address().replace('\n', ', ').replace("'", "''")
role = random.choice(['일반 사용자', '생산자'])
password_hash = hash_password("defaultPassword123")
created_at = fake.date_this_decade().strftime('%Y-%m-%d')
f.write(f"""INSERT INTO users (
id, name, email, birth_date, phone_number,
home_number, address, role, password_hash, created_at
) VALUES (
{user_id}, '{name}', '{email}', '{birth_date}', '{phone}',
'{home}', '{address}', '{role}', '{password_hash}', '{created_at}'
);\n""")
user_id += 1
print("중복 없는 users_insert.sql 생성 완료 (10,000명)")
-- id 속성 정보
id BIGINT AUTO_INCREMENT PRIMARY KEY
------------------------------------------------------
-- BIGINT: 8바이트 정수형
-- AUTO_INCREMENT: 값이 자동으로 1씩 증가
-- PRIMARY KEY: 기본키, 중복 불가, NULL 불가
------------------------------------------------------
# 더미데이터 생성문
user_id = 1
while user_id <= 10000:
-- name 속성 정보
name VARCHAR(50) NOT NULL
------------------------------------------------------
-- VARCHAR(50): 최대 50자까지 저장 가능한 가변 길이 문자열
-- NOT NULL: 반드시 값이 있어야 함
------------------------------------------------------
# 더미데이터 생성문
# replace("'", "''"): 문법 오류를 막기 위해 이스케이프
name = fake.name().replace("'", "''")
-- email 속성 정보
email VARCHAR(100) UNIQUE NOT NULL
------------------------------------------------------
-- VARCHAR(100): 최대 100자까지 저장 가능한 가변 길이 문자열
-- UNIQUE: 중복을 허용하지 않음
-- NOT NULL: 반드시 값이 있어야 함
------------------------------------------------------
# 더미데이터 생성문
# replace("'", "''"): 문법 오류를 막기 위해 이스케이프
email = fake.email().replace("'", "''")
if email in used_emails:
continue # 중복이면 건너뜀
used_emails.add(email) # 생성한 이메일을 used_emails에 등록
-- birth_date 속성 정보
birth_date DATE
------------------------------------------------------
-- DATE: 날짜 타입 → YYYY-MM-DD 형식으로 저장
------------------------------------------------------
# 더미데이터 생성문
# 오늘 기준으로 18세 ~ 65세 사이 사람의 생년월일을 무작위 생성
# strftime('%Y-%m-%d'): 파이썬의 date 객체를 '2024-06-20' 같은 문자열로 변환
birth_date = fake.date_of_birth(minimum_age=18, maximum_age=65).strftime('%Y-%m-%d')
-- phone_number 속성 정보
phone_number VARCHAR(20)
------------------------------------------------------
-- VARCHAR(20): 최대 20자까지 저장 가능한 가변 길이 문자열
------------------------------------------------------
# 더미데이터 생성문
phone = fake.phone_number()
-- home_number 속성 정보
home_number VARCHAR(20)
------------------------------------------------------
-- VARCHAR(20): 최대 20자까지 저장 가능한 가변 길이 문자열
------------------------------------------------------
# 더미데이터 생성문
home = fake.phone_number()
-- address 속성 정보
address VARCHAR(255)
------------------------------------------------------
-- VARCHAR(255): 최대 255자까지 저장 가능한 가변 길이 문자열
------------------------------------------------------
# 더미데이터 생성문
# replace('\n', ', '): 줄바꿈 제거
# replace("'", "''"): 문법 오류를 막기 위해 이스케이프
address = fake.address().replace('\n', ', ').replace("'", "''")
-- role 속성 정보
role ENUM('일반 사용자', '생산자') DEFAULT '일반 사용자'
------------------------------------------------------
-- ENUM('일반 사용자', '생산자'): 값으로 '일반 사용자' 또는 '생산자' 중 하나만 허용하는 열거형 타입
-- DEFAULT '일반 사용자': 값을 지정하지 않으면 자동으로 '일반 사용자'가 들어감
------------------------------------------------------
# 더미데이터 생성문
role = random.choice(['일반 사용자', '생산자'])
-- password_hash 속성 정보
password_hash VARCHAR(255) NOT NULL
------------------------------------------------------
-- VARCHAR(255): 최대 255자까지 저장 가능한 가변 길이 문자열
-- NOT NULL: 반드시 값이 있어야 함
------------------------------------------------------
# 더미데이터 생성문
# 실제 운영 환경에서는 salt와 해시 알고리즘 강화 필요
password_hash = hash_password("defaultPassword123")
-- created_at 속성 정보
created_at DATE DEFAULT CURRENT_DATE
------------------------------------------------------
-- DATE: 날짜 형식 (시간 없이 YYYY-MM-DD 형식)
-- DEFAULT CURRENT_DATE: 값이 입력되지 않으면 현재 날짜가 자동으로 저장됨 (2025-06-20 등)
------------------------------------------------------
# 더미데이터 생성문
# fake.date_this_decade(): 최근 10년 이내 (2015~현재) 중에서 무작위 날짜 하나 생성
# .strftime('%Y-%m-%d'): 위의 날짜 객체를 문자열로 변환
created_at = fake.date_this_decade().strftime('%Y-%m-%d')
INSERT INTO users (
id, name, email, birth_date, phone_number,
home_number, address, role, password_hash, created_at
) VALUES (
1, '최준혁', 'sanghun22@example.com', '1993-02-02', '043-755-1472',
'053-215-1865', '인천광역시 강동구 서초대1거리 490', '일반 사용자', '36e47dd992c4e177ba3e3c0b493f1a05036a05e62b17e2560afab6d8a6695817', '2022-09-14'
);
INSERT INTO users (
id, name, email, birth_date, phone_number,
home_number, address, role, password_hash, created_at
) VALUES (
2, '권민수', 'juweonyun@example.com', '2001-10-23', '061-244-2416',
'053-489-5825', '경상북도 고양시 일산서구 봉은사941로 829-60 (성현고장리)', '생산자', '36e47dd992c4e177ba3e3c0b493f1a05036a05e62b17e2560afab6d8a6695817', '2024-08-17'
);
INSERT INTO users (
id, name, email, birth_date, phone_number,
home_number, address, role, password_hash, created_at
) VALUES (
3, '조상호', 'siu27@example.com', '1962-06-14', '052-308-2169',
'062-661-9661', '제주특별자치도 광명시 개포7로 618', '일반 사용자', '36e47dd992c4e177ba3e3c0b493f1a05036a05e62b17e2560afab6d8a6695817', '2025-01-28'
);
users_insert.sql 파일 선택users_insert.sql 예시파이썬으로 만든
INSERT문 앞에 데이터베이스 선택 및 테이블 생성 쿼리를 추가했다.
-- 데이터베이스 선택
USE testdb;
-- users 테이블 생성
CREATE TABLE users (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
birth_date DATE,
phone_number VARCHAR(20),
home_number VARCHAR(20),
address VARCHAR(255),
role ENUM('일반 사용자', '생산자') DEFAULT '일반 사용자',
password_hash VARCHAR(255) NOT NULL,
created_at DATE DEFAULT CURRENT_DATE
);
-- 데이터 삽입 예시
INSERT INTO users (
id, name, email, birth_date, phone_number,
home_number, address, role, password_hash, created_at
) VALUES (
1, '최준혁', 'sanghun22@example.com', '1993-02-02', '043-755-1472',
'053-215-1865', '인천광역시 강동구 서초대1거리 490', '일반 사용자',
'36e47dd992c4e177ba3e3c0b493f1a05036a05e62b17e2560afab6d8a6695817',
'2022-09-14'
);
INSERT INTO users (
id, name, email, birth_date, phone_number,
home_number, address, role, password_hash, created_at
) VALUES (
2, '권민수', 'juweonyun@example.com', '2001-10-23', '061-244-2416',
'053-489-5825', '경상북도 고양시 일산서구 봉은사941로 829-60 (성현고장리)', '생산자',
'36e47dd992c4e177ba3e3c0b493f1a05036a05e62b17e2560afab6d8a6695817',
'2024-08-17'
);
-- (이하 생략: 더미 데이터 계속 삽입)

본 실습을 통해 실제 데이터 없이도 SQL 성능 테스트와 시스템 시뮬레이션을 위한 더미 데이터를 효과적으로 생성할 수 있었다. 추후에는 다양한 테이블에 대해 관계형 데이터 구조를 반영한 다중 테이블 더미 데이터 생성도 시도할 계획이다.