본문으로 건너뛰기
고급트리 브랜치: 차세대 AI 인터페이스 UX게시일 2026-11-10 · 조회 1890회

AI 채팅을 넘어선 캔버스 인터페이스: React Flow 기반 동적 마인드맵 & 비주얼 다이어그램 생성기

단순한 텍스트 줄글 출력을 벗어나 복잡한 비즈니스 기획과 아키텍처를 인터랙티브 노드 그래프로 실시간 자동 시각화하는 캔버스 UI 구축기입니다.

홍

홍은선 연구원

HongLabAI AI 엔지니어링 리드

👁️ 조회 1890❤️ 추천 132💬 댓글 0
스폰서 광고 영역 (Google AdSense)

📌실무 핵심 요약 (Key Engineering Takeaways)

  • ✔텍스트 출력의 한계를 넘어 2차원 공간(Spatial) 캔버스에 AI가 실시간으로 그래프 구성
  • ✔Dagre 알고리즘을 결합한 자동 노드 배치로 복잡한 계층 구조도 깔끔하게 정돈
  • ✔노드 클릭 기반 부분 재생성(Partial Regeneration) 루프로 직관적인 인터랙션 완성

사용자들은 복잡한 전략이나 시스템 구조를 텍스트로 읽는 것보다 2차원 캔버스 위의 다이어그램으로 조망할 때 5배 빠르게 이해합니다. 하지만 기존의 텍스트 채팅창은 긴 답변을 스크롤 압박 속에서 흩어지게 만듭니다.

HongLabAI에서는 Vercel AI SDK의 스트리밍 JSON 기능과 React Flow(@xyflow/react)를 결합하여 '생성형 캔버스(Generative Canvas)'를 구현했습니다: 1. 사용자가 "헬스케어 예약 앱의 전체 시스템 아키텍처를 설계해줘"라고 입력하면, LLM이 구조화된 노드(Node)와 엣지(Edge) 데이터를 스트리밍으로 전송 2. 프론트엔드가 수신된 청크를 파싱하여 화면에 실시간으로 노드가 팝업되고 연결선이 그려지는 인터랙티브 애니메이션 제공 3. Dagre 그래프 레이아웃 엔진을 적용하여 노드 간 겹침을 방지하고 상하/좌우 방향 자동 정렬 4. 사용자가 특정 노드를 클릭하여 "이 결제 모듈을 토스페이먼츠 연동으로 구체화해줘"라고 요청하면 해당 하위 노드만 지능적으로 확장

이 UX는 제품 기획 회의와 엔지니어링 설계의 커뮤니케이션 비용을 획기적으로 낮춥니다.

🔄엔지니어링 아키텍처 흐름도 (Architecture Workflow)

사용자의 복합 시스템 설계 요청 입력
➔
LLM이 Nodes & Edges JSON 구조 스트리밍 전송
➔
클라이언트 측 스트리밍 파서가 실시간 노드 생성
➔
Dagre 알고리즘이 화면 좌표 및 연결선 자동 최적화
➔
사용자 드래그 앤 드롭 및 노드별 AI 세부 확장 지원
typescript 예제 코드HongLabAI Verified
import React, { useCallback } from "react";
import { ReactFlow, addEdge, Background, Controls, useNodesState, useEdgesState } from "@xyflow/react";
import "@xyflow/react/dist/style.css";
import dagre from "dagre";

// Dagre 기반 노드 자동 레이아웃 함수
export function getLayoutedElements(nodes: any[], edges: any[], direction = "TB") {
  const dagreGraph = new dagre.graphlib.Graph();
  dagreGraph.setDefaultEdgeLabel(() => ({}));
  dagreGraph.setGraph({ rankdir: direction, ranksep: 60, nodesep: 40 });

  nodes.forEach((node) => dagreGraph.setNode(node.id, { width: 180, height: 60 }));
  edges.forEach((edge) => dagreGraph.setEdge(edge.source, edge.target));
  dagre.layout(dagreGraph);

  const layoutedNodes = nodes.map((node) => {
    const nodeWithPosition = dagreGraph.node(node.id);
    return {
      ...node,
      position: { x: nodeWithPosition.x - 90, y: nodeWithPosition.y - 30 },
    };
  });

  return { nodes: layoutedNodes, edges };
}

export default function GenerativeMindmap({ initialNodes, initialEdges }: any) {
  const { nodes: layoutedN, edges: layoutedE } = getLayoutedElements(initialNodes, initialEdges);
  const [nodes, setNodes, onNodesChange] = useNodesState(layoutedN);
  const [edges, setEdges, onEdgesChange] = useEdgesState(layoutedE);

  return (
    <div className="h-[600px] w-full rounded-2xl border border-zinc-200 bg-zinc-50 shadow-inner">
      <ReactFlow nodes={nodes} edges={edges} onNodesChange={onNodesChange} onEdgesChange={onEdgesChange} fitView>
        <Background color="#cbd5e1" gap={16} />
        <Controls />
      </ReactFlow>
    </div>
  );
}
#ReactFlow#GenerativeUI#CanvasUX#DataVisualization#Nextjs
스폰서 광고 영역 (Google AdSense)

💬트리 구조 기술 토론 (0)

해당 주제에 관한 질의응답 및 피드백은 계층형 트리 댓글로 정리됩니다.

작성된 기술 토론이 아직 없습니다. 메인 보드에서 첫 번째 질문을 남겨보세요!

같은 트리 브랜치의 추천 아티클