AI Data Intelligence · NestJS + Next.js + Gemini

파편화된 데이터를
자연어로 잇다

SAP ERP, Emro SCM, S2C(생산), 창고세이버(물류) — 서로 다른 DB에 흩어진 데이터를 자연어 하나로 조회하고, 관계를 스스로 발견하며, 인사이트를 먼저 제안하는 AI 데이터 인텔리전스 플랫폼. Claude Code와 처음부터 끝까지 함께 만들었습니다.

NestJS Next.js PostgreSQL Prisma ORM Gemini Voyage AI Oracle MySQL Snowflake
핵심 흐름
사용자는 자연어만 입력한다

어떤 DB에, 어떤 테이블이 있는지 아는 것은 AI의 역할입니다. 사용자는 질문만 합니다.

자연어 → 데이터 시각화 파이프라인
💬
사용자
"이번 달 발주 현황 보여줘"
🧠
AI
의도 분류 + DB 선택
🔎
Semantic
GoldenQuery 유사 검색
SQL 생성
스키마 컨텍스트 주입
🛡️
검증
SqlValidator AST 파싱
📊
시각화
차트/테이블 위젯
절대 원칙 (CLAUDE.md에 명문화)
AI가 생성한 SQL은 반드시 SqlValidator를 통과해야 실행된다 — INSERT / UPDATE / DELETE / DROP → 파싱 단계에서 즉시 차단
DB 자격증명은 CryptoService로 암호화, 평문 저장 금지
모든 쿼리에 tenantId 조건 포함 필수 — 다른 테넌트 데이터 접근 불가
모든 쿼리에 LIMIT 10000 자동 추가 — 과도한 데이터 반환 방지
사고의 진화
만들고 싶다 → AI가 어디까지 할 수 있을까?

이 프로젝트는 스펙 문서 하나로 시작했지만, 실제 개발 과정에서 던진 질문들이 방향을 바꾸고 기능을 만들었습니다. 147개의 대화에서 추린 결정적 순간들입니다.

Phase 1 MVP 완성 후 — 처음으로 실제 데이터를 조회해보면서
개발자
프롬프트 쓸 때 DB를 선택하고 써야 해?
맥락상으로 이해해서 DB를 붙을 수 없나?
Claude
가능합니다. IntentClassifier로 요청 의도를 파악하고, 관련 BusinessProcess에 매핑된 DataSource를 자동 선택하는 방식으로 구현할 수 있어요. → Phase B 설계로 이어짐
개발자
예를 들어 판매 데이터를 보고싶어라고 했어.
그러면 여러 DB에서 맞는 정보를 유추해서 조합해서 보이게 할 수 있는 거잖아?
Claude
VirtualJoinService — 각 DB에서 데이터를 가져와 애플리케이션 레이어에서 메모리 조인하는 방식으로 구현 가능합니다. 실제 FK 없이도 동작합니다.
Phase 3 진행 중 — 프로세스 등록 UI를 보면서
개발자
이 시스템의 기본 기조는, 개발자들이 쓰는 게 아니라
개발 아무것도 모르는 사람들이 자연스럽게 생태계에서 사용할 수 있게 하는 게 기본이야.

정밀하게 진행해.
관계 발견 알고리즘 설계 중
개발자
FK가 없을 수도 있어.
데이터들을 보고 유기적으로 연관성을 판단하는 것까지도 가야해.

이해돼?
Claude
Level 1(FK) → Level 2(컬럼명 패턴) → Level 3(실제 데이터 값 겹침 분석).
1,000행 샘플에서 70% 이상 겹치면 관계로 판단합니다. FK 제약이 없는 레거시 ERP에도 동작합니다.
API 요금이 429 Rate Limit에 걸리기 시작한 시점
개발자
예를 들어서 GoldenQuery —
프로젝트에 있는 Mapper들을 분석해서 기존 쿼리들을 가지고 있다가,
프로세스에 맞게 각 쿼리들을 보관한 다음 너가 개선해서 저장시킬 수도 있나?
Claude
가능합니다. MyBatis XML 파일에서 #{param} 패턴 추출 → 컬럼-파라미터 매핑 저장 → GoldenQuery로 전환. 수만 개의 매퍼 파일에서 조직의 비즈니스 지식을 자동 추출합니다.
모든 서비스 코드 분석을 마친 후
개발자
내가 궁극적으로 원하는 건 —
"A라는 오더가 언제 데이터가 생겨서(주문이 와서)
생산 → 출고 → 배송 이런 모든 정보를
이 AI가 흐름을 인지하는 그런 정도를 원하거든?"

