.mmd 파일 여는 방법

.mmd 파일은 Mermaid 다이어그램이 적힌 일반 텍스트 파일입니다. 이미지도 아니고 바이너리 형식도 아니므로, 아무 텍스트 편집기로나 열어서 읽을 수 있습니다. 다이어그램으로 보고 싶다면 아래 상자에 파일을 끌어다 놓으세요. 브라우저 안에서 그려지며 서버로는 아무것도 전송되지 않습니다.

여기에 .mmd 파일을 놓으세요

.mermaid, .md, .txt도 받습니다. 파일은 브라우저 안에서 읽히며 업로드되지 않습니다.

.mmd 파일이란

Mermaid는 다이어그램을 적기 위한 텍스트 문법입니다. 다이어그램을 말로 적으면 렌더러가 그것을 그립니다. Markdown이 서식을 말로 적으면 렌더러가 페이지를 만드는 것과 같은 관계입니다. .mmd 파일에는 그 텍스트만 들어 있습니다. 꾸밈도, 이미지 데이터도, 메타데이터도 없습니다.

이 형식이 존재하는 이유가 바로 그것입니다. 텍스트이기 때문에 다이어그램이 설명하는 바로 그 코드 옆, Git 저장소 안에 함께 놓일 수 있습니다. 수정은 통째로 바뀐 바이너리가 아니라 읽을 수 있는 diff로 나타납니다. 아래가 온전히 유효한 .mmd 파일입니다.

deploy.mmd — 이것으로 파일 하나, 여섯 줄
flowchart LR
    Commit[main에 푸시] --> Build[테스트 실행]
    Build -->|성공| Deploy[운영에 배포]
    Build -->|실패| Alert[작성자에게 알림]
    Deploy --> Smoke[스모크 테스트]
    Smoke --> Done[릴리스 완료]

.mmd 파일을 열 수 있는 것

먼저 결론부터 적자면, 더블클릭으로 .mmd 파일을 여는 것은 거의 없습니다. 이 확장자가 어떤 응용 프로그램에도 연결되어 있지 않기 때문입니다. 실제로 필요한 것은 Mermaid를 그릴 수 있는 무언가입니다. 아래는 직접 확인한 내용과, 되지 않는 경우입니다.

이 페이지열립니다

파일을 그대로 그립니다

위 상자에 파일을 놓으면 다이어그램이 나옵니다. 업로드 단계가 없습니다. File API로 브라우저 안에서 파일을 읽어 그 자리에서 그립니다. 외부에 보내면 안 되는 다이어그램에도 쓸 수 있는 이유입니다.

보기만 하는 게 아니라 손을 대고 싶다면, 미리보기 아래의 링크로 편집기에서 여세요.

텍스트 편집기 전반열립니다

다이어그램이 아니라 소스가 보입니다

메모장이든 VS Code든 Vim이든 상관없습니다. .mmd는 UTF-8 텍스트라서 열면 바로 소스가 읽힙니다. 다이어그램은 보이지 않지만 고장 난 것이 아닙니다. 파일 안에 이미지가 들어 있지 않을 뿐입니다.

받은 파일이 정말 Mermaid인지 확인하는 가장 빠른 방법이기도 합니다. 열어서, 비어 있지 않은 첫 줄이 flowchart, sequenceDiagram, classDiagram, stateDiagram-v2, erDiagram, gantt 같은 다이어그램 키워드인지 보세요.

GitHub열리지 않습니다

Markdown 안의 ```mermaid 블록은 그리지만 .mmd 파일 단독은 그리지 않습니다

GitHub는 펜스로 감싼 코드 블록 안의 Mermaid를 그립니다. 공식 문서에 범위가 분명히 적혀 있습니다. 이슈, Discussions, 풀 리퀘스트, 위키, 그리고 Markdown 파일입니다. 단독 .mmd 파일은 이 목록에 없고, 저장소 파일 브라우저에서 열어도 소스가 표시될 뿐입니다.

따라서 GitHub에서 다이어그램으로 보이게 하려면 .mmd 파일이 아니라 .md 파일의 ```mermaid 블록 안에 두어야 합니다. 소스로 .mmd를 유지하면서 같은 내용을 README에도 넣는 중복은 흔하고 합리적입니다.

GitLab열리지 않습니다

