Python 사용 목적
스프링 애플리케이션에서 QueryMethod 와 QueryDSL 의 성능을 비교 측정하기 위해 더미 데이터가 필요했고, 많은 양의 더미데이터를 쉽게 생성하고 DB에 저장하기 위해 Python을 사용하기로 했다.
준비 사항
- Python : 필요한 라이브러리를 문제 없이 사용할 수 있는 버전
- VSCode : Python 코드 작성용 프로그램
실행 순서
1. 필요 라이브러리 설치
pip install pandas sqlalchemy mysql-connector-python
- python 설치된 라이브러리 목록 확인 방법(CIL 에서)
pip list
2. 스크립트 작성
아래 코드는 user 테이블에 10만 개의 더미 데이터를 생성하고, 이를 1000개 단위로 끊어서 삽입하는 코드이다.
import pandas as pd
from sqlalchemy import create_engine
# 데이터베이스 연결 설정
engine = create_engine('mysql+mysqlconnector://username:password@host/database')
# 더미 데이터 생성 함수
def create_dummy_data(start, end):
"""start부터 end까지의 더미 데이터를 생성합니다."""
data = {
"email": [f"test{i}@gmail.com" for i in range(start, end + 1)],
"nickname": [f"user{i}" for i in range(start, end + 1)],
"password": ["abcd1234!"] * (end + 1 - start)
}
return pd.DataFrame(data)
# 데이터베이스에 데이터 삽입
def insert_data(df):
"""데이터 프레임을 데이터베이스에 삽입합니다."""
df.to_sql('user', con=engine, index=False, if_exists='append')
# 10만 개의 더미 데이터를 1000개씩 나누어 삽입
for batch_start in range(1, 100001, 1000):
batch_end = batch_start + 999
dummy_data = create_dummy_data(batch_start, batch_end)
insert_data(dummy_data)
print(f"Inserted data from {batch_start} to {batch_end}")
print("All data inserted successfully.")
데이터베이스 연결 문자열
dialect+driver://username:password@host:port/database
- dialect+driver : 사용하는 데이터베이스 및 드라이버의 종류, MySQL은 mysql+mysqlconnector 로 설정(mysqlconnector는 Python에서 MySQL에 연결하기 위한 일반적인 드라이버 중 하나)
- username : 데이터베이스에 접근할 수 있는 사용자 이름, 예) root
- password : 해당 사용자의 비밀번호, 예)1234
- host : 데이터베이스 서버의 주소, 예)localhost
- port : 데이터베이스 서버가 사용하는 포트 번호로 MySQL의 기본 포트 번호는 3306이다.
- database : 접속하려는 데이터베이스의 이름, 예)mydata
주의 사항
- 데이터베이스 접속 정보에는 비밀번호가 포함되어 있으므로, 이 정보를 코드에 직접 쓰는 것은 보안상 좋지않으므로 환경 변수나 구성 파일을 사용하는 것이 좋다.
- 데이터베이스 서버가 로컬 컴퓨터에 설치되어 있지 않고 다른 네트워크에 위치한 경우, 실제 서버의 IP 주소나 도메인을 localhost 대신 사용해야 한다.
3. 파일 실행
VS Code의 우측 상단의 ▷버튼을 클릭하고 Python 파일 실행을 클릭한다.
- 위와 같이 DB에 더미데이터가 삽입되는 것을 확인할 수 있다.
주의 사항
- 필요한 컬럼 외에도 Null 값을 허용하지 않는 컬럼도 더미 데이터를 생성해야 한다.
- 에러 처리: 데이터 삽입 과정 중에 에러가 발생할 수 있기 때문에 적절한 예외 처리 로직을 추가하는 것이 좋다.
- SQLAlchemy 버전: 사용하고 있는 라이브러리 버전이 최신인지 확인하고, 이전 버전에서는 지원하지 않는 기능을 사용하고 있는지 확인해야 한다.
DB 데이터 백업
DB에 더미데이터 작업을 하기 전에 BD 데이터를 백업하고 작업하는 것이 좋다(더미 데이터 삽입 작업 중 문제가 생길 경우 원래 상태로 복원하기 위해).
- DB에 데이터가 없는 경우에는 하지 않아도 된다.
CIL에서 명령어를 통해 백업 및 복원
# 백업
mysqldump -u username -p database_name > C:\Users\backup\backup_file.sql
# 복원
mysql -u username -p database_name > C:\Users\backup\backup_file.sql
- 경로 지정 시 경로명과 일치하는 폴더(디렉토리)가 있어야 한다.
- 명령어에 비밀번호를 입력하지 않아도 명령을 실행하면 비밀번호를 입력할 수 있다.
인텔리제이에서 복원
- Database 탭에서 연결된 데이터베이스를 선택한다.
- 오른쪽 클릭 후 SQL Scripts > Run SQL Script 선택
- 복원하고자 하는 backup_file.sql 파일을 찾아서 선택
- 실행 버튼을 눌러 SQL 스크립트를 실행한다.
결론
다음에는 Python 코드를 통해 생성한 더미 데이터를 사용해 Spring boot Application에서 Query 성능 테스트를 진행한 내용을 기록할 예정이다.