Oh MyUtils

Mermaid 다이어그램 에디터 - 플로우차트·다이어그램 온라인 생성

Mermaid.js 실시간 미리보기로 플로우차트, 시퀀스 다이어그램, ER 다이어그램 등 20여 종의 다이어그램을 생성하세요. SVG/PNG로 내보내기 — 100% 클라이언트 사이드, 서버 전송 없음.

자주 묻는 질문

Mermaid 다이어그램 편집기란 무엇인가요?

Mermaid 다이어그램 편집기는 텍스트 기반 다이어그램 언어인 Mermaid.js를 사용하여 다이어그램을 만들 수 있는 온라인 도구입니다. 도형을 드래그 앤 드롭하는 대신 간단한 마크다운과 유사한 구문(예: graph TD; A-->B)을 작성하면 편집기가 실시간으로 시각적 다이어그램을 렌더링합니다. Mermaid는 플로우차트, 시퀀스 다이어그램, 클래스 다이어그램, ER 다이어그램, 간트 차트, 마인드맵 등 20가지 이상의 다이어그램 유형을 지원합니다.

이 Mermaid 다이어그램 편집기는 어떻게 사용하나요?

템플릿 드롭다운에서 다이어그램 템플릿(예: 플로우차트 또는 시퀀스 다이어그램)을 선택하거나 Mermaid 코드를 직접 작성하세요. 입력하는 동안 미리보기 패널이 실시간으로 업데이트됩니다. 구문 오류가 있으면 빨간색 'Invalid' 배지가 나타납니다. Mermaid 테마(Default, Dark, Forest, Neutral)를 선택하여 시각적 스타일을 변경할 수 있습니다. 만족스러우면 SVG 다운로드 또는 PNG 다운로드를 클릭하여 다이어그램을 내보내세요.

내 다이어그램 데이터는 안전한가요? 서버로 전송되는 것이 있나요?

모든 다이어그램 렌더링은 mermaid.js JavaScript 라이브러리를 사용하여 브라우저에서 100% 클라이언트 측에서 수행됩니다. 다이어그램 코드, 렌더링된 이미지, 사용자 데이터 어느 것도 서버로 전송되지 않습니다. 다이어그램은 브라우저의 메모리와 localStorage에만 존재합니다. 따라서 독점 아키텍처 다이어그램, 내부 데이터베이스 스키마, 기밀 문서에도 안전하게 사용할 수 있습니다.

Mermaid는 어떤 다이어그램 유형을 지원하나요?

Mermaid.js는 20가지 이상의 다이어그램 유형을 지원합니다: 플로우차트(프로세스 흐름), 시퀀스 다이어그램(액터 상호작용), 클래스 다이어그램(OOP 구조), 상태 다이어그램(상태 머신), ER 다이어그램(데이터베이스 스키마), 간트 차트(프로젝트 타임라인), 파이 차트(비례 데이터), 마인드맵(아이디어 계층), Git 그래프(브랜칭 시각화), 타임라인(시간순 이벤트) 등이 있으며, C4, Sankey, XY 차트, 칸반, 아키텍처 다이어그램도 포함됩니다.

다이어그램을 이미지로 내보내려면 어떻게 하나요?

SVG 다운로드를 클릭하면 어떤 크기에서도 선명한 확장 가능한 벡터 그래픽을 얻을 수 있습니다 — 문서화에 이상적입니다. PNG 다운로드를 클릭하면 래스터 이미지를 얻을 수 있으며, 배율(1x, 레티나용 2x, 인쇄용 3x)과 투명 또는 흰색 배경을 선택할 수 있습니다. SVG 복사를 클릭하면 Figma 같은 디자인 도구에 붙여넣기 위해 SVG 마크업을 클립보드에 복사할 수도 있습니다.

다이어그램을 다른 사람과 공유할 수 있나요?

네. 다이어그램 코드와 테마가 페이지 URL에 인코딩됩니다. 브라우저 주소창에서 URL을 복사하여 공유하면 됩니다. 다른 사람이 링크를 열면 정확히 같은 다이어그램을 볼 수 있고 추가 편집도 가능합니다. 서버 저장소가 관여하지 않으며 — 다이어그램 데이터가 URL에 직접 포함됩니다. 매우 큰 다이어그램은 URL 길이 제한을 초과할 수 있으며, 이 경우 코드 복사를 통해 Mermaid 코드를 공유할 수 있습니다.

Mermaid 테마란 무엇인가요?