```mermaid 블록은 그리지만 .mmd 단독은 그리지 않고, Mermaid 버전도 낮습니다

GitHub와 같은 모양입니다. Markdown, 이슈, 머지 리퀘스트, 위키 안의 펜스 블록에서는 그려지지만, 단독 .mmd 파일이 그려진다는 기록은 없습니다.

하나 더 알아둘 것이 있습니다. 실제로 혼란의 원인이 되기 때문입니다. GitLab.com은 Mermaid 버전 10을 지원한다고 명시하고 있습니다. 이 사이트는 11.12.2로 돌아갑니다. 버전 10 이후에 추가된 문법은 여기서는 그려지고 저기서는 실패합니다. 「뷰어에서는 되는데 사내 GitLab에서는 안 된다」의 설명은 대개 이것입니다. 자체 호스팅 GitLab에는 함정이 하나 더 있습니다. Cross-Origin-Resource-Policy 헤더가 same-site나 same-origin으로 설정되어 있으면 Mermaid 다이어그램이 오류도 없이 아무것도 표시되지 않습니다.

.mmd와 .mermaid와 .md의 차이

.mmd와 .mermaid는 같은 것입니다. 둘 다 Mermaid 소스만 들어 있고, 제가 아는 한 한쪽을 받는 도구는 다른 쪽도 받습니다. .mmd가 더 짧고 더 일반적이며, 공식 명령줄 도구도 기본으로 이것을 씁니다. 프로젝트 안에서 하나로 통일해 두면 충분하고, 기술적인 차이는 없습니다.

.md는 종류가 다릅니다. Markdown 파일은 문서이고, 그 안에 Mermaid 다이어그램이 들어 있을 수 있다는 관계입니다. 다이어그램은 백틱 세 개와 mermaid라는 단어로 시작하는 펜스에 둘러싸여, 더 큰 텍스트 안의 한 구절로 존재합니다.

이 차이가 파일이 그려지지 않는 원인 중 가장 흔한 것이고, 양쪽 방향으로 일어납니다. .md 파일의 내용을 그대로 Mermaid 렌더러에 붙이면 펜스 줄이 Mermaid 문법이 아니라서 실패합니다. 반대로 순수한 Mermaid를 펜스 없이 .md 파일로 저장하면 GitHub는 그것을 그냥 문단으로 표시합니다. 규칙은 단순합니다. .mmd 파일은 다이어그램 키워드로 시작해야 하고, .md 파일은 다이어그램을 펜스 안에 넣어야 합니다.

이 뷰어는 .mmd, .mermaid, .md, .txt를 받지만 읽어 들인 것은 모두 순수 Mermaid로 취급합니다. 다이어그램 앞뒤에 글이 있는 Markdown 파일을 놓을 때는 먼저 다이어그램 외의 것을 지워 주세요.

그려지지 않는다 — 실제 원인은 어느 것인가

Mermaid의 오류 메시지는 정확하지만 친절하지는 않습니다. 도움이 되는 요령은 메시지의 맨 끝을 읽는 것입니다. `got` 뒤에 파서가 걸려 넘어진 토큰의 이름이 나옵니다. 이것은 줄 번호보다 훨씬 잘 원인을 가리킵니다. 아래는 모두 mermaid 11.12.2에서 재현한 것으로, 잘못된 쪽은 실제로 실패하고 고친 쪽은 실제로 그려집니다.

보이는 증상

No diagram type detected matching given configuration for text: ```mermaid

원인

Markdown 파일이나 채팅에서 다이어그램을 복사할 때 펜스까지 함께 가져왔습니다. 백틱 세 개는 Markdown이지 Mermaid가 아니므로 파서가 다이어그램 본체에 닿지 못합니다.

해결

맨 앞의 ```mermaid 줄과 맨 뒤의 ``` 줄을 지웁니다. 파일은 다이어그램 키워드로 시작해야 합니다.

잘못된 예
```mermaid
flowchart TD
    A[시작] --> B[끝]
```
고친 예
flowchart TD
    A[시작] --> B[끝]

보이는 증상

Parse error, 끝부분: got 'PS'

오류 끝부분: got 'PS'

원인

노드 레이블 안에 반각 여는 소괄호가 있습니다. Mermaid에서 소괄호는 모양 문법이라 `A(글자)`는 둥근 노드를 뜻하고, 그래서 대괄호 안의 맨 괄호는 모양의 시작으로 읽힙니다.

