mxnxeonx 2025. 3. 18. 17:16
728x90
728x90

Rete.js

Rete.js๋Š” ๋น„์ฃผ์–ผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐ ๋…ธ๋“œ ๊ธฐ๋ฐ˜ ํŽธ์ง‘๊ธฐ(Node-based Editor)๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ฝ”๋”ฉ์ด ์•„๋‹Œ Visual Flow Programming ๋„๊ตฌ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ํ•œ ์ค„์˜ ์ฝ”๋“œ ์—†์ด ํŽธ์ง‘๊ธฐ์—์„œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์ •์˜ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹œ๊ฐ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

Rete.js

 

rete.js.org

 

Drag & Drop ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ทธ๋ž˜ํ”ฝ์ ์œผ๋กœ ๋…ธ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์›Œํฌํ”Œ๋กœ์šฐ ์‹œ์Šคํ…œ, AI ํ”Œ๋กœ์šฐ, ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ ๊ธฐ๋ฐ˜ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.

 

 

ํŠน์ง•

  1. ๋…ธ๋“œ ๊ธฐ๋ฐ˜ UI ์ œ์ž‘
    • ์‰ฌ์šด ๊ตฌํ˜„ : ๋ธ”๋ก์„ ๋ฐฐ์น˜ํ•˜๊ณ  ์„ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ํ˜•ํƒœ
      ex) ๋ธ”๋กํ˜• ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ, ์‹œ๊ฐ์  ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ
  2. ๋ชจ๋“ˆํ™”๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ
    • ๊ธฐ๋ณธ ์—”์ง„์— ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ธฐ๋Šฅ ํ™•์žฅ ๊ฐ€๋Šฅ
      ex) Drag & Drop ๊ธฐ๋Šฅ, ๋ฏธ๋‹ˆ๋งต, ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ฐฝ ๋“ฑ์˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ
  3. ์ปค์Šคํ…€ ๋…ธ๋“œ ์ œ์ž‘ ๊ฐ€๋Šฅ
    • HTML, Vue, React ๋“ฑ๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์›ํ•˜๋Š” UI ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ
  4. ์›น ๊ธฐ๋ฐ˜
    • ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ์ถ”๊ฐ€์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์„ค์น˜ ์—†์ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ œ์ž‘ ๊ฐ€๋Šฅ
  5. ์˜คํ”ˆ์†Œ์Šค ๋ฐ ํ™•์žฅ์„ฑ
    • ๋ˆ„๊ตฌ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” MIT ๋ผ์ด์„ ์Šค ๊ธฐ๋ฐ˜ ์˜คํ”ˆ์†Œ์Šค
    • ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ

 

์„ค์น˜

npm์„ ์ด์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜ํ•œ๋‹ค.

# Rete๋งŒ ์„ค์น˜
$ npm install rete

# ํ”Œ๋Ÿฌ๊ทธ์ธ ํฌํ•จ ์„ค์น˜ (๊ณต์‹ ๋ฌธ์„œ ๋‚ด์šฉ)
$ npm install rete rete-vue-render-plugin rete-connection-plugin
# ๋˜๋Š” yarn์„ ์ด์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜ ๊ฐ€๋Šฅ
$ yarn add rete rete-connection-plugin rete-vue-render-plugin

 

์ดํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด importํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

import Rete from "rete";
import ConnectionPlugin from 'rete-connection-plugin';
import VueRenderPlugin from 'rete-vue-render-plugin';

 

ํ”Œ๋Ÿฌ๊ทธ์ธ

๋…ธ๋“œ ๊ฐ„ ์—ฐ๊ฒฐ์„ ์„ ์ƒ์„ฑํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ

import ConnectionPlugin from "rete-connection-plugin";
editor.use(ConnectionPlugin);

 

Vue.js๋ฅผ ์‚ฌ์šฉํ•ด UI๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ

import VueRenderPlugin from "rete-vue-render-plugin";
editor.use(VueRenderPlugin);

 

์šฐํด๋ฆญ ๋ฉ”๋‰ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ

import ContextMenuPlugin from "rete-context-menu-plugin";
editor.use(ContextMenuPlugin);

 

 

JSON ์ €์žฅ ๋ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

Rete.js๋Š” JSON ํ˜•์‹์œผ๋กœ ๋…ธ๋“œ ํŽธ์ง‘๊ธฐ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