가능한가?
Claude
가능합니다. 각 DB의 테이블 간 관계를 BusinessProcess 그래프로 연결하면, 오더 번호 하나로 주문 → 생산계획 → 출고지시 → 배송 테이블을 순서대로 추적할 수 있습니다. Phase F의 크로스 테이블 통합 분석이 그 기반입니다.
개발자 주도 고도화
질문에서 탄생한 기능들

스펙 문서에 없던 기능들. 개발하면서 느낀 불편함, 떠오른 아이디어, 현실적 제약이 새 기능을 만들었습니다.

개발자 아이디어
이미지 업로드 → 위젯 자동 생성
"이런 형태로 매출 데이터 보여줘" — 이미지 첨부 + 텍스트로 동일 형태 위젯 자동 생성
Claude Vision API + 차트 형태 자동 매핑으로 구현
개발자 아이디어
Mapper에서 GoldenQuery 추출
"프로젝트에 있는 Mapper들을 분석해서 기존 쿼리들을 GoldenQuery로 저장시킬 수도 있나?"
수만 개 MyBatis XML → 비즈니스 쿼리 패턴 자동 학습
개발자 아이디어
AI 테마 생성 + 페이지 빌더
"배경색상, 모서리 둥글게, 애플 소프트웨어처럼 — 테마를 AI 입력으로 생성해볼 수 있게"
자연어 테마 → 팝업 미리보기 → AI 페이지 생성
개발자 아이디어
상태코드 자동 번역
"40-1, 43은 무슨 상태인지 어떻게 알 수 있지? KR/EN/CN 언어 설정으로 상태값 치환"
TableMeta 상태코드 의미 → 사용자 언어로 자동 번환
개발자 아이디어
비율 기반 일괄 관계 수락
"퍼센트 정해서, 예를 들면 90% 이상 수락 이런 식으로 일괄 수락할 수 있게 해줄래?"
유사도 임계값 슬라이더 → 조건 충족 관계 일괄 확정
개발자 아이디어
커스텀 위젯 빌더
"AI 요청 분류 — db_widget / embed_widget / custom_widget / new_widget_type으로 구분"
구글챗, Slack, 날씨, 타이머 등 외부 서비스 임베드 지원
버그에서 발견
Bastion 터널 지원
"Bastion이 있는 경우는 어떻게 설정하지? 창고세이버 DB PRD가 터널링이 되어야 하거든"
SSH 터널링 + PEM/Password 선택 입력 UI로 구현
실제 사용 중 발견
AI가 "불명확합니다"로만 응답
모호한 요청에 JSON 대신 대화체로 응답 → 시스템 파싱 오류 발생
Clarification Engine — confidence 계산 + 업무 선택지 제시로 전환
API 비용 문제에서 발견
Claude API 429 Rate Limit
Claude API 429 Rate Limit 에러 발생 — 매 요청마다 전체 스키마를 분석하는 게 문제
GoldenQuery 캐시 + 시맨틱 검색으로 AI 호출 90%+ 절감
사고의 깊이
이 고민이 설계를 바꿨다
첫 번째 전환
"일을 위한 일은
안 된다"
관리자가 직접 테이블을 입력해서 업무 프로세스를 등록해야 했다. 실제로 써보니 아무도 쓰지 않았다. "모든 업무 프로세스를 사용자가 등록해야 할까? 이 프로젝트가 일을 위한 일을 할 수는 없다." → AI가 DB를 분석해서 프로세스를 자동 발견하도록 설계 전환.
수동 등록 → AI 자동 발견 관리자는 확인/거절만
두 번째 전환
"사용자는 테이블을
왜 알아야 하지?"
초기 설계는 사용자가 어떤 DB, 어떤 테이블을 볼지 선택해야 했다. "사용자가 테이블을 왜 알아야 하지? 이것을 처리하는 게 AI여야 하잖아?" → DB 구조를 노출하지 않고 업무 개념으로만 대화하는 Clarification Engine 설계.
DB 구조 완전 추상화 업무 개념으로만 대화
세 번째 전환
"통합 DB가 되면
어떻게 찾을 수 있어?"
지금은 여러 DB에 파편화되어 있지만, 나중에 통합 DB로 이전할 때도 동일한 분류 체계로 찾을 수 있어야 한다. "나중에 통합 DB가 된다 — 이런 건 항상 고려가 되어야 해." → BusinessProcess + BusinessDomain 계층 구조로 데이터 분류 체계 설계.
DB 독립적 분류 체계 통합 DB 이전 시에도 동일 동작
네 번째 전환
"오더 흐름 전체를
AI가 인지해야 해"
여러 서비스(S2C, Sales, Emro SCM, AutoLabeler, Changgo) 코드를 모두 분석한 후. 단순히 데이터를 보여주는 것이 아니라, 오더 하나가 어떤 시스템을 거쳐서 생산→출고→배송까지 이어지는지 AI가 전체 흐름을 인식해야 한다는 비전. → Phase F~I 크로스 테이블 통합 분석 + 그래프 분석 로드맵의 출발점.
보여주는 플랫폼 → 발견하는 플랫폼 비즈니스 흐름 전체 인식
개발 과정
Phase별 점진적 고도화