해결

레이블 전체를 큰따옴표로 감쌉니다. 따옴표 안은 괄호를 포함해 모두 글자로 취급됩니다.

잘못된 예
flowchart TD
    A[결제 호출(주문)] --> B[완료]
고친 예
flowchart TD
    A["결제 호출(주문)"] --> B[완료]

보이는 증상

노드 ID를 적은 줄에서 Parse error

원인

노드 ID 안에 띄어쓰기가 있습니다. 한국어에서 특히 자주 생깁니다. 중국어나 일본어는 단어를 띄어 쓰지 않아 이 문제가 아예 없지만, 한국어는 띄어 쓰고 자연스러운 이름은 대부분 두 어절 이상입니다. ID는 화살표 앞의 토큰이라 공백이 그것을 끊고, 놓을 데 없는 단어가 하나 남습니다.

해결

ID는 붙여 쓴 한 덩어리로 하고, 읽을 글자는 대괄호 레이블에 넣습니다. 한글 자체는 ID로 문제없이 쓸 수 있습니다.

잘못된 예
flowchart TD
    인증 서버 --> db[사용자 DB]
고친 예
flowchart TD
    인증[인증 서버] --> db[사용자 DB]

보이는 증상

Parse error, 끝부분: got 'STR'

오류 끝부분: got 'STR'

원인

노드 레이블 도중에 반각 큰따옴표가 있습니다. 파서는 그것을 문자열의 시작으로 보고, 닫는 따옴표를 기대한 자리에서 레이블의 닫는 대괄호를 만납니다.

해결

레이블 전체를 큰따옴표로 감싼 다음 안에서는 작은따옴표나 낫표를 씁니다. HTML 실체 참조 #quot;로도 됩니다.

잘못된 예
flowchart TD
    A[상태는 "보류"] --> B[완료]
고친 예
flowchart TD
    A["상태는 '보류'"] --> B[완료]

보이는 증상

Parse error, 끝부분: got 'end'

오류 끝부분: got 'end'

원인

`end`를 노드 ID로 썼습니다. 소문자 `end`는 서브그래프를 닫으므로, 노드가 있어야 할 자리에 블록의 끝이 나타난 셈입니다. 영어 예제를 따라가다 마지막 노드만 `end`가 되는 일이 자주 있습니다.

해결

첫 글자를 대문자로 하거나 다른 ID를 주고 그 단어를 레이블에 넣습니다. `종료`는 문제없습니다.

잘못된 예
flowchart TD
    A[시작] --> end
고친 예
flowchart TD
    A[시작] --> 종료[완료]

보이는 증상

그려지는데 상태 다이어그램에서 상태 하나가 둘로 갈라져 있다

원인

상태 ID 안의 띄어쓰기입니다. 순서도와 달리 상태 다이어그램은 이것을 거부하지 않습니다. 어절마다 별개의 상자를 만들어 그대로 그려 버립니다. 실측: `[*] --> 결제 대기`는 「결제」와 「대기」 두 상태가 되고, 화살표에 걸리는 것은 앞의 것뿐입니다. 한국어의 자연스러운 상태 이름은 거의 다 두 어절이라 이 오류가 계속 생기는데, 생겼다는 신호가 전혀 없습니다.

해결

`state "표시 이름" as ID`로 선언하고 이후로는 ID로만 참조합니다.

잘못된 예
stateDiagram-v2
    [*] --> 결제 대기
    결제 대기 --> 종료
고친 예
stateDiagram-v2
    state "결제 대기" as 결제대기
    [*] --> 결제대기
    결제대기 --> 종료

보이는 증상

그려지는데 ER 다이어그램에 적은 적 없는 개체가 있다

원인

관계 레이블에 띄어쓰기가 있는데 따옴표가 없습니다. 한국어에서 관계는 「주문을 한다」처럼 두 어절 이상이 자연스러워서 자주 걸립니다. Mermaid는 오류를 내지 않고 첫 공백에서 레이블을 끊은 뒤 남은 어절을 빈 개체로 만듭니다.

해결

띄어쓰기가 들어간 관계 레이블은 반드시 따옴표로 감쌉니다. 한국어에서는 사실상 항상입니다.

