Architecture · Redesign

데이터 플랫폼 리뉴얼 설계

Source / Pipeline / Catalog — 세 영역으로 역할을 분리하고, Agent와의 대화로 데이터를 함께 만들어가는 플랫폼

핵심 개념 변화

기존 단일 플로우(스캔→제안→선택→추출)에서 3개 영역으로 재편. 사용자가 원하는 데이터를 Agent와 대화로 직접 만든다.

🗄️
Source
원본 데이터 출처를 등록하는 공간. RDS/DW 연결과 파일 직접 업로드를 통합 관리.
RDS Cloud DW File Upload Dataset
🤖
Pipeline
Agent와 대화로 어떤 데이터를 만들지 함께 설계. 하나의 Pipeline에서 여러 Content Model(CM)을 빌드.
Agent 대화 Content Model Scheduling
📦
Catalog
Production된 최종 결과물이 모이는 공간. Marketplace를 통해 다른 팀의 Catalog도 구독 가능.
결과물 관리 Marketplace 구독
Source
🔌 RDS Connection
PostgreSQL, MySQL, MSSQL…
☁️ Cloud Warehouse
BigQuery, Snowflake, Glue…
📁 File Upload
CSV, Parquet, JSON, Excel
Agent이 Source 전체 참조 ↓
Pipeline
💬 User ↔ Agent 대화
📋 Content Model (CM) 정의
⏰ Dataset 단위 Schedule → Pipeline 트리거
▶️ Production 실행
CM 결과 → Catalog 적재 ↓
Catalog
🗂 내 CM 결과물
🛒 Marketplace 구독 결과물

현재 구조

단일 플로우 기반. Source(DB 연결)를 등록하면 Agent가 자동으로 스캔 → 제안 → 사용자가 선택 → 추출 스케줄 등록.

Step 1
SCAN
에이전트가 DB 스캔
→ S3: scan_result.json
Step 2
PROPOSE
에이전트가 자동 제안
dataset_proposals 생성
Step 3
TRIAL
제안 선택 시 자동
샘플 데이터 추출
Step 4
EXTRACT
스케줄 등록
정기 Cron 추출

도메인 모델

data_sources
idUUID PK
name, vendor, source_typestring
team_idUUID (indexed)
encrypted_credentialstextAES 암호화
scan_status / propose_statusstring?running/completed/failed
dataset_proposals
idUUID PK
source_idUUID FK
name, descriptionstring
statusstringproposed/selected/rejected/schema_drift
detailJSONB?에이전트 메타데이터
trial_statusstring?
dataset_sync_schedules
idUUID PK
proposal_idUUID (unique)proposal당 1개
schedulestringcron 표현식
statusstringactive/paused/deleted
extract_statusstring?
extract_jobs
idUUID PK
querytext실행 SQL
output_formatstring기본값 "csv"
s3_keystring?추출 결과 위치
status, row_count

한계점

AS-IS 문제점
에이전트가 "자동 제안" — 사용자 의도와 맞지 않는 제안이 생성됨
1 Source → N Proposals 구조
스케줄이 proposal에 1:1로 묶여 재활용 어려움
파일 직접 업로드 불가 — DB 연결만 지원
Catalog가 팀 내부 결과물로 고립됨
TO-BE 개선
사용자가 의도를 말하고 Agent가 함께 설계
1 Pipeline = 1 Dataset 참조 (1:1). vendor는 Dataset에서 자동 상속
Pipeline 단위 스케줄 — 실행 시 하위 CM 전체 Production
CSV, Parquet, JSON, Excel 파일 직접 업로드
Marketplace로 팀 간 Catalog 구독 가능

신규 구조

🗄️ Source — 데이터 출처 통합

RDS 연결뿐 아니라 파일 업로드까지 하나의 Source 개념으로 통합. Source 하위에 Dataset 목록을 관리.

타입설명업로드 방식
RDS Connection PostgreSQL, MySQL, MSSQL, Oracle, ClickHouse 암호화된 크리덴셜 등록
Cloud Warehouse BigQuery, Snowflake, Redshift, Glue 암호화된 크리덴셜 등록
File (Dataset) CSV, Parquet, JSON, Excel S3 presigned URL 직접 업로드 (크기 제한 없음)
Source (신규)
id, name, team_id
typeenum"rds" | "warehouse" | "file"
vendorstringRDS/Warehouse만. 하위 Dataset에 자동 상속
encrypted_credentialstext?RDS/Warehouse만
configJSONB타입별 설정
datasets[]relation
Dataset (Source 하위)
id, source_id, team_id
vendorstringSource로부터 자동 상속 (scanned). 파일은 추후 결정
name, description
schemaJSONB컬럼 정보
originenum"scanned" | "uploaded"
schedulestring?cron — 갱신 시 연결된 Pipeline 트리거
s3_keystring?파일 소스 데이터 위치

