플로우차트
그래픽 표현
마인드맵
구조화된 표현
노트
효율적인 표현

상태 다이어그램구문

상태 다이어그램

Mermaid 상태 다이어그램 문법은 plantUml에서 사용되는 문법과 호환되므로 사용자가 mermaid 와 plantUml 사이에서 다이어그램을 더 쉽게 공유할 수 있습니다.

코드
                            
복사
임베드
--- title: Simple sample --- stateDiagram-v2 [*] --> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*]

이전 편집기:

코드
                            
복사
임베드
stateDiagram [*] --> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*]

새 편집기:

상태 다이어그램에서 시스템은 상태와 한 상태가 전환을 통해 다른 상태로 변경되는 방식으로 설명됩니다. 위의 예시 다이어그램은 정지, 이동, 충돌의 세 가지 상태를 보여줍니다. 정지 상태에서 시작하며 정지 상태에서 이동 상태로 변경할 수 있습니다. 이동 상태에서 정지 상태로 돌아가거나 충돌 상태로 변경할 수 있습니다. 정지 상태에서 충돌 상태로의 전환은 없습니다. (정지해 있으면 충돌하지 않습니다.)

状态

여러 가지 방법으로 상태를 선언할 수 있으며, 가장 간단한 방법은 id만으로 상태를 정의하는 것입니다:

코드
                            
복사
임베드
stateDiagram-v2 stateId

또 다른 방법은 state 문법을 사용하고 다음 설명을 추가하는 것입니다:

코드
                            
복사
임베드
stateDiagram-v2 state "This is a state description" as s2

설명이 있는 상태를 정의하는 또 다른 방법은 먼저 상태 ID를 정의한 다음 콜론과 설명을 추가하는 것입니다:

코드
                            
복사
임베드
stateDiagram-v2 s2 : This is a state description

전환

전환은 한 상태가 다른 상태로 진입할 때의 연결선을 말하며, 텍스트 화살표 "-->" 로 표현됩니다.

두 상태 사이의 전환을 정의하고 상태가 아직 정의되지 않은 경우, 정의되지 않은 상태는 전환의 id를 사용하여 정의됩니다. 이후 이 방식으로 정의된 상태에 설명을 추가할 수 있습니다.

코드
                            
복사
임베드
stateDiagram-v2 s1 --> s2

전환에 텍스트를 추가하여 그것이 나타내는 내용을 설명할 수 있습니다:

코드
                            
복사
임베드
stateDiagram-v2 s1 --> s2: A transition

시작과 끝

차트의 시작과 정지를 나타내는 두 가지 특수 상태가 있습니다. 이 두 상태는 [*] 문법으로 표현되며, 해당 상태로의 전환 방향이 시작 상태인지 종료 상태인지를 결정합니다.

코드
                            
복사
임베드
stateDiagram-v2 [*] --> s1 s1 --> [*]

복합 상태

실제 세계에서 상태 다이어그램을 사용할 때, 하나의 상태가 여러 내부 상태를 가질 수 있기 때문에 다차원 다이어그램을 자주 접하게 되며, 이를 복합 상태라고 합니다.

복합 상태를 정의하려면 state 문법 뒤에 id를 붙이고 중괄호 {} 안에 복합 상태의 본문을 작성해야 합니다. 단순 상태를 정의하듯이 별도의 줄에 복합 상태의 이름을 지정할 수 있습니다. 아래 예를 참조하세요:

코드
                            
복사
임베드
stateDiagram-v2 [*] --> First state First { [*] --> second second --> [*] } [*] --> NamedComposite NamedComposite: Another Composite state NamedComposite { [*] --> namedSimple namedSimple --> [*] namedSimple: Another simple }

여러 계층으로 나누어 작업할 수 있습니다:

코드
                            
복사
임베드
stateDiagram-v2 [*] --> First state First { [*] --> Second state Second { [*] --> second second --> Third state Third { [*] --> third third --> [*] } } }

복합 상태 간의 전환도 정의할 수 있습니다:

코드
                            
