개발 초기에는 CRUD API를 검증하거나 UI 화면을 테스트하기 위해 더미 데이터(dummy data)가 필요합니다.
특히 FastAPI + PostgreSQL + Docker 환경에서는 백엔드와 데이터베이스가 별도로 구동되기 때문에
테스트용 초기 데이터를 자동으로 세팅해주는 스크립트가 있으면 훨씬 효율적입니다.
이번 글에서는 다양한 더미 데이터는 생성 방법과 각각의 장단점을 정리했습니다.
🧭 왜 테스트 데이터 초기화가 필요할까?
개발 초기에는 UI나 API 기능 검증을 위해 더미 데이터(dummy data) 가 필수입니다.
하지만 매번 Swagger를 통해 수동으로 API를 호출해서 더미 데이터를 생성하는 것은 비효율적입니다.
개발 초기 더미 데이터 세팅이 중요한 이유:
- 개발 속도 향상
수동으로 데이터를 추가하지 않아도, 스크립트 한 번으로 전체 테스트 환경을 초기화할 수 있습니다. - 반복 가능한 테스트 환경 제공
모든 팀원이 동일한 초기 데이터를 기반으로 개발 및 테스트를 진행할 수 있습니다. - API 안정성 검증
데이터가 있는 상태와 없는 상태 모두에서 API의 안정성을 검증할 수 있습니다. - 운영 데이터 오염 방지
테스트용 DB나 로컬 환경에서만 데이터를 세팅하므로, 운영 환경에 영향을 주지 않습니다.
더미 데이터(dummy data)란?
더미 데이터(Dummy Data) 란 테스트 또는 개발 단계에서 시스템 동작을 검증하기 위해 임시로 사용하는 데이터입니다.
실제 운영 데이터와는 무관하지만, 실제 데이터 구조와 유사하게 구성되어야 의미 있는 테스트가 가능합니다.
🧩 더미 데이터 생성 방법 3가지
1️⃣ 로직 기반으로 자동 생성하기 (Python 스크립트 방식)
가장 효율적이고 자동화된 방법은 FastAPI 백엔드 로직을 이용해 데이터를 자동으로 생성하는 스크립트를 작성하는 것입니다.
아래 예시는 자산 앱 프로젝트의 데이터초기화 스크립트의 일부 입니다.
# reset_data.py
import requests
from db import reset_db
BASE_URL = "http://localhost:8000"
def safe_get_json(url):
try:
response = requests.get(url)
response.raise_for_status()
print(f"GET {url} 성공: {response.status_code}")
return response.json()
except Exception as e:
print(f"GET {url} 실패: {e}")
return []
def safe_post_json(url, data):
try:
resp = requests.post(url, json=data)
resp.raise_for_status()
print(f"POST {url} 성공: {resp.status_code}, 데이터: {data}")
return resp.json()
except Exception as e:
print(f"POST {url} 실패: {e}, 데이터: {data}")
return None
def safe_delete(url):
try:
resp = requests.delete(url)
resp.raise_for_status()
print(f"DELETE {url} 성공: {resp.status_code}")
except Exception as e:
print(f"DELETE {url} 실패: {e}")
print("데이터베이스 초기화 중...")
reset_db()
print("데이터베이스 초기화 완료.")
# 기존 데이터 삭제
for asset in safe_get_json(f"{BASE_URL}/assets/"):
safe_delete(f"{BASE_URL}/assets/{asset['id']}")
for portfolio in safe_get_json(f"{BASE_URL}/portfolios/"):
safe_delete(f"{BASE_URL}/portfolios/{portfolio['id']}")
for user in safe_get_json(f"{BASE_URL}/users/"):
safe_delete(f"{BASE_URL}/users/{user['id']}")
# 테스트 사용자 생성
users = [
{"email": "user1@example.com", "nickname": "User1"},
{"email": "user2@example.com", "nickname": "User2"},
{"email": "user3@example.com", "nickname": "User3"}
]
user_ids = []
for user in users:
res = safe_post_json(f"{BASE_URL}/users/", user)
if res:
user_ids.append(res["user"]["id"])
# 테스트 포트폴리오 생성
portfolio_names = ["테스트포트폴리오1", "테스트포트폴리오2", "테스트포트폴리오3"]
portfolio_ids = []
for i, name in enumerate(portfolio_names):
data = {"name": name, "user_id": user_ids[i]}
res = safe_post_json(f"{BASE_URL}/portfolios/", data=data)
if res:
portfolio_ids.append(res["id"])
# 테스트 자산 생성
assets_data = [
{"name": "현금", "category": "현금", "amount": 100000, "description": "테스트 자산1", "portfolio_id": portfolio_ids[0], "average_price": 1000},
{"name": "주식", "category": "주식", "amount": 500000, "description": "테스트 자산2", "portfolio_id": portfolio_ids[1], "average_price": 5000},
{"name": "예금", "category": "예금", "amount": 300000, "description": "테스트 자산3", "portfolio_id": portfolio_ids[2], "average_price": 3000},
]
for asset in assets_data:
safe_post_json(f"{BASE_URL}/assets/", asset)
print("초기화 및 테스트 데이터 생성 완료.")
이 스크립트를 실행하면 데이터베이스 초기화 → 기존 데이터 삭제 → 테스트 데이터 자동 생성이 순서대로 실행됩니다.
✅ 장점
- 재현 가능한 테스트 환경 제공
- API 로직을 통해 실제 서버와 동일하게 동작
- 반복 실행으로 테스트 데이터 초기화 가능
⚠️ 단점
- FastAPI 서버가 실행 중이어야 함
- API 호출 시 응답 속도에 따라 실행 시간이 다소 길어질 수 있음
2️⃣ SQL 쿼리로 직접 INSERT 하기
데이터를 빠르게 넣고 싶다면 SQL 스크립트를 직접 실행하는 것도 좋은 방법입니다.
INSERT INTO users (email, nickname) VALUES
('user1@example.com', 'User1'),
('user2@example.com', 'User2');
INSERT INTO portfolios (name, user_id) VALUES
('포트폴리오A', 1),
('포트폴리오B', 2);
INSERT INTO assets (name, category, amount, portfolio_id)
VALUES ('현금', '현금', 100000, 1);
이 방법은 DB 관리툴(예: DBeaver, TablePlus, pgAdmin) 을 통해 직접 실행할 수도 있고, Docker 환경에서는 다음 명령으로도 가능합니다.
docker exec -it postgres_container psql -U postgres -d mydb -f /app/init.sql
✅ 장점
- 가장 빠르고 간단
- API 호출 없이 DB에 직접 삽입 가능
- 서버가 없어도 데이터 생성 가능
⚠️ 단점
- 비즈니스 로직을 거치지 않기 때문에 데이터 무결성 검증 불가
- 스키마 변경 시 SQL 스크립트를 계속 수정해야 함
3️⃣ Faker 라이브러리로 무작위 데이터 생성
테스트 데이터를 대량으로 만들어야 한다면, Python의 Faker 패키지를 이용할 수 있습니다.
from faker import Faker
from app.db import SessionLocal, User
fake = Faker('ko_KR')
db = SessionLocal()
for _ in range(10):
user = User(email=fake.email(), nickname=fake.name())
db.add(user)
db.commit()
✅ 장점
- 무작위로 다양한 데이터 생성 가능
- 실제 환경에 가까운 테스트 시 유용
⚠️ 단점
- 랜덤 데이터로 인해 특정 시나리오 테스트가 어려움
- 일관성 있는 테스트 결과 확보가 어렵다
💡 더미 데이터 관리 팁
.env파일에서 테스트 DB와 운영 DB를 명확히 분리- 데이터 초기화 스크립트는
backend/scripts/같은 폴더로 관리 - CI/CD 파이프라인에서 테스트 환경 구축 시 자동으로 실행되도록 설정
- FastAPI의
/docs또는/redoc으로 API 스펙을 확인하며 실제 호출 테스트
🔎 결론
개발 초기에는 “기능이 잘 작동하는가”보다 “테스트 가능한 환경을 얼마나 빨리 세팅하느냐”가 훨씬 중요합니다. 더미 데이터(dummy data)는 이 과정을 단순화시켜 개발 속도를 크게 높여줍니다.
프로젝트에 맞는 방식 — 예를 들어 API 기반 자동 생성, SQL 직접 삽입, Faker 랜덤 데이터 — 을 조합하면
테스트 환경을 유연하게 유지하면서도 안정적인 개발 프로세스를 구축할 수 있습니다.