각 Phase는 독립 배포 가능하며, 이전 Phase의 결과물 위에 쌓이는 구조입니다.

Phase 1~3
MVP 구축
완료
단일 DB 연결 + AI 위젯 생성 + 드래그앤드롭 대시보드. SqlValidator, 멀티 DB 커넥터, SSH 터널링까지.
SqlValidator Oracle/MySQL/PG/Snowflake SSH 터널링 드래그앤드롭 대시보드
Phase A
AI 프로세스 자동 발견
완료
FK가 없는 레거시 ERP에서도 동작하는 3단계 관계 발견. 관리자는 AI가 발견한 프로세스를 확인/거절만 하면 됨. GoldenQuery 시스템 도입.
3단계 관계 발견 GoldenQuery FK/컬럼패턴/값겹침
Phase B
의도 분류 + 시맨틱 검색
완료
IntentClassifier로 요청 의도 파악 → 관련 테이블만 AI에 제공. 유사도 90%+ 쿼리는 AI 호출 없이 즉시 반환. TableMetaSampler로 상태코드 의미 자동 학습.
IntentClassifier Voyage AI 임베딩 TableMetaSampler 코사인 유사도
Phase C
Clarification Engine
완료
모호한 요청에 DB 구조를 노출하지 않고 업무 개념으로 선택지 제시. confidence 임계값별 다른 처리 (바로생성 / 힌트 / 선택지).
confidence 계산 BusinessProcess 선택지 DB 구조 비노출
Phase A~C Enh.
파라미터 쿼리 + 위젯 재교정
진행중
AI가 {{PARAM_NAME}} 플레이스홀더로 SQL 생성 → 위젯에 FilterBar 자동 렌더링. 자연어로 위젯 SQL 수정 + undo 5단계. Mapper 분석으로 레거시 암묵지 추출.
{{PARAM}} 파라미터화 FilterBar 자동생성 위젯 SQL 재교정 Mapper XML 파싱
Phase F~I
AI 학습 고도화
설계완료 · 구현예정
크로스 테이블 통합 분석 → 연관 규칙 마이닝 → 시계열 이상 탐지 → 클러스터링. "보여주는 플랫폼"에서 "발견하는 플랫폼"으로.
크로스 테이블 관계 발견 연관 규칙 마이닝 시계열 + 이상 탐지 클러스터링 그래프 분석
버그 해결 사례
Claude Code와 함께 추적한 버그들