복사
임베드
stateDiagram-v2 [*] --> First First --> Second First --> Third state First { [*] --> fir fir --> [*] } state Second { [*] --> sec sec --> [*] } state Third { [*] --> thi thi --> [*] }

참고: 서로 다른 복합 상태에 속하는 내부 상태 간의 전환은 정의할 수 없습니다.

선택

때로 두 개 이상의 경로 중에서 선택하는 것을 시뮬레이션해야 할 수 있으며, <<choice>> 를 사용하여 구현할 수 있습니다.

코드
                            
복사
임베드
stateDiagram-v2 state if_state <<choice>> [*] --> IsPositive IsPositive --> if_state if_state --> False: if n < 0 if_state --> True : if n >= 0

분기/병합

<<fork>> <<join>> 을 사용하여 다이어그램에 분기/병합을 지정할 수 있습니다.

코드
                            
복사
임베드
stateDiagram-v2 state fork_state <<fork>> [*] --> fork_state fork_state --> State2 fork_state --> State3 state join_state <<join>> State2 --> join_state State3 --> join_state join_state --> State4 State4 --> [*]

참고

상태 다이어그램에서 주석을 사용하면 더 명확하게 표현할 수 있으며, 주석을 노드의 오른쪽 또는 왼쪽에 배치하도록 선택할 수 있습니다.

코드
                            
복사
임베드
stateDiagram-v2 State1: The state with a note note right of State1 Important information! You can write notes. end note State1 --> State2 note left of State2 : This is the note to the left.

동시성

plantUml 에서와 마찬가지로 하이픈 기호 -- 를 사용하여 동시성을 지정할 수 있습니다.

코드
                            
복사
임베드
stateDiagram-v2 [*] --> Active state Active { [*] --> NumLockOff NumLockOff --> NumLockOn : EvNumLockPressed NumLockOn --> NumLockOff : EvNumLockPressed -- [*] --> CapsLockOff CapsLockOff --> CapsLockOn : EvCapsLockPressed CapsLockOn --> CapsLockOff : EvCapsLockPressed -- [*] --> ScrollLockOff ScrollLockOff --> ScrollLockOn : EvScrollLockPressed ScrollLockOn --> ScrollLockOff : EvScrollLockPressed }

차트 방향 설정

상태 다이어그램의 경우 이 예에서와 같이 방향 문을 사용하여 차트 렌더링 방향을 설정할 수 있습니다.

코드
                            
복사
임베드
stateDiagram direction LR [*] --> A A --> B B --> C state B { direction LR a --> b } B --> D

주석

상태 다이어그램에 주석을 입력할 수 있으며 편집기는 이러한 주석을 무시합니다. 주석은 이중 퍼센트 기호(%%)로 시작해야 하며, 해당 표시부터 다음 줄바꿈 문자 사이의 모든 텍스트는 모든 차트 문법을 포함하여 주석으로 간주됩니다. 주석은 한 줄을 단독으로 차지할 수도 있고 문 끝에 놓을 수도 있습니다.

코드
                            
복사
임베드
stateDiagram-v2 [*] --> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*]

classDefs 를 사용한 스타일 설정

상태 다이어그램 classDef 현재 제한 사항:

1. 시작 또는 종료 상태에 적용할 수 없습니다.

2. 복합 상태 또는 복합 상태 내부에 적용할 수 없습니다.

classDef 문법(즉, class definition의 약자로, 여기서 "class"는 CSS의 클래스와 유사함)을 사용하여 스타일을 정의할 수 있습니다. classDef 뒤에는 스타일 이름이 오고, 이어서 하나 이상의 '속성-값'이 오며, 각 '속성-값'은 유효한 CSS 속성 이름, 콜론(:) 및 해당 값으로 구성됩니다.

다음은 '속성-값'이 하나만 있는 classDef 의 예입니다:

                            
복사
임베드
classDef movement font-style:italic;
  • 스타일 이름은 movement 입니다.
  • 유일한 속성은 font-style 이고 값은 italic 입니다.

여러 '속성-값'을 가지려면 각 '속성-값' 사이에 쉼표(,)를 넣으면 됩니다.