🤖 Pipeline — Agent가 빌드, 사용자가 피드백

채팅이 아님. Agent가 CM 초안을 자동 생성하면, 사용자가 피드백 텍스트를 입력해 수정을 요청하는 루프. Pipeline은 Source가 아닌 Dataset을 직접 참조하며, 참조하는 Dataset들은 모두 동일 Vendor여야 한다. Vendor는 label처럼 별도 관리된다.

🤖
Pipeline: 고객 분석 데이터
Dataset: orders (PostgreSQL) · vendor 자동 상속
🤖 Agent — CM 초안 생성
orders 테이블 스키마 분석 완료. customer_id / total_amount / order_count 기준 30일 집계 쿼리 생성. 샘플 2,847건 조회됨.
👤 사용자 피드백
날짜 범위 90일로 바꾸고, cancelled 주문 제외해줘
🤖 Agent — 반영 후 재생성
90일 범위 + WHERE status != 'cancelled' 조건 적용. 샘플 7,203건 조회됨.
CM 확정 — 고객별 90일 매출 집계 (취소 제외)
+ 다음 CM 빌드 가능
Pipeline (신규)
id, name, team_id
dataset_idFK → Dataset1:1 참조. vendor는 Dataset에서 자동 상속
content_models[]relation
created_at, updated_at
PipelineFeedback (피드백 이력)
id, pipeline_id, cm_id, team_id
contenttext사용자 피드백 텍스트
created_at
ContentModel (CM) — Pipeline 산출물 단위
id, pipeline_id, team_id
name, description
statusenumbuilding/preview/scheduled/running/paused
transform_definitionJSONBSQL 또는 transform 스펙
output_schemaJSONB확정 컬럼 구조

📦 Catalog — 결과물 집합소

CM이 Production한 결과물이 쌓이는 공간. Marketplace를 통해 다른 팀이 공개한 Catalog를 구독할 수 있다.

CatalogEntry
id, name, team_id
content_model_idUUID FK
schemaJSONB컬럼 정의
latest_s3_keystring
last_produced_atdatetime
is_publicbooleanMarketplace 공개
CatalogSubscription
id, catalog_entry_id
subscriber_team_idUUID
statusenum"active" | "cancelled"
created_at

AS-IS → TO-BE 개념 매핑

AS-ISTO-BE비고
data_sources (RDS)Source › RDS Connection유지
data_sources (Glue/Snowflake)Source › Cloud Warehouse유지
dataset_proposalsSource › DatasetSource 레이어로 이동
dataset_sync_schedulesDataset › scheduleDataset 갱신 시 연결된 Pipeline 자동 트리거
1 Source → N Proposals1 Pipeline = 1 Dataset (1:1). vendor는 Dataset에서 자동 상속
Scan PipelineSource 내 탐색 기능Source 레벨로 내려감
Propose Pipeline (자동)Pipeline 대화사용자 주도 Agent 협업으로 대체
Trial PipelineCM Preview대화 중 미리보기로 통합
Extract PipelineCM 실행 (Cron)CM 결과 → Catalog
catalog_entriesCatalogMarketplace 추가 (추후)
SSE StreamPipeline 대화 SSE대화 실시간 스트리밍

미결 설계 결정 사항

✅ 파일 업로드 스펙 — 결정 완료
S3 presigned URL 직접 업로드 · CSV, Parquet, JSON, Excel 지원 · 파일 크기 제한 없음
Agent tool use 범위
Source 읽기 전용 vs 쓰기도 허용? / 팀 내 전체 Source 접근 vs 사용자가 선택한 Source만?
⏸ Catalog Marketplace 접근 제어 — 추후 논의
공개/비공개, 팀 단위 공유, 구독 승인 방식 등 — 현재 구현 범위 외
⏸ 기존 데이터 마이그레이션 — 구현하면서 결정
data_sources → Source, dataset_proposals → Dataset 변환 전략