DF-Stream · 통합 보고서
⚑ Phase 1 D-5
⚠ 긴급
Phase 1 마감 2026-04-20 — Stream Wizard API·UI, Streams Manager UI 미완성. 의사결정 이슈 #1~3 해결 필요.
D-5잔여 일수
2026.04.15 기준

DataForge DF-Stream
외부 제조업 Edge 서비스

OPC-UA 실시간 수집 · MES/ERP/L2 운영 데이터 파이프라인 · 통합 인증(OIDC) · 이메일 알림을 통합 제공하는 설치형 패키지 플랫폼. 2월 이후 아키텍처와 요구사항이 대폭 확장되었으며, 현재 Phase 1 개발이 진행 중입니다.

~74%
전체 진행률
100%
BSM v1.0
D-5
Phase 1 마감
v1.7
요구사항
v1.0
아키텍처
15
미결 의사결정
01

Phase 1 현황 — 마감 D-5 (2026-04-20)

✓ 완료 — BSM v1.0 Cycle (2026-03-31)
Benthos Stream Manager v1.0 — 18/18 Tasks 100%
Payload CMS 3.69 + Next.js 15.4 + React 19 + node-opcua. Stream Wizard 4단계, Pipeline Editor, KEP/Kafka/SR Manager 전체 완성.
100%

D-5 내 완료 필수 항목

Stream API
deploy / start / stop / delete 엔드포인트
미완
Stream Wizard UI
4단계 폼 (INPUT→OUTPUT→PIPELINE→DEPLOY)
미완
Streams Manager UI
목록 / 상세 / 로그 / 시작·중지
미완
Phase 2 선행 Docker Compose
Phase 2-A 착수 전 로컬 환경 구성
예정

StreamsService.deploy() — 핵심 배포 9단계

// apps/api/src/streams/streams.service.ts
1. StreamLogs: createLog('deploy', 'in_progress')
2. DfPackage: getOpcServerByUid → server + endpoint
3. DfPackage: getOpcServerNodes → node 배열
4. DfPackage: getKafkaClusterByUid → cluster + broker
5. DfPackage: getKafkaClusterTopics → topic
6. BenthosConfigGenerator.generate(params)
└─ buildInput / buildKafkaOutput / buildPipeline
7. Stream UPSERT (status: 'deploying')
8. POST {benthos}/streams/:id (30s timeout)
9a. SUCCESS → status='active'
9b. FAILURE → status='error'

