๐ŸŽ‰ ํŒŒ์ด์ฌ ๊ฐœ๋ฐœ์ž์™€ ๋จธ๋ฉ”์ด๋“œ ํŒฌ๋“ค์„ ์œ„ํ•œ ํฐ ์†Œ์‹: 'mmdc'๊ฐ€ ๋จธ๋ฉ”์ด๋“œ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ํŒŒ์ด์ฌ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๋‹ค! ๐Ÿš€

๋ฐœํ–‰: (2026๋…„ 1์›” 8์ผ ์˜คํ›„ 06:02 GMT+9)
5 min read
์›๋ฌธ: Dev.to

Source: Dev.to

Mermaid๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

Mermaid๋Š” ๋‹จ์ˆœํ•œ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฌธ๋ฒ•(Markdown๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•จ)์œผ๋กœ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์ •์˜ํ•˜๊ณ  ์ด๋ฅผ ์‹ค์ œ ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ๋ Œ๋”๋งํ•ด ์ฃผ๋Š” ์˜คํ”ˆโ€‘์†Œ์Šค ๋‹ค์ด์–ด๊ทธ๋žจ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‰๋ฌธ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค:

graph TD
  A --> B
  B --> C

โ€ฆ๊ทธ๋ฆฌ๊ณ  Mermaid๋Š” ์ด๋ฅผ ์‹œ๊ฐ์ ์ธ ํ”Œ๋กœ์šฐ์ฐจํŠธ๋กœ ๋ณ€ํ™˜ํ•ด ๋ฌธ์„œ, ์œ„ํ‚ค, ๋ธ”๋กœ๊ทธ, ํ˜น์€ ๊ธฐ์ˆ  ๋ฌธ์„œ์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค๋‹ˆ๋‹ค. ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๊ณ , ๋ฒ„์ „ ๊ด€๋ฆฌ์— ์นœํ™”์ ์ด๋ฉฐ, ๋‹ค์–‘ํ•œ ๋„๊ตฌ์™€ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. (Mermaid)

์™œ mmdc๊ฐ€ ํ˜์‹ ์ ์ธ๊ฐ€

์ „ํ†ต์ ์œผ๋กœ Mermaid๋ฅผ SVG, PNG, PDF ๋“ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค:

  • Node.js
  • npm
  • Mermaid CLI
  • ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” ํ—ค๋“œ๋ฆฌ์Šค ์›Œ์ปค
  • ์ถ”๊ฐ€ ์‹œ์Šคํ…œ ๋„๊ตฌ

mmdc๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ Python ์†”๋ฃจ์…˜์œผ๋กœ, pip install ํ•œ ๋ฒˆ์œผ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์™ธ๋ถ€ ๋„๊ตฌ๋ฅผ ์ „ํ˜€ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ PhantomJS ์ธ์Šคํ„ด์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Phasma๋ฅผ ์‚ฌ์šฉํ•ด Mermaid ์ฝ”๋“œ๋ฅผ ์‹ค์ œ ๋‹ค์ด์–ด๊ทธ๋žจ ์ถœ๋ ฅ๋ฌผ๋กœ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค โ€” ๋ณ„๋„๋กœ ๋ญ”๊ฐ€๋ฅผ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์ฃ . ๋”ฐ๋ผ์„œ Python ํ™˜๊ฒฝ, ์ž๋™ํ™”, ๋ฌธ์„œ ํŒŒ์ดํ”„๋ผ์ธ, CI/CD ์›Œํฌํ”Œ๋กœ์— ์ตœ์ ์ž…๋‹ˆ๋‹ค.

์„ค์น˜

pip install mmdc

์ด๊ฒƒ๋งŒ์œผ๋กœ ์ค€๋น„ ์™„๋ฃŒ! Node.js, npm, apt ์„ค์น˜, ๋ธŒ๋ผ์šฐ์ € ๋“ฑ์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

๋ช…๋ น์ค„์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

๊ฐ„๋‹จํ•œ Mermaid ํŒŒ์ผ์„ SVG๋กœ ๋ณ€ํ™˜:

mmdc --input my_diagram.mmd --output my_diagram.svg

ํ™•์žฅ์ž๋ฅผ ์ง€์ •ํ•˜๋ฉด PNG ๋˜๋Š” PDF๋„ ๋ฐ”๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

mmdc --input my_diagram.mmd --output my_diagram.png
mmdc --input my_diagram.mmd --output my_diagram.pdf

