[Python] 파이썬으로 더미 데이터 만들기

cowmin·2025년 6월 20일

1. 개요

1.1 실습 목적 및 시스템 개요

데이터베이스 프로젝트에서 SQL 성능을 개선한 결과를 검증하기 위해, 대용량의 더미 데이터가 필요했다.

1.2 파이썬을 선택한 이유

  • 파이썬은 문법이 간결하고 Faker 라이브러리를 통해 다양한 형식의 더미 데이터를 쉽게 생성할 수 있다.
  • CSV나 SQL INSERT 형태로 저장하는 기능도 내장되어 있어 데이터 활용성이 높다.
  • 또한 실제 개발 환경에서도 테스트 자동화나 데이터 시뮬레이션에 널리 사용되어 실무 연계에도 적합하다.

1.3 실습 환경 및 사용 기술

항목내용
언어Python 3.10
더미 데이터 생성Faker (ko_KR 설정)
데이터 저장 방식SQL INSERT 쿼리
데이터 규모사용자 10,000건
실행 환경VSCode + Python 환경 (로컬 실행)
사용 모듈faker, random, hashlib
대상 데이터베이스MariaDB 10.6.22
스키마 기반사용자 테이블 CREATE TABLE 문 활용

2. 테이블 생성문

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
);

3. 더미데이터 생성 코드

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명)")

4. 속성별 정의 및 더미데이터 생성 방식

4.1 id – 고유 식별자 (기본키, 자동 증가)

-- id 속성 정보
id BIGINT AUTO_INCREMENT PRIMARY KEY

------------------------------------------------------

-- BIGINT: 8바이트 정수형
-- AUTO_INCREMENT: 값이 자동으로 1씩 증가	
-- PRIMARY KEY: 기본키, 중복 불가, NULL 불가

------------------------------------------------------

# 더미데이터 생성문
user_id = 1 
while user_id <= 10000:

4.2 name – 사용자 이름 (필수 입력)

-- name 속성 정보
name VARCHAR(50) NOT NULL

------------------------------------------------------

-- VARCHAR(50): 최대 50자까지 저장 가능한 가변 길이 문자열
-- NOT NULL: 반드시 값이 있어야 함

------------------------------------------------------

# 더미데이터 생성문
# replace("'", "''"): 문법 오류를 막기 위해 이스케이프
name = fake.name().replace("'", "''")  

4.3 email – 이메일 주소 (고유값, 필수 입력)

-- 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에 등록
    

4.4 birth_date – 생년월일 (날짜 형식)

-- 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')

4.5 phone_number – 휴대전화 번호

-- phone_number 속성 정보
phone_number VARCHAR(20)

------------------------------------------------------

-- VARCHAR(20): 최대 20자까지 저장 가능한 가변 길이 문자열

------------------------------------------------------

# 더미데이터 생성문
phone = fake.phone_number()

4.6 home_number – 집 전화번호

-- home_number 속성 정보
home_number VARCHAR(20)

------------------------------------------------------

-- VARCHAR(20): 최대 20자까지 저장 가능한 가변 길이 문자열

------------------------------------------------------

# 더미데이터 생성문
home = fake.phone_number()

4.7 address – 거주지 주소

-- address 속성 정보
address VARCHAR(255)

------------------------------------------------------

-- VARCHAR(255): 최대 255자까지 저장 가능한 가변 길이 문자열

------------------------------------------------------

# 더미데이터 생성문
# replace('\n', ', '): 줄바꿈 제거
# replace("'", "''"): 문법 오류를 막기 위해 이스케이프
address = fake.address().replace('\n', ', ').replace("'", "''")

4.8 role – 사용자 권한 (일반 사용자 / 생산자)

-- role 속성 정보
role ENUM('일반 사용자', '생산자') DEFAULT '일반 사용자'

------------------------------------------------------

-- ENUM('일반 사용자', '생산자'): 값으로 '일반 사용자' 또는 '생산자' 중 하나만 허용하는 열거형 타입
-- DEFAULT '일반 사용자': 값을 지정하지 않으면 자동으로 '일반 사용자'가 들어감

------------------------------------------------------

# 더미데이터 생성문
role = random.choice(['일반 사용자', '생산자'])

4.9 password_hash – 비밀번호 해시 (필수 입력)

-- password_hash 속성 정보
password_hash VARCHAR(255) NOT NULL

------------------------------------------------------

-- VARCHAR(255): 최대 255자까지 저장 가능한 가변 길이 문자열
-- NOT NULL: 반드시 값이 있어야 함

------------------------------------------------------

# 더미데이터 생성문
# 실제 운영 환경에서는 salt와 해시 알고리즘 강화 필요
password_hash = hash_password("defaultPassword123")

4.10 created_at – 계정 생성일 (기본값: 오늘 날짜)

-- 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')

5. 생성된 더미데이터 일부

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'
        );

6. 데이터 임포트

6.1 Workbench에서 SQL 파일 임포트

  1. MySQL Workbench 실행
  2. 상단 메뉴에서 [Server] → [Data Import] 클릭
  3. Import from Disk 선택
  4. Import from Self-Contained File 체크 후 users_insert.sql 파일 선택
  5. Start Import 선택

6.2 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'
);

-- (이하 생략: 더미 데이터 계속 삽입)

6.3 임포트 과정 스크린샷

1. SQL 파일 선택 후 임포트 시작

워크벤치에서 임포트 하기

2. 임포트 완료 메시지

워크벤치 임포트 완료

3. users 테이블 조회 결과

users 테이블 조회 결과


7. 실습을 마치며

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

0개의 댓글