단순한 오류 수정이 아닌, 근본 원인을 함께 분석하고 방어 로직까지 적용했습니다.

사례 1
:param 문법 오류
AI가 크로스 DB 쿼리를 생성할 때 MySQL 준비 구문인 :sku, :item 형태로 SQL을 만들어 실행 오류 발생. 로그를 함께 분석해 근본 원인이 AI 프롬프트 지침 부재임을 파악.
프롬프트 강화 + VirtualJoinService 방어 로직 동시 적용
사례 2
{{PARAM}} 파서 충돌
{{PO_NO}}가 포함된 SQL을 node-sql-parser가 유효하지 않은 SQL로 거부. 파라미터 쿼리 시스템과 SQL 안전성 검증이 충돌하는 상황.
AST 파싱 전 {{PARAM}} → '__param__' 치환 후 파싱하도록 SqlValidator 수정
사례 3
AI가 JSON 대신 대화로 응답
사용자 요청이 모호할 때 AI가 SQL JSON 대신 "요청이 불명확합니다. 어떤 데이터를 원하시나요?" 형태로 응답. 시스템이 JSON을 기대하고 있어 파싱 오류 발생.
프롬프트에 "모호해도 JSON만 반환" 규칙 추가 + 대화체 감지 후 친화적 에러로 변환
데이터 활용
AI가 데이터를 스스로 이해하는 방법

파편화된 레거시 ERP 데이터를 AI가 스스로 이해하는 기반을 만드는 것이 이 프로젝트의 핵심입니다.

01
MyBatis Mapper 분석
레거시 ERP의 수만 개 XML 매퍼 파일에서 EBELN = #{poNo} 패턴을 추출. 개발자들이 수년간 쌓아온 비즈니스 지식을 AI가 학습 가능한 구조로 변환.
02
TableMetaSampler
각 테이블에서 실제 데이터 100행을 샘플링해 AI로 분석. 상태코드 의미 자동 추출 (01→대기, 02→진행중), 업무 카테고리 분류, 차트 타입 추천.
03
GoldenQuery 누적
검증된 쿼리를 자동 저장해서 재사용. 유사도 90%+ → AI 호출 없이 즉시 반환. 유사도 75~90% → few-shot 예시로 AI에게 제공.
04
파생 키 패턴 감지
EBELN=4500017893PLAN_ID=450001789310_2026
값이 포함 관계인 파생 키는 정확한 값 매칭으로 절대 발견 불가. AI의 패턴 인식으로만 가능한 영역.
-- MyBatis Mapper에서 추출한 패턴 -- EBELN 컬럼 = PO번호 라는 사실이 담겨 있다 <if test="poNo != null"> AND EBELN = #{poNo} ← 이 패턴을 추출 </if> -- 파이프라인이 변환한 결과 { "column": "EBELN", "paramName": "poNo", "template": "{{PO_NO}}" ← GoldenQuery에 저장 }
아이디어의 진화
Phase F~I는 Claude가 제안한 게 아니다

군집화·연관규칙·이상탐지·그래프 분석 — 이 기술들은 개발자가 먼저 물어서 끌어낸 것입니다. "더 딥한 요구사항까지 추론해봐"라는 질문 하나가 새로운 DB 등록 파이프라인 설계 전체를 바꿨습니다.

1
출발점 — 데이터 분류
이런식으로 데이터를 분류하는 고도화를 통해서
"이게 어디에 필요한 정보다"라는 것을 분류해볼 수 있어?
정보가 있는 테이블들을 최신 100개 정도씩 끊어서 —
이런 값은 어떤 프로세스에 필요하다, 사용자가 이걸 요청하면 이걸로 어떻게 엮어서 보여줄지 학습이 가능할까?
2
확장 — 8개 시스템 전체 분석
이런 것들도 다 분석을 한번 해서
영업, 생산, 물류, 배송, 계약, 단가 등등으로 분석할 수 있는 것들을 다 분석해봐.

