Portfolio
PROPOSAL CONCEPT · 제안 기반 설계 프로토타입
PROJECT #288 · DATA MIGRATION
Migration Pipeline Firebase → PostgreSQL

레거시 DB 마이그레이션
+ 관리자 대시보드

Firebase RealtimeDB 에 쌓인 36만 레코드를 PostgreSQL 관계형 구조로 무손실 이관. 다단계 권한 관리자 대시보드와 전체 감사 로그(Audit Log) 시스템을 함께 구축. 위시켓 제안 #154388 기반 설계 프로토타입.

Type
제안 기반 설계
Source
Firebase RealtimeDB
Target
PostgreSQL 15
Volume
362,240 records
Downtime
Zero (dual-write)

Migration Pipeline // ETL overview

Firebase to PostgreSQL migration

Overview // why & how

왜 Firebase 를 떠나는가

Firebase RealtimeDB 는 초기 빠른 개발에 최적이지만, 서비스가 성장할수록 단점 이 드러납니다 — 비관계형 JSON 트리로 인한 복잡한 쿼리 비용, 무한 과금 구조, ACID 미보장, 감사 로그 부재, B2B 권한 관리 어려움.

이 프로젝트는 Firebase 에 쌓인 36만 레코드무손실 · 무중단 으로 PostgreSQL 로 이관하고, 동시에 관계형 스키마 · FK · 인덱스 · 감사 로그를 확보해 쿼리 성능 20배 향상 을 달성합니다.

Zero-Downtime 전략

Dual-Write + 순차 Cutover — 기존 서비스는 Firebase 와 PostgreSQL 양쪽에 동시 기록, ETL 배치로 과거 데이터를 일괄 이관, 양쪽 무결성 검증 후 읽기 트래픽부터 순차적으로 PostgreSQL 로 스위치.

전 과정이 tb_audit_log 에 기록되어 문제 발생 시 즉시 롤백 가능하고, 최종 이관 완료 후 Firebase 는 백업 용도로만 유지.

📦
362K
Records
20x
Query Speed Up
100%
Data Integrity
0
Downtime

Core Modules // pipeline + dashboard

📥

Extractor

Firebase Admin SDK 로 5천 건 단위 batch pull, exponential backoff 재시도, 진행률 표시.

🔄

Transformer

중첩 JSON → 관계형 스키마 매핑, FK 참조 무결성 체크, timestamp 정규화, 타입 변환.

📤

Loader

PG COPY 명령으로 bulk insert, 트랜잭션 단위 롤백 안전, 중복 key ON CONFLICT 처리.

🛡️

권한 관리 대시보드

Role 기반 접근 제어(ADMIN/OPERATOR/VIEWER), 사용자·메뉴·주문·정산 CRUD, 2FA 지원.

📋

Audit Log

모든 CRUD 를 tb_audit_log 에 자동 기록(누가/언제/무엇을), 필터링·내보내기·보존 정책.

📊

실시간 통계

매출/주문/구독 KPI 도넛·막대 차트, 시간대별 트래픽 히트맵, 이상징후 자동 알림.

Sample Transform // Firebase JSON → PostgreSQL rows

// Firebase RealtimeDB (nested JSON) { "orders": { "ord_abc123": { "userId": "usr_xyz789", "items": [ { "productId": "prod_001", "qty": 2 } ], "total": 18000, "createdAt": 1717000000000 } } } // ↓ Transform & Load INSERT INTO tb_order (idx, user_idx, total, reg_date) VALUES (1, 8821, 18000, '2024-05-29 23:46:40'); INSERT INTO tb_order_item (order_idx, product_idx, qty) VALUES (1, 1, 2); INSERT INTO tb_audit_log (action, entity, entity_idx, actor, at) VALUES ('MIGRATION_INSERT', 'order', 1, 'system', NOW());

Tech Stack // data pipeline

📊 📈