์ž๋™ํ™”๋œ ๋ฌธ์„œ ๋นŒ๋“œ, ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ๊ธฐ, ๋ธ”๋กœ๊ทธ ํŒŒ์ดํ”„๋ผ์ธ์— ์•ˆ์„ฑ๋งž์ถค!

Python์—์„œ๋„ ์‚ฌ์šฉํ•˜๊ธฐ

Python ์ฝ”๋“œ์—์„œ ์ง์ ‘ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์ƒ์„ฑ:

from mmdc import MermaidConverter

converter = MermaidConverter()

mermaid_text = """
graph TD
    A[Start] --> B{Is it cool?}
    B -->|Yes| C[Love it!]
    B ---->|No| D[Try again]
"""

converter.to_svg(mermaid_text, output_file="cool_diagram.svg")

๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ•๋ ฅํ•˜๋ฉฐ, Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋ฌธ์„œ ์ƒ์„ฑ๊ธฐ, ๋…ธํŠธ๋ถ ์›Œํฌํ”Œ๋กœ, ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ์™€ ๊น”๋”ํ•˜๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค!

์˜ˆ์‹œ Mermaid ์ฝ”๋“œ ์Šค๋‹ˆํŽซ

Flowchart

graph LR
    A[Idea] --> B[Develop]
    B --> C[Test]
    C --> D[Deploy]

Simple Loop

flowchart TD
    Start --> Process
    Process --> Review
    Review -->|OK| End
    Review -->|Fix| Process

Sequence Diagram

sequenceDiagram
    Alice->>Bob: Hello Bob!
    Bob-->>Alice: Hi Alice!

์™œ ์ค‘์š”ํ•œ๊ฐ€

  • ์™ธ๋ถ€ ์„ค์ • ๋ถˆํ•„์š”: Python ๊ฐœ๋ฐœ์ž๋Š” ์ด์ œ ์ถ”๊ฐ€ ์„ค์น˜ ์—†์ด Mermaid๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฌธ์„œ ์ž๋™ํ™”์— ์ ํ•ฉ: Sphinx, MkDocs, Jupyter, ๋…ธํŠธ๋ถ, CI/CD์™€ ์ž˜ ์–ด์šธ๋ฆฝ๋‹ˆ๋‹ค.
  • Python ์ค‘์‹ฌ ์›Œํฌํ”Œ๋กœ: ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ผ๊ธ‰ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

๋งŒ์•ฝ Python ์ „์šฉ์œผ๋กœ Mermaid ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๊น”๋”ํ•˜๊ฒŒ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, mmdc๋Š” ํฐ ์†Œ์‹์ž…๋‹ˆ๋‹ค. ๋‹จ ํ•œ ๋ฒˆ์˜ pip install์œผ๋กœ ์‚ฌ๋ž‘๋ฐ›๋Š” ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋‹ค์ด์–ด๊ทธ๋žจ ๋ฐฉ์‹์„ ๋ฐ”๋กœ Python ์ƒํƒœ๊ณ„์— ๊ฐ€์ ธ๋‹ค ์ค๋‹ˆ๋‹ค.

์ด์ œ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์ฝ”๋“œ ์šฐ์„ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” ๋ฒ„์ „ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•˜๊ณ , ์ž๋™ํ™” ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ฐ€๋ณ๊ณ  ์•„๋ฆ„๋‹ต๊ฒŒ โ€” ์™ธ๋ถ€ ํˆด์ฒด์ธ์˜ ๋ฌด๊ฒŒ ์—†์ด. ๐Ÿ’ฅ

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

ํŒŒ์ด์ฌ ๊ธฐ์ดˆ๋ฅผ ์•Œ๊ณ  ์žˆ์ฃ โ€”์ด์ œ ์‹ค์ œ๋กœ ๋ญ”๊ฐ€๋ฅผ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค

๋Œ€์ƒ: Python ๊ธฐ๋ณธ ๊ณผ์ •์ด๋‚˜ ํŠœํ† ๋ฆฌ์–ผ์„ ๋งˆ์ณค์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜, ๋ฃจํ”„, ์กฐ๊ฑด๋ฌธ, ๋ฌธ์ž์—ด์„ ์ดํ•ดํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์•„์ง ์•„๋ฌด๊ฒƒ๋„ ๋งŒ๋“ค์–ด ๋ณธ ์ ์€ ์—†์Šต๋‹ˆ๋‹ค.