다음은 세 개의 '속성-값'을 포함하는 예입니다:

                            
복사
임베드
classDef badBadEvent fill:#f00,color:white,font-weight:bold,stroke-width:2px,stroke:yellow
  • 스타일 이름은 badBadEvent 입니다.
  • 첫 번째 속성은 fill 이고 그 값은 #f00 입니다.
  • 두 번째 속성은 color 이고 그 값은 white 입니다.
  • 세 번째 속성은 font-weight 이고 그 값은 bold 입니다.
  • 네 번째 속성은 stroke-width 이고 그 값은 2px 입니다.
  • 다섯 번째 속성은 stroke 이고 그 값은 yellow 입니다.

classDef 스타일을 상태에 적용

classDef 스타일을 상태에 적용하는 두 가지 방법이 있습니다:

  • class 문법을 사용하여 하나의 문에서 하나 이상의 상태에 classDef 스타일을 적용합니다.
  • ::: 연산자를 사용하여 상태가 전환 문에 사용될 때 classDef 스타일을 적용합니다(예: 다른 상태를 향하거나 다른 상태에서 오는 화살표가 있는 경우)

1. class 문

class 문은 Mermaid 에게 지정된 classDef 를 하나 이상의 클래스에 적용하도록 지시합니다. 형식은 다음과 같습니다:

                            
복사
임베드
class [one or more state names, separated by commas] [name of a style defined with classDef]

다음은 badBadEvent 스타일을 Crash 라는 상태에 적용하는 예입니다:

                            
복사
임베드
class Crash badBadEvent

다음은 movement 스타일을 Moving 과 Crash 두 상태에 적용하는 예입니다:

                            
복사
임베드
class Moving,Crash movement

여기 예가 있습니다. Crash 상태에 두 개의 classDef 스타일(movement 와 badBadEvent)이 적용되어 있습니다.

코드
                            
복사
임베드
stateDiagram direction TB accTitle: This is the accessible title accDescr: This is an accessible description classDef notMoving fill:white classDef movement font-style:italic classDef badBadEvent fill:pink,color:white,font-weight:bold,stroke-width:2px,stroke:yellow [*]--> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*] class Still notMoving class Moving, Crash movement class Crash badBadEvent class end badBadEvent

2. ::: 연산자를 사용하여 상태에 스타일 적용

::: 연산자를 사용하여 classDef 스타일을 상태에 적용할 수 있습니다. 문법은 다음과 같습니다:

                            
복사
임베드
[state]:::[style name]

클래스를 사용하는 문에서 적용할 수 있으며, 여기에는 시작 상태와 종료 상태가 포함됩니다. 예:

코드
                            
복사
임베드
stateDiagram direction TB accTitle: This is the accessible title accDescr: This is an accessible description classDef notMoving fill:white classDef movement font-style:italic; classDef badBadEvent fill:pink,color:white,font-weight:bold,stroke-width:2px,stroke:yellow [*] --> Still:::notMoving Still --> [*] Still --> Moving:::movement Moving --> Still Moving --> Crash:::movement Crash:::badBadEvent --> [*]

상태 이름의 공백

먼저 id를 사용하여 상태를 정의한 다음, 나중에 해당 id를 참조하여 상태에 공백을 추가할 수 있습니다.

다음 예에는 ID 가 yswsii 이고 ''Your state with spaces in it'' 로 설명되는 상태가 있습니다. 정의 후 yswsii 는 차트의 첫 번째 전환([*] --> yswsii)과 YetAnotherState 로의 전환(yswsii --> YetAnotherState)에서도 사용됩니다. yswsii 는 다른 상태와 다르게 보이도록 스타일이 설정되었습니다.

코드
                            
복사
임베드
stateDiagram classDef yourState font-style:italic,font-weight:bold,fill:white yswsii: Your state with spaces in it [*] --> yswsii:::yourState [*] --> SomeOtherState SomeOtherState --> YetAnotherState yswsii --> YetAnotherState YetAnotherState --> [*]