Mermaid.js에는 네 가지 내장 테마가 있습니다: Default(파란색/보라색 톤), Dark(프레젠테이션용 어두운 배경), Forest(녹색 톤, 유기적 느낌), Neutral(그레이스케일, 전문적). 테마는 다이어그램 내의 노드 색상, 선 스타일, 배경에 영향을 줍니다. 앱의 UI 테마(다크/라이트 모드)는 Mermaid 다이어그램 테마와 독립적입니다.

편집기가 작업을 자동 저장하나요?

네. 다이어그램 코드는 입력하는 동안 브라우저의 localStorage에 자동으로 저장됩니다. 페이지를 다시 방문하면 마지막 다이어그램이 자동으로 복원됩니다. localStorage는 브라우저별로 다르므로 — 브라우저를 변경하거나 브라우저 데이터를 삭제하면 저장된 다이어그램이 제거됩니다. 장기 보관을 위해서는 다이어그램을 내보내거나 공유 가능한 URL을 복사하세요.

코드 예제

// Mermaid Diagram Rendering and Export in JavaScript (Browser)

/**
 * Initialize mermaid.js with configuration
 */
async function initMermaid(theme = 'default') {
  const mermaid = await import('https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs');
  mermaid.default.initialize({
    startOnLoad: false,
    theme: theme,  // 'default', 'dark', 'forest', 'neutral'
    securityLevel: 'strict',
  });
  return mermaid.default;
}

/**
 * Render Mermaid code to SVG string
 */
async function renderMermaid(mermaidInstance, code, elementId = 'mermaid-output') {
  try {
    const { svg } = await mermaidInstance.render(elementId, code);
    return { svg, error: null };
  } catch (error) {
    return { svg: null, error: error.message };
  }
}

/**
 * Export SVG string as downloadable .svg file
 */
function downloadSvg(svgContent, filename = 'diagram.svg') {
  const blob = new Blob([svgContent], { type: 'image/svg+xml;charset=utf-8' });
  const url = URL.createObjectURL(blob);
  const anchor = document.createElement('a');
  anchor.href = url;
  anchor.download = filename;
  anchor.click();
  URL.revokeObjectURL(url);
}

/**
 * Convert SVG to PNG and download
 */
async function downloadPng(svgContent, scale = 2, filename = 'diagram.png') {
  return new Promise((resolve, reject) => {
    const svgBlob = new Blob([svgContent], { type: 'image/svg+xml;charset=utf-8' });
    const url = URL.createObjectURL(svgBlob);
    const img = new Image();

    img.onload = () => {
      const canvas = document.createElement('canvas');
      canvas.width = img.naturalWidth * scale;
      canvas.height = img.naturalHeight * scale;
      const ctx = canvas.getContext('2d');

      ctx.fillStyle = '#ffffff';
      ctx.fillRect(0, 0, canvas.width, canvas.height);
      ctx.scale(scale, scale);
      ctx.drawImage(img, 0, 0);

      canvas.toBlob((blob) => {
        const pngUrl = URL.createObjectURL(blob);
        const anchor = document.createElement('a');
        anchor.href = pngUrl;
        anchor.download = filename;
        anchor.click();
        URL.revokeObjectURL(pngUrl);
        URL.revokeObjectURL(url);
        resolve();
      }, 'image/png');
    };

    img.onerror = reject;
    img.src = url;
  });
}

/**
 * Encode diagram state for URL sharing
 */
function encodeDiagramState(code, theme) {
  const state = JSON.stringify({ code, theme });
  return btoa(unescape(encodeURIComponent(state)));
}

function decodeDiagramState(encoded) {
  try {
    const json = decodeURIComponent(escape(atob(encoded)));
    return JSON.parse(json);
  } catch {
    return null;
  }
}

// Example usage
(async () => {
  const mermaid = await initMermaid('default');

  const code = `
graph TD
    A[Start] --> B{Is it working?}
    B -->|Yes| C[Great!]
    B -->|No| D[Debug]
    D --> B
  `;

  const { svg, error } = await renderMermaid(mermaid, code);

  if (error) {
    console.error('Render error:', error);
    return;
  }

  console.log('SVG rendered successfully');

  // Download as SVG
  downloadSvg(svg, 'flowchart.svg');

  // Download as PNG at 2x resolution
  await downloadPng(svg, 2, 'flowchart.png');

  // Create shareable URL
  const encoded = encodeDiagramState(code, 'default');
  console.log(`Share URL: https://ohmyutils.com/en/mermaid-diagram-editor?state=${encoded}`);
})();

관련 도구