Phase 1 내 해결 의사결정 (#1~3)

#1Kafka 토픽 생성REST Proxy 직접 생성 vs 기존 토픽 재사용
#2node_group 구조계층 유지 vs 단순화
#3스트림 헬스체크Cron 폴링 vs 배포 상태 기반
02

프로젝트 개요

기본 정보

프로젝트명DataForge Package (DF-Stream)
기준 날짜2026-04-15
요구사항v1.7 (2026-03-11 확정)
아키텍처v1.0 (2026-03-11 확정)
BSM v1.0✓ 완료 (2026-03-31)
Phase 13/11 ~ 4/20 (잔여 5일)
Phase 2~34/21 ~ 5/31
Main / Sub@유병재 / @김성만
프로젝트 관리Plane.so (workspace: df)

4개 서비스 구성

apps/api
Port 3001
NestJS API
스트림·연결·OPC-UA·운영 파이프라인 관리
apps/auth
Port 3002
NestJS Auth 신규
OIDC Provider + Multi Auth (4종) + RBAC
apps/web
Port 3000
Next.js Web
Stream Wizard / 관리 UI / 대시보드
Listmonk
Port 9000
이메일 서비스 신규
Self-hosted 트랜잭션 메일 + Subscriber Sync

사용자 역할

현장 운영자
Stream Wizard로 수집 파이프라인 구성·배포. 스트림 시작·중지·삭제.
관리자 (Admin)
사용자·권한·연결 관리. 시스템 모니터링. 로그 조회.
데이터 엔지니어
Bloblang 파이프라인 작성·테스트. Avro Schema 관리. DDL 파서 활용.
데이터 분석가
Trino 데이터 조회. 데이터 카탈로그 열람 (Phase 3).
03

2월 이후 주요 변경 이력

v1.0 → 현재까지 확정된 아키텍처·요구사항 변경
인증 시스템
KeycloakZitadeloidc-providerapps/auth 독립 NestJS 앱
nest-oidc-provider 기반 OIDC Provider를 apps/auth (Port 3002)로 완전 분리. Multi Auth Strategy 4종 지원 확정 (Local / Google OIDC / LDAP·AD / 외부 OIDC IdP). apps/api는 JWT Bearer 검증에 집중, apps/auth는 OIDC 발급·RBAC 전담.
수집 엔진
NiFiBenthos-UMH (실운영 중)
NiFi 폐기. OPC-UA 네이티브 지원 + Virtual Tag 생성 + 경량화된 Benthos-UMH 채택. 소형압연 11디바이스 892태그 실수집 완료, 일 2,500만 건 검증.
Kafka 운영 모드
ZooKeeperKRaft 단독 운영 (Kafka 4.x)
ZooKeeper 의존성 완전 제거. KRaft 3 Broker HA 구성 검증 완료.
수집 관리 GUI
DF-Stream 내 통합 예정별도 Payload CMS 기반 BSM 완성
Benthos Stream Manager v1.0을 DF-Stream과 독립적으로 먼저 구현·완료(3/31). Stream Wizard 4단계, Pipeline Editor, KEP Tag Browser, Kafka/SR Manager 전체 포함. DF-Stream과의 최종 통합 여부는 추후 결정.
DB 구조
단일 DBdf_package (READ-ONLY) + df_app (READ/WRITE)
Kubernetes desired state → reconcile 패턴 적용. df_package는 Ansible/Terraform 전용 마스터 데이터, df_app는 운영 데이터. Cross-Schema FK 없이 uid loose reference로 관리.
컨테이너 오케스트레이션
Docker Swarm 검토K3s (Kubernetes) 채택
K3s + Headlamp 대시보드 구성 완료. PostgreSQL 17.6 + Pgpool 4.6.3 클러스터, TimescaleDB SSD 이관, Kafka KRaft 운영 환경 구축 완료.
운영 데이터 파이프라인
Python/FastAPI 별도 서비스NestJS apps/api 통합 (v1.6)
MES/ERP/L2 시스템의 DDL을 입력받아 6단계 파이프라인(DDL→PostgreSQL 테이블→Avro Schema→SR→Kafka Connect→Benthos→TimescaleDB)을 자동 생성. Oracle/MySQL/PostgreSQL DDL 파서 포함. NestJS DI·인증·에러 핸들링 재사용.
이메일 서비스
Listmonk Self-hosted 추가 (v1.7)
Self-hosted 트랜잭션 이메일 서버(Go). DF-Stream users ↔ Listmonk Subscriber 실시간/Cron 동기화. apps/auth(가입·잠금 알림) + apps/api(파이프라인 상태 알림) 양쪽에서 연동. Go 템플릿 기반 {{.Tx.Data.*}} 변수 사용.
04

시스템 아키텍처 v1.0 확정

기술 스택

Backend: NestJS 11 TypeORM PostgreSQL 17
Frontend: Next.js 16 React 19 shadcn/ui 90+ Tailwind
폼/쿼리: RHF + Zod TanStack Query/Table
차트: ECharts Recharts
수집: Benthos-UMH OPC-UA + Avro 직렬화
메시징: Kafka KRaft 4.x 3+ Broker + Schema Registry
캐싱: Valkey (Redis 호환)
모노레포: pnpm workspace + Turborepo
인증: apps/auth 독립 NestJS + nest-oidc-provider
이메일: Listmonk Self-hosted (Docker Compose)

전체 데이터 흐름

PLC / 설비
↓ OPC-UA · Basic256Sha256 (opc.tcp://)
KEPServerEX Port 4840
↓ HTTP API
Benthos-UMH Port 4195 · Avro
↓ → Schema Registry (Avro 검증)
Kafka KRaft 3+ Broker · snappy 압축
↓ Kafka Connect JDBC Sink (UPSERT)
TimescaleDB 일 2,500만 건 · SSD

MES / ERP / L2 ↓ DDL → Operational Pipeline
DDL→Table→Avro→SR→Connect→Benthos→DB

DB 이중 DataSource (Desired State → Reconcile)

df_package
READ ONLY — 마스터 데이터
OPC 서버·노드, Kafka 클러스터·토픽, 공장·설비·기기. Ansible/Terraform 전용 관리.
df_app
READ/WRITE — 운영 데이터
users, streams, connections, RBAC, OIDC sessions, stream_logs. Cross-Schema = uid loose reference.

앱 간 의존 관계

apps/webapps/auth (로그인·OIDC·토큰) apps/webapps/api (Bearer JWT · 데이터 API) apps/authapps/api (JWT introspection) apps/auth → Listmonk (가입·잠금 알림) apps/api → Listmonk (파이프라인 상태 알림) apps/api → Benthos (스트림 배포 HTTP API) apps/api → Kafka/SR (토픽·스키마 관리) apps/api → KafkaConn (커넥터 CRUD) apps/api → KEPServer (OPC-UA 브라우징)
05

개발 정책 확정

OPC-UA 수집 Class

Class A실시간/라인100ms ~ 500ms
Class B배치/설비1s ~ 5s
Class C집계/운영10s ~ 1min
Basic256Sha256 / Sign & Encrypt 적용
Service Account Authentication
노드 경로: [Site].[Area].[Line].[AssetID]

Kafka 클러스터 정책

KRaft 3 Broker (HA, Split-brain 방지)
Auto Create Topics Disabled
Retention: 7일 / 50GB (파티션당)
RF: 3 · Min ISR: 2 · acks=all
압축: snappy 기본 / gzip·lz4·zstd 선택
Schema Registry: BACKWARD_TRANSITIVE
Kafka Connect UPSERT (PK: asset_id, ts)
DLQ: errors.tolerance=all, {topic}.error

보안 정책

JWT RS256 — apps/auth 서명 → JWKS 공개
Access Token 15분 / Refresh Token 7일
RBAC: admin > operator > viewer
로그인 실패 5회 → 계정 잠금
Multi Auth 4종: Local / Google OIDC / LDAP·AD / 외부 OIDC IdP
AUTH_ALLOWED_DOMAINS 도메인 화이트리스트
로그 민감정보 마스킹 (password·token·secret)

네이밍 컨벤션

Kafka Topic css.{bp}-{factory}.{source}-{dataset}
Stream ID = Kafka Topic (동일)
Connector {topic}.sink
Consumer Group {topic}.timescale
DLQ Topic {topic}.error
Avro Subject css.{bp}_{factory}.{source}_{dataset}
DB Schema {bp}_{factory} → changwon_fp
DB Table {source}_{dataset}_tt

DB 테이블 접미어 규칙

_mtMaster Table정적 마스터 데이터
_ctCode Table코드성 데이터
_rtRelation TableN:M 관계
_htHistory Table이력 데이터
_ttTarget Table수집 결과 저장
v_View조회용 뷰
06

현재 구현 현황

요구사항 정의 v1.7 확정
2월 v1.0 기준 7단계 업데이트 · ODP·Listmonk·Multi Auth 추가
90%
AUTH: JWT 로그인·갱신 (P0 구현 완료)
USER: CRUD, bcrypt 암호화 (P0)
SW: Stream Wizard 4단계 정의 (P0)
STR: Streams Manager CRUD (P0)
CONN: 연결 CRUD + 헬스체크 (P0)
OPC: 서버·노드·브라우징 (P0)
apps/auth 독립 분리 · Multi Auth 4종 (v1.5)
Operational Data Pipeline 6단계 (v1.6)
Listmonk 이메일 + Subscriber Sync (v1.7)
P1: RBAC user_roles 연동
P2: organizations 테이블 · RBAC 전체
P2: OIDC Provider 구현 (AUTH-006~012)
P2: DDL Parser · Auto-Generator 구현
P2: Listmonk 연동 구현
P3: 데이터 카탈로그 · Trino 접근 로그
아키텍처 설계 v1.0 확정
2026-03-11 공식 릴리즈 · 14 pages
88%
전체 시스템 다이어그램 완성
NestJS 모듈 구조 12개 확정
StreamsService.deploy() 9단계 플로우
df_package 25+ 테이블 설계
df_app Phase 1/2/3 테이블 설계
API 엔드포인트 전체 (/docs Swagger)
보안 아키텍처 (JWT→RolesGuard→Pipe)
apps/auth 분리 아키텍처
ODP TypeORM 엔티티 정의 미완
인프라 구성
K3s Kubernetes · 39개 파드 목표
65%
Kafka KRaft 4.2 (ZooKeeper 완전 제거)
PostgreSQL 17.6 + Pgpool 4.6.3 클러스터
TimescaleDB SSD 이관 · 2,500만/일 검증
K3s + Headlamp · NFS · Docker Registry
Kafka-UI · Kafka-Connect 연동
Fluentd 구축 (진행 중)
GitLab Standalone CI/CD (테스트 중)
ArgoCD + Image Updater · Kaniko · Helm
Listmonk Docker Compose (Phase 2-D)
수집 서비스 — Benthos Stream Manager
BSM v1.0 완료 · 소형압연 892태그 · 일 2,500만 건 실운영 중
82%
BSM v1.0 — 18/18 Tasks 완료 (2026-03-31)
Stream Wizard 4단계 완성
Pipeline Editor (Bloblang 작성·테스트)
KEP Tag Browser · Kafka Manager · SR Manager
소형압연 11 디바이스 · 892 태그 실수집
일 약 2,500만 건 · InfluxDB 대비 동등 성능
고부하 / 장기 안정성 테스트
Virtual Tag 기능 활용 계획 검토
BSM ↔ DF-Stream 통합 여부 의사결정
DF-Stream 서비스 개발 — Phase 1 D-5
NestJS API + Next.js Web · Phase 1 핵심 deliverable 개발 중
45%
구현 완료
API 기본 구조 (NestJS 12모듈, TypeORM 2 DataSource)
Web 기본 구조 (Next.js App Router, shadcn/ui 90+)
MSW v2 mock handler 62개
기본 페이지 구조 (streams·node-browser·settings 등)
D-5 완료 필수
Stream API — deploy / start / stop / delete
Stream Wizard UI — 4단계 폼
Streams Manager UI — 목록·상세·로그
Phase 2~3 (backlog)
Phase 2-A: apps/auth + Google OIDC
Phase 2-B: LDAP·AD · Local · 외부 IdP
Phase 2-C: Operational Data Pipeline
Phase 2-D: Listmonk 이메일 연동
07

전체 진행률 요약

단계 목표 진행률 현재 상태
기안 목적·목표·전략·일정
95%
완료조건 세부 기준 미확정
요구사항 기능/비기능 정의
90%
P2/P3 RBAC·OIDC 구현 미완
아키텍처 기술 스택·구조 확정
88%
ODP TypeORM 엔티티 미완
인프라 K8s 서비스 구축
65%
Fluentd·GitLab CI/CD·ArgoCD 미완
수집 서비스 BSM + OPC→Kafka→DB
82%
고부하 안정화·통합 의사결정 미완
DF-Stream ⚠ API + Web 고객 서비스
45%
Phase 1 Stream Wizard·Manager D-5 미완
전체 DataForge Package
~74%
Phase 1 완료 후 Phase 2~3 착수 예정
08

Phase 일정

▶ Phase 1 (진행 중)
수집 파이프라인
03/11 ~ 04/20
✓ BSM v1.0 완료
✓ MSW mock 62개
✓ 기본 앱 구조
⚠ Stream API
⚠ Stream Wizard UI
⚠ Streams Manager
Phase 2-A
apps/auth + Google
04/21~
• apps/auth NestJS 분리
• OIDC Provider 구현
• Google OIDC 연동
• RBAC 기본 구현
Phase 2-B
Multi Auth
04/21 ~ 05/20
• LDAP / Active Directory
• Local 인증
• 외부 OIDC IdP
• Trino RBAC 연동
Phase 2-C
Operational Pipeline
04/21 ~ 05/20
• DDL Parser (Oracle/MySQL/PG)
• 6단계 Auto-Generator
• Deploy/Undeploy/Upgrade
• df_package DDL 확장
Phase 2-D
Listmonk 이메일
04/21 ~ 05/20
• Docker Compose 구성
• NestJS HttpModule
• Subscriber Sync Cron
• 트랜잭션 메일 템플릿
Phase 3
데이터 카탈로그
05/21 ~ 05/31
• catalog_items
• data_lineage
• Trino 쿼리·접근 로그
• 품질 규칙·보존 정책

Plane.so 워크아이템 현황

Completed
MSW v2 mock handler 62개
Next.js 기본 앱 구조 / 기본 UI
BSM v1.0 Cycle — 18/18 Tasks (03-01 ~ 03-31)
Planned / Backlog
스트림 CRUD / start/stop/delete — planned
Stream Wizard & Manager 4단계 UI — planned
Phase 2 Docker Compose / CI-CD — planned
OIDC Provider & RBAC — backlog
Operational Data Pipeline — backlog
Listmonk 이메일 연동 — backlog
데이터 카탈로그 / Trino — backlog
09

핵심 의사결정 미완 항목 15건

요구사항 §8 오픈 이슈. 붉은 행(#1~3)은 Phase 1 내 필수 해결, 나머지는 해당 Phase 착수 전 결정 필요.

# 이슈 선택지 연관 해결 시기
#1 Kafka 토픽 생성 방식 REST Proxy 직접 생성 vs 기존 토픽 재사용 SW2-004 D-5
#2 node_group 계층 구조 계층 유지 vs 단순화 SW1-006 D-5
#3 스트림 헬스체크 방식 Cron 주기 폴링 vs 배포 상태 기반 NFR-REL-002 D-5
#4 OIDC PostgreSQL Adapter 세션/토큰 저장 테이블 구현 방식 AUTH-006,008 Phase 2-A
#5 df_app 테이블 생성 주체 NestJS 자동 생성 vs 수동 DDL 관리 아키텍처 Phase 2-A
#6 Trino RBAC 구현 방식 JWT claims → WHERE 필터 vs OPA/File-based RBAC-005 Phase 2-B
#7 organizations 테이블 설계 business_place 컬럼 → 별도 테이블 마이그레이션 ORG-001 Phase 2-A
#8 OIDC 로그인 UI 구현 방식 oidc-provider 내장 UI vs Next.js 커스텀 AUTH-006 Phase 2-A
#9 LDAP 신규 사용자 프로비저닝 최초 로그인 시 자동 생성 + DEFAULT_ROLE 설정 AUTH-010 Phase 2-B
#10 인증 전환 시 password_hash Local → LDAP/Google 전환 시 NULL 처리 정책 USER-008 Phase 2-B
#11 DDL Parser Oracle 복합 PK 복합 PK + 인라인 인덱스 처리 방식 ODP-001~006 Phase 2-C
#12 Target DB DataSource 설계 TimescaleDB: df_package 포함 vs 별도 DataSource ODP-011 Phase 2-C
#13 Python FastAPI 통합 방식 NestJS 통합 확정 — 상세 구조 결정 필요 Phase 2-C Phase 2-C
#14 mail 패키지 구조 apps/api·auth 각자 import vs packages/mail 공유 MAIL-030 Phase 2-D
#15 알림 구독 정책 역할 기반 기본값 vs 파이프라인별 opt-in MAIL 연관 Phase 2-D
10

미완 항목 전체

🔴 Phase 1 마감 전 필수 (D-5)
Stream API 완성
StreamsService.deploy() 9단계 + start/stop/delete
Stream Wizard UI 완성
4단계 폼 (INPUT→OUTPUT→PIPELINE→DEPLOY)
Streams Manager UI 완성
목록·상세·로그·시작/중지 뷰
의사결정 #1~3 해결
Kafka 토픽 생성 방식 / node_group / 헬스체크
🟡 Phase 2 착수 전 (4/21~5/20)
apps/auth NestJS 앱 구성
OIDC Provider + RS256 JWT + PostgreSQL Adapter
Google OIDC / LDAP 인증 구현
Phase 2-A/B · Multi Auth Strategy 4종
Operational Data Pipeline 구현
DDL Parser + 6단계 Auto-Generator (Phase 2-C)
Listmonk 이메일 서비스 연동
Docker Compose + Subscriber Sync Cron (Phase 2-D)
Fluentd 구축 완료
로그 수집 파이프라인
GitLab CI/CD 파이프라인
Kaniko + Harbor + ArgoCD + Image Updater
Phase 2 선행 Docker Compose
Phase 2-A 착수 전 로컬 개발 환경
RBAC + Next.js 페이지 권한 제어
역할 기반 라우팅 가드 (RBAC-006)
🟣 Phase 3 (5/21~5/31)
데이터 카탈로그 구현
catalog_items, data_lineage, quality_rules
Trino 쿼리 연동 + 접근 로그
data_access_logs, retention_policies
통합 테스트 수행
DataForge 서비스 완료 조건 달성
고부하 / 장기 안정성 테스트
수집 서비스 · 스트림 배포 부하 검증
⚪ 아키텍처 의사결정 (시기 미정)
BSM ↔ DF-Stream 통합 여부
Benthos Stream Manager 병합 또는 분리 운영 결정
OIDC Interaction UI 구현 방식
oidc-provider 내장 UI vs Next.js 커스텀 로그인 UI
Target DB DataSource 설계
TimescaleDB: df_package 포함 vs 별도 DataSource