이 프로젝트는 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 권한 에러 등)을 어떻게 파이썬 코드로 깔끔하게 해결했는지에 대한 생생한 여정이 담겨있습니다.
| 도메인 (Category) | 테이블 (Table Name) | 예상 Row 개수 | 설명 (Description) |
|---|---|---|---|
| Core Commerce | categories |
53 | 상품 카테고리 (계층형 Self-Join 구조) |
| Core Commerce | suppliers |
60 | 상품 공급업체 |
| Core Commerce | products |
280 | 핵심 상품 마스터 데이터 |
| Core Commerce | product_images |
686 | 상품별 다중 이미지 |
| Core Commerce | product_prices |
712 | 상품 가격 변동 이력 |
| Core Commerce | customers |
5,230 | 고객 기본 정보 |
| Core Commerce | customer_addresses |
7,313 | 고객 배송지 주소 |
| Core Commerce | staff |
5 | 내부 직원 정보 |
| Core Commerce | orders |
34,908 | 고객 주문 마스터 |
| Core Commerce | order_items |
73,128 | 주문별 상세 상품 내역 |
| Core Commerce | payments |
34,908 | 주문 결제 내역 |
| Core Commerce | shipping |
34,908 | 배송 추적 정보 |
| Engagement | reviews |
15,000 | 상품 리뷰 |
| Engagement | wishlists |
20,000 | 고객 위시리스트 |
| Engagement | carts |
10,000 | 쇼핑카트 (Active/Abandoned) |
| Engagement | cart_items |
25,030 | 장바구니 담긴 상품 내역 |
| Engagement | complaints |
1,000 | 고객 CS 문의/컴플레인 |
| Engagement | returns |
2,000 | 상품 반품 요청 내역 |
| Engagement | product_qna |
5,000 | 상품별 Q&A |
| Analytics | point_transactions |
45,000 | 포인트 적립/사용/소멸 로그 |
| Analytics | product_views |
100,000 | 상품 클릭/조회 로그 |
| Analytics | promotions |
129 | 기획전 및 할인 행사 |
| Analytics | promotion_products |
439 | 기획전 대상 상품 매핑 |
| Analytics | customer_grade_history |
12,000 | 고객 등급 변동 이력 (SCD Type 2) |
| Analytics | calendar |
3,649 | 일자별 시계열 분석을 위한 달력 차원 테이블 |
| Analytics | tags |
46 | 상품 검색용 태그 |
| Analytics | product_tags |
564 | 상품-태그 매핑 |
| Analytics | inventory_transactions |
8,000 | 재고 입/출고/조정 로그 |
| Analytics | coupons |
20 | 할인 쿠폰 마스터 |
| Analytics | coupon_usage |
5,000 | 쿠폰 발급 및 사용 내역 |