(S2C, Sales Portal, ChanggoSaver, Emro SCM, AutoLabeler, spigen-web
— 8개 시스템 코드 전체를 넘기며)
3
핵심 전환점 — 군집화를 직접 물다
이런식으로 더 딥한 요구사항정도까지를 너가 지금 추론해볼수있어?

FK가 없을 수도 있어 —
데이터들을 보고 유기적으로 연관성을 판단하는것까지도 가야해.
그래서 이게 군집화가 필요하지 않나?
맞습니다. FK 없는 환경에서 관계를 발견하려면 데이터 값 자체의 겹침(70%+ threshold)으로 판단해야 합니다. 이를 위해 새 DB 등록 파이프라인을 다음과 같이 설계합니다:
새 DB 등록 자동 파이프라인
Step 1: 스키마 수집 — 테이블 목록 + 컬럼 타입 + 샘플 100행
Step 2: 관계 발견 — FK → 컬럼명 패턴 → 데이터 값 겹침 70%+ threshold
Step 3: 클러스터링 → Claude Opus — 연관 테이블 묶음 → 프로세스 추론
"PO_HEADER + VENDOR_MASTER = 구매발주 프로세스"
→ BusinessProcess 저장 (confirmed=false)
Step 4: DOMAIN_MAP 확장 — 새 비즈니스 도메인 자동 추가
Step 5: GoldenQuery 생성 — 발견된 관계 기반 SQL 자동 작성
4
궁극의 비전 — 흐름을 인지하는 AI
"A라는 오더가 언제 데이터가 생겨서(주문이 와서)
생산 → 출고 → 배송 이런 모든 정보를
이 AI가 흐름을 인지하는 그런 정도를 원하거든?"
그 비전이 Phase I의 그래프 분석입니다. 군집화로 묶인 프로세스 단위들이 시간 순서 엣지(edge)로 연결되어 오더 흐름 그래프가 구성됩니다. 사용자가 "이 오더 어디까지 갔어?"라고 물으면, AI는 그래프를 탐색해 답합니다.
이 질문들이 Phase F~I로 연결된 방식
각 질문이 어떤 Phase로 이어졌는지
데이터 분류 가능해?
Phase F
크로스 테이블 통합 분석
테이블 간 관계 자동 발견
같이 보는 데이터 패턴?
Phase G
연관 규칙 마이닝
"발주→납기 72% 동반" 자동 발견
이상한 수치 자동 감지?
Phase H
시계열 + 이상 탐지
z-score 기반 자동 마킹
"군집화가 필요하지 않나?"
Phase I
군집화 + 그래프 분석
오더 흐름 자동 인지
앞으로
"발견하는 플랫폼"으로

Phase F~I는 사용자가 묻기 전에 AI가 먼저 발견하는 단계입니다.

Phase F
크로스 테이블 통합 분석
전체 스키마 + 컬럼별 샘플값을 AI에게 한 번에 제시. "이 7개 테이블이 구매 프로세스를 구성한다"를 스스로 파악.
Phase G
연관 규칙 마이닝
GoldenQuery SQL을 파싱해 "발주 조회 후 납기 조회가 72% 동반된다" 같은 패턴 자동 발견. 위젯 하단에 함께 자주 보는 데이터 추천.
Phase H
시계열 + 이상 탐지
날짜 컬럼이 있는 테이블에서 이동 평균 계산 → 추세 감지. z-score 기반으로 이상값 자동 마킹. "발주량 +34% / 단가 이상 2건" 자동 인사이트.
Phase I
클러스터링 + 그래프 분석
협력사 납기 데이터 클러스터링 → "위험 그룹 5개사, 우량 그룹 23개사" 자동 발견. 사용자가 묻기 전에 AI가 먼저 알려준다.