잘못된 예
erDiagram
    고객 ||--o{ 주문 : 주문을 한다
고친 예
erDiagram
    고객 ||--o{ 주문 : "주문을 한다"

보이는 증상

No diagram type detected matching given configuration for text: sequencediagram

원인

다이어그램 키워드의 철자나 대소문자가 틀렸습니다. Mermaid의 키워드는 대소문자를 구분합니다. sequenceDiagram은 되고 sequencediagram은 안 됩니다. stateDiagram-v2와 erDiagram도 마찬가지입니다.

해결

대소문자를 고칩니다. 참고로 `graph`는 `flowchart`의 옛 이름으로 지금도 받아들여지므로 그쪽은 원인이 아닙니다.

잘못된 예
sequencediagram
    고객->>API: 주문 전송
고친 예
sequenceDiagram
    고객->>API: 주문 전송

보이는 증상

세로줄 사이 간선 레이블에서 Parse error

원인

간선 레이블 안에 반각 소괄호가 있습니다. `|…|` 레이블에도 노드 레이블과 같은 제약이 걸려서, 거기서도 괄호는 글자가 아니라 문법입니다.

해결

간선 레이블도 따옴표로 감쌉니다.

잘못된 예
flowchart TD
    A -->|예 (항상)| B
고친 예
flowchart TD
    A -->|"예 (항상)"| B

보이는 증상

다이어그램의 마지막 줄에서 Parse error가 보고된다

원인

열어 놓고 닫지 않은 블록이 있습니다. alt, opt, loop, par, subgraph는 모두 짝이 되는 `end`가 필요합니다. Mermaid는 입력을 다 읽은 시점에 실패를 보고하므로 줄 번호가 닫지 않은 블록이 아니라 파일의 끝을 가리킵니다.

해결

블록을 연 수와 `end`의 수를 세어 봅니다. 오류 줄이 마지막 줄이면 거의 항상 이것입니다.

잘못된 예
sequenceDiagram
    고객->>API: 주문 전송
    alt 재고 있음
        API-->>고객: 접수 완료
고친 예
sequenceDiagram
    고객->>API: 주문 전송
    alt 재고 있음
        API-->>고객: 접수 완료
    end

보이는 증상

Lexical error on line 1. Unrecognized text.

원인

다이어그램 키워드 뒤의 방향 지정이 잘못됐습니다. 순서도가 받는 것은 TB, TD, BT, LR, RL뿐이고, 그 밖의 것은 노드를 읽기도 전에 어휘 분석에서 실패합니다.

해결

다섯 개 중 하나를 씁니다. TD와 LR이면 거의 다 됩니다.

잘못된 예
flowchart XY
    A --> B
고친 예
flowchart TD
    A --> B

보이는 증상

여기서는 그려지는데 GitLab이나 Confluence, 오래된 도구에서는 안 된다

원인

버전 차이입니다. 이 뷰어는 Mermaid 11.12.2로 돌아갑니다. GitLab.com은 버전 10을 명시하고 있고, 사내 위키는 몇 년씩 뒤처져 있는 일이 드물지 않습니다. 상대 쪽 버전보다 나중에 들어온 문법은 여기서는 통과하고 저기서는 실패합니다.

해결

상대 렌더러에 버전을 물어보세요. 다이어그램 안에 info라는 한 단어만 적으면 Mermaid가 자기 버전 번호를 그립니다. 릴리스 노트를 읽는 것보다 빠릅니다.

고친 예
info

한국어로 쓸 때 특유의 함정이 하나 더 있습니다. 문자 인코딩입니다. 이 페이지도 편집기도 파일을 UTF-8로 읽습니다. UTF-8의 BOM은 제거하므로 Windows 메모장에서 「UTF-8(BOM)」으로 저장한 파일도 그대로 열립니다. 그러나 EUC-KR이나 CP949로 저장된 파일은 한글 부분이 깨진 채로 읽힙니다. 레이블이 알 수 없는 기호로 보이거나 뜻 모를 오류가 난다면, 편집기에서 인코딩을 UTF-8로 바꿔 다시 저장하세요.

그리고 오류가 전혀 나지 않는 경우도 하나. 자체 호스팅 GitLab에서는 Cross-Origin-Resource-Policy 헤더가 same-site나 same-origin으로 설정되어 있으면 Mermaid 다이어그램이 아무 말 없이 실패합니다. 메시지도 다이어그램도 페이지에 남지 않습니다. 어떤 자체 호스팅 환경에서만 다이어그램이 안 나온다면 거기를 보세요.

PNG, SVG, PDF로 변환하기

파일을 편집기에서 열고 내보내기 버튼을 쓰세요. SVG는 다이어그램을 벡터로 유지하므로 어떤 크기에서도 선명하고 레이블을 선택하거나 검색할 수 있습니다. 문서에 넣을 때나 나중에 다시 내보낼 가능성이 있다면 이쪽이 정답입니다. PNG는 비트맵이고, 고해상도 화면에서도 견디도록 표시 크기의 2~3배로 내보냅니다. SVG를 받지 않는 곳, 실제로는 대부분의 메신저와 일부 위키에서 쓰세요.

PDF 버튼은 없습니다. 있는 척하기보다 없다고 적어 둡니다. 현실적인 경로는 SVG로 내보내서 지금 쓰고 있는 문서에 넣거나, 그 페이지를 브라우저에서 PDF로 인쇄하는 것입니다. 벡터 SVG를 PDF에 넣어도 벡터 그대로입니다.

반복해서 실행하고 싶은 것 — 빌드 단계, 대량의 파일, 커밋 전 훅 — 에는 공식 명령줄 렌더러 @mermaid-js/mermaid-cli가 있습니다. 같은 .mmd 파일을 넘기면 브라우저 없이 이미지를 바로 써 냅니다.

자주 묻는 질문

.mmd 파일을 온라인에서 어떻게 여나요?
이 페이지 위쪽의 상자에 끌어다 놓으세요. 업로드도 가입도 없이 브라우저 안에서 그려집니다. 편집기를 열고 미리보기 영역에 파일을 끌어다 놓아도 됩니다.
.mmd 파일은 어떤 프로그램으로 여나요?
파일이 일반 텍스트라서 어떤 텍스트 편집기로도 소스는 읽힙니다. 다이어그램으로 보려면 Mermaid를 그릴 수 있는 것이 필요합니다. 이 페이지, 이 사이트의 편집기, 또는 mermaid-cli라는 명령줄 도구입니다. .mmd 확장자를 차지하는 데스크톱 응용 프로그램은 없습니다.
.mmd와 .mermaid는 같은 건가요?
같습니다. 두 확장자는 동일한 내용을 담고 서로 바꿔 쓸 수 있습니다. .mmd가 더 일반적이고, 공식 명령줄 도구가 기본으로 쓰는 것도 이쪽입니다.
GitHub에서 .mmd 파일이 다이어그램으로 보이지 않는 이유는?
GitHub가 Mermaid를 그리는 것은 Markdown 파일, 이슈, Discussions, 풀 리퀘스트, 위키 안의 펜스 ```mermaid 블록뿐이기 때문입니다. 단독 .mmd 파일은 소스로 표시됩니다. GitHub에서 보이게 하려면 같은 다이어그램을 .md 파일의 펜스 안에 넣으세요.
아무것도 설치하지 않고 .mmd를 열 수 있나요?
열 수 있습니다. 이 페이지가 그것을 위해 있습니다. 렌더링은 브라우저 안의 JavaScript로 동작하므로 설치할 것이 없고, 파일이 기기 밖으로 나가지도 않습니다.
한글 레이블이 깨져 보입니다
파일의 문자 인코딩이 UTF-8이 아닙니다. 이 페이지는 파일을 UTF-8로 읽습니다(BOM은 문제없이 처리합니다). EUC-KR이나 CP949로 저장되어 있으면 한글 부분이 깨집니다. 편집기에서 인코딩을 UTF-8로 바꿔 다시 저장하세요.
여기서는 되는데 사내 위키에서는 안 됩니다. 왜인가요?
거의 항상 버전 차이입니다. 이 뷰어는 Mermaid 11.12.2이고 많은 위키는 더 오래된 것을 씁니다. GitLab.com은 버전 10이라고 명시하고 있습니다. 그쪽 시스템에서 다이어그램 안에 info라고만 적으면 돌아가는 버전이 표시됩니다.

여기서 열 수 있는 다이어그램 종류

작성: Dominik Malsch · 마지막 업데이트:

편집기 열기 →