์ €์žฅ

const json = editor.toJSON();
localStorage.setItem("reteData", JSON.stringify(json));

 

๋ถˆ๋Ÿฌ์˜ค๊ธฐ

const data = JSON.parse(localStorage.getItem("reteData"));
editor.fromJSON(data);

 

 

์˜ˆ์ œ

import Rete from "rete";
import ConnectionPlugin from "rete-connection-plugin";
import VueRenderPlugin from "rete-vue-render-plugin";

// HTML ์š”์†Œ ์„ ํƒ (๋…ธ๋“œ ํŽธ์ง‘๊ธฐ๊ฐ€ ๋“ค์–ด๊ฐˆ div)
const container = document.getElementById("rete");

// ๋…ธ๋“œ ํŽธ์ง‘๊ธฐ ์ƒ์„ฑ (ID๋Š” 'demo@0.1.0'์œผ๋กœ ์ง€์ •)
const editor = new Rete.NodeEditor("demo@0.1.0", container);
editor.use(ConnectionPlugin);
editor.use(VueRenderPlugin);

// ์†Œ์ผ“ ์ •์˜ (๋…ธ๋“œ ๊ฐ„ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค)
const numSocket = new Rete.Socket("Number");

// ์ปค์Šคํ…€ ๋…ธ๋“œ ์ •์˜
class NumComponent extends Rete.Component {
  constructor() {
    super("Number");
  }

  builder(node) {
    const out = new Rete.Output("num", "Number", numSocket);
    return node.addOutput(out);
  }

  worker(node, inputs, outputs) {
    outputs["num"] = node.data.num;
  }
}

// ์—”์ง„ ์ƒ์„ฑ ๋ฐ ๋…ธ๋“œ ์ถ”๊ฐ€
const engine = new Rete.Engine("demo@0.1.0");
const numComponent = new NumComponent();

editor.register(numComponent);
engine.register(numComponent);

// ๊ธฐ๋ณธ ๋…ธ๋“œ ์ถ”๊ฐ€
(async () => {
  const node1 = await numComponent.createNode();
  node1.position = [80, 200];
  editor.addNode(node1);
})();
  • Rete.NodeEditor : ๋…ธ๋“œ ํŽธ์ง‘๊ธฐ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ (์ดˆ๊ธฐํ™”)
  • editor.use(ConnectionPlugin) : ๋…ธ๋“œ ๊ฐ„ ์—ฐ๊ฒฐ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€
  • editor.use(VueRenderPlugin) : Vue.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ UI๋ฅผ ๋ Œ๋”๋ง
  • Rete.Socket : ๋…ธ๋“œ ๊ฐ„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์†Œ์ผ“์„ ์ •์˜
  • Rete.Component : ์ปค์Šคํ…€ ๋…ธ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ํด๋ž˜์Šค
  • builder(node) : ๋…ธ๋“œ์˜ ์ž…์ถœ๋ ฅ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์„ฑ
  • worker(node, inputs, outputs) : ์ž…๋ ฅ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๋Š” ๋กœ์ง
  • editor.addNode(node1) : ๋…ธ๋“œ๋ฅผ ํŽธ์ง‘๊ธฐ์— ์ถ”๊ฐ€

 

ํ™œ์šฉ ์‚ฌ๋ก€

  • ๋น„์ฃผ์–ผ ์Šคํฌ๋ฆฝํŒ… ๋„๊ตฌ
  • AI ํ”Œ๋กœ์šฐ ์ฐจํŠธ (TensorFlow, ๋จธ์‹ ๋Ÿฌ๋‹ ๋…ธ๋“œ ํŽธ์ง‘๊ธฐ)
  • ๊ฒŒ์ž„ ๊ฐœ๋ฐœ (Unity, Unreal Engine์˜ ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ์Šคํƒ€์ผ ์‹œ์Šคํ…œ)
  • IoT ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๊ด€๋ฆฌ
  • ๋น„์ฃผ์–ผ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋„๊ตฌ (BIํˆด)
  • ๋…ธ์ฝ”๋“œ(No-Code) ๋ฐ ๋กœ์šฐ ์ฝ”๋“œ(Low-Code) ์•ฑ ๊ฐœ๋ฐœ
728x90
320x100