이 프로젝트는 Oracle 데이터베이스 성능 튜닝(SQLP/SQLD) 및 아키텍처 학습을 위해 수십만 건의 현실적인 E-Commerce 데이터를 초고속으로 생성하고 오라클에 적재해 주는 파이썬 기반 데이터 파이프라인입니다.
메모리 집약적인 INSERT 구문 대신 Python Generator 기반의 Streaming 기술과 Oracle SQL*Loader를 활용하여 시스템 자원을 거의 쓰지 않고 30개의 복잡한 관계형 테이블을 단 몇 초 만에 세팅해 줍니다.
이 프로젝트는 크게 3가지 도메인(핵심 커머스, 고객 참여, 분석/리워드)으로 나뉘며 총 약 484,798건의 데이터가 생성됩니다. 실무와 유사한 SQL 튜닝 실습(계층형 질의, 조인, 선분이력 등)을 위해 30개의 테이블이 아래와 같이 유기적으로 설계되어 있습니다.
erDiagram
%% Core Commerce
CATEGORIES ||--o{ CATEGORIES : parent_id
CATEGORIES ||--o{ PRODUCTS : category_id
SUPPLIERS ||--o{ PRODUCTS : supplier_id
PRODUCTS ||--o{ PRODUCT_IMAGES : product_id
PRODUCTS ||--o{ PRODUCT_PRICES : product_id
CUSTOMERS ||--o{ CUSTOMER_ADDRESSES : customer_id
STAFF ||--o{ STAFF : manager_id
CUSTOMERS ||--o{ ORDERS : customer_id
ORDERS ||--o{ ORDER_ITEMS : order_id
PRODUCTS ||--o{ ORDER_ITEMS : product_id
ORDERS ||--|{ PAYMENTS : order_id
ORDERS ||--|{ SHIPPING : order_id
CUSTOMER_ADDRESSES ||--o{ SHIPPING : address_id
%% Engagement
PRODUCTS ||--o{ REVIEWS : product_id
CUSTOMERS ||--o{ REVIEWS : customer_id
CUSTOMERS ||--o{ WISHLISTS : customer_id
PRODUCTS ||--o{ WISHLISTS : product_id
CUSTOMERS ||--o{ CARTS : customer_id
CARTS ||--o{ CART_ITEMS : cart_id
PRODUCTS ||--o{ CART_ITEMS : product_id
CUSTOMERS ||--o{ COMPLAINTS : customer_id
ORDERS ||--o{ COMPLAINTS : order_id
COMPLAINTS ||--o{ RETURNS : complaint_id
ORDER_ITEMS ||--o{ RETURNS : order_item_id
PRODUCTS ||--o{ PRODUCT_QNA : product_id
CUSTOMERS ||--o{ PRODUCT_QNA : customer_id
PRODUCT_QNA ||--o{ PRODUCT_QNA : parent_qna_id
%% Analytics & Rewards
CUSTOMERS ||--o{ POINT_TRANSACTIONS : customer_id
PRODUCTS ||--o{ PRODUCT_VIEWS : product_id
CUSTOMERS ||--o{ PRODUCT_VIEWS : customer_id
PROMOTIONS ||--o{ PROMOTION_PRODUCTS : promo_id
PRODUCTS ||--o{ PROMOTION_PRODUCTS : product_id
CUSTOMERS ||--o{ CUSTOMER_GRADE_HISTORY : customer_id
TAGS ||--o{ PRODUCT_TAGS : tag_id
PRODUCTS ||--o{ PRODUCT_TAGS : product_id
PRODUCTS ||--o{ INVENTORY_TRANSACTIONS : product_id
COUPONS ||--o{ COUPON_USAGE : coupon_id
CUSTOMERS ||--o{ COUPON_USAGE : customer_id
ORDERS ||--o{ COUPON_USAGE : order_id
- 초고속/저메모리 아키텍처: Python
yield제너레이터를 사용하여 수십만 건의 데이터를 CSV로 스트리밍(Streaming) 생성하므로 메모리 초과(OOM)가 발생하지 않습니다. - SQL*Loader 완벽 연동: 파이썬 스크립트가 오라클 초고속 적재를 위한 제어 파일(
.ctl)과 로드 쉘 스크립트(load_data.sh)를 자동으로 생성합니다. - 현실적인 비즈니스 로직: 단순 무작위 데이터가 아닌 FK 제약조건 준수, 선분이력(SCD Type 2), 비대칭(Skewed) 데이터 등 SQL 튜닝 실습에 최적화된 시나리오가 담겨 있습니다.
- 총 30개 테이블, 25만+ 로우(Rows): 상품 카테고리 계층형 구조, 주문 이력, 분석(포인트, 위시리스트) 등 핵심 이커머스 도메인 구조를 완벽하게 구현했습니다.
1. 데이터 생성 (로컬 PC)
# 의존성 설치 및 메인 파이프라인 구동 (약 20MB의 CSV 데이터가 즉시 생성됨)
uv run src/main.py2. 도커로 파일 복사 및 스키마 설치
# 도커 내부로 파일 복사 및 권한 픽스 (ORA-SQL*Loader-522 방지)
docker cp output/ oracle26ai:/home/oracle/all_schema/output/
docker exec -u 0 oracle26ai chown -R oracle:oinstall /home/oracle/all_schema
# 30개 테이블 DDL 설치 (비밀번호 admin1234 입력)
docker exec -it oracle26ai sqlplus sys/비밀번호 AS SYSDBA
SQL> @/home/oracle/all_schema/output/install.sql3. 데이터 적재 (초고속 SQL*Loader)
docker exec -it oracle26ai bash
cd /home/oracle/all_schema/output/
sh load_data.sh4. 데이터 확인 (DBeaver 등)
-- 모든 데이터가 다 들어갔는지 확인해 보세요!
SELECT table_name, TO_NUMBER(EXTRACTVALUE(XMLTYPE(DBMS_XMLGEN.GETXML('SELECT COUNT(*) c FROM ECOMMERCE.' || table_name)), '/ROWSET/ROW/C')) AS row_count
FROM dba_tables WHERE owner = 'ECOMMERCE' ORDER BY row_count DESC;.
├── src/
│ ├── generators/ # 데이터를 뽑아내는 파이썬 Faker 제너레이터 로직
│ ├── exporters/ # CSV, CTL, SQL 등 결과물을 출력하는 Exporter
│ ├── schema.py # Table, Column 등 DDL 생성을 위한 메타클래스
│ ├── schema_definition.py # 총 30개의 스키마/테이블/제약조건 정의
│ └── main.py # 파이프라인 실행 엔트리포인트 (uv run src/main.py)
├── output/ # 스크립트 실행 시 생성되는 결과물 (SQL, CSV, CTL)
├── docs/ # 아키텍처 설계 및 트러블슈팅 가이드
├── INSTALLATION_GUIDE.md # 🐳 완벽 설치 및 도커 연동 가이드 (필독)
└── pyproject.toml # 의존성 패키지 (Faker) 및 uv 설정
이 프로젝트를 처음 사용하시거나 커스터마이징하고 싶으신 분들은 아래의 문서들을 순서대로 읽어주세요!
본 프로젝트는 Oracle Database 23ai Free 버전을 도커(Docker)로 구동하여 실습하는 것을 권장합니다. 로컬 환경에 오라클이 설치되어 있지 않다면 아래 과정을 먼저 진행해 주세요.
① 오라클 최신 무료 이미지 다운로드 Oracle Container Registry에서 이미지를 가져옵니다.
docker pull container-registry.oracle.com/database/free:latest② 도커 컨테이너 구동 및 비밀번호 설정
오라클 이미지를 실행할 때 -e ORACLE_PWD=원하는비밀번호 옵션을 주어 초기 관리자(SYS, SYSTEM) 및 초기 스키마 비밀번호를 일괄 설정할 수 있습니다. 이 실습에서는 통일성을 위해 admin1234로 셋팅합니다.
docker run -d --name oracle26ai \
-p 1521:1521 \
-e ORACLE_PWD=admin1234 \
container-registry.oracle.com/database/free:latest(주의: 컨테이너가 완전히 부팅되고 데이터베이스가 마운트될 때까지 약 1~2분 정도 소요될 수 있습니다. docker logs -f oracle26ai 명령어로 부팅 완료를 확인하세요.)
③ 관리자(SYSDBA)로 접속 및 PDB 이동
데이터베이스가 준비되면, 터미널에서 아래 명령어로 최고 관리자 계정(sys as sysdba)에 접속합니다.
docker exec -it oracle26ai sqlplus sys/admin1234 as sysdba접속 후 제일 먼저 플러거블 데이터베이스(PDB) 로 세션을 변경해야 합니다. 오라클 12c 이후의 멀티테넌트 구조에서는 기본 컨테이너(CDB$ROOT) 대신 사용자 정의 데이터를 저장할 수 있는 하위 컨테이너(Free 버전의 경우 FREEPDB1)에서 작업해야 하기 때문입니다.
SQL> ALTER SESSION SET CONTAINER = FREEPDB1;
Session altered.여기까지 완료하셨다면 데이터를 적재할 모든 준비가 끝났습니다! 바로 다음 INSTALLATION_GUIDE.md를 따라 파이썬 제너레이터를 실행해 주세요.
가장 중요한 문서입니다. 파이썬 환경 설정(uv)부터 시작해서, 생성된 데이터를 오라클 도커(Docker) 컨테이너 내부로 안전하게 밀어넣는 방법까지 5단계로 매우 친절하게 설명되어 있습니다.
왜 무거운 INSERT 문 대신 CSV와 SQL*Loader 구조를 선택했는지, 파이썬 객체지향 메타클래스 설계는 어떻게 이루어져 있는지에 대한 기술적인 결정 사항을 다룹니다.
개발 및 연동 과정에서 마주쳤던 치명적인 오라클 에러들(ORA-01918 PDB 접속 에러, ORA-01722 줄바꿈 에러, ORA-SQL*Loader 권한 에러 등)을 어떻게 파이썬 코드로 깔끔하게 해결했는지에 대한 생생한 여정이 담겨있습니다.
