시퀀스 다이어그램

 

동적 측면을 모델링(클래스 다이어그램은 정적인 측면을 모델링한다)

시간순서에 따라 객체/구성요소간의 상호작용을 표기해서 시스템의 흐름을 모델링하는 다이어그램

 

 

 

시퀀스 다이어그램의 구조

 

1) 구성

- Object : 시스템의 객체 또는 역할

- Message : 객체 간의 상호작용을 나타내는 화살표

- Lifeline(생명선) : 시간의 흐름에 따라 객체의 상태를 보여주는 수직선

- activation : lifeline에 있는 네모, lifeline의 인스턴스가 다른 인스턴스와 상호작용을 하는 중임을 의미

- Participant : 시퀀스 다이어그램에 참여하는 객체

- Condition : 메세지가 전송되기 전 완료해야할 조건

 

예시 코드와 시퀀스 다이어그램

#include <iostream>

using namespace std;

class ClassB
{
public:
	int operationB() { return 0; }
};

class ClassA
{
public:
	void operationA() { int ret = B->operationB(); }

private:
	ClassB* B;
};

int main()
{
	ClassA* A = new ClassA();
	A->operationA();

	return 0;
}

 

위 코드처럼 진행되는 경우 Client가 ClassA객체를 operationA로 호출하고

ClassA가 ClassB객체를 operationB로 호출한 후 0을 return한다.

 

근데 Response(ACK)는 생략해도 된다.

return을 명시적으로 꼭 나타내고 싶을때 작성한다고 생각하면 될듯하다.

 

그리고 한 객체에서 일처리로 인해 메서드 요청이 느린 경우 화살표가 수평선이 아니라 대각선으로도 사용 가능하다.

다만 이게 mermaid에는 구현 안돼있다는것같다.

 

2) 메시지 순서

다른 블로그들은 이 내용이 없는데 한곳만 있어서 더 확인이 필요해보인다.

위와 같은 시퀀스 다이어그램이 있을 때 a - > b와 c가 별개의 수직선에 있다.

a와 b는 A, B객체쪽이고, c는 C, D객체쪽이다.

이런 경우 순서가 꼭 a -> b -> c가 아니라 c -> a -> b도 가능하다는 의미이다.

또는 a -> c -> b도 가능하다.

 

이런식으로 d가 추가된다면 d는 b와 c가 끝난 후에 호출 가능하므로

{ a, b, c, d}, { c, a, b, d }, { a, c, b, d } 순서로 호출이 가능하다는 의미가 된다.

 

결국 핵심은 같은 수직선에 있을때만 위에서 아래로 시간순서인것이고

다른 수직선이면 꼭 아래에 있다고 더 나중 시간은 아닐수도 있다는 뜻인듯하다.

 

3) 메시지 종류

- 동기 메시지(Sync message)
    - 요청을 보낸 후 반환이 올때까지 대기
     - 실선에 채워진 화살표
- 비동기 메시지(Async message)
     - 요청을 보낸 후 반환을 기다리지 않고 다른 작업을 수행
     - 쓰레드같은건 값을 언제 return받을 지 알 수 없으므로
     - 실선에 채워지지 않은 화살표
- 자체 메시지(Self message)
     - 자기 자신에게 요청을 보냄
     - 실선에 채워진 화살표
- 반환 메시지(Reply / return message)
     - 요청에 대한 메시지를 반환  
     - 점선에 채워지지 않은 화살표

 

실선에 채워진 화살표가 메세지를 보내는 sync이다.

점선에 채워지지 않은 화살표가 return 메세지다.

---
title : Sequence Diagram Example
---
sequenceDiagram
    participant A
    participant B

    A ->> +B : Synchronous Message
    B --) -A : Response Message
    A -) B : Asynchronous Message

 

4) Fragments, Operator, Guard

시퀀스 다이어그램은 Fragment를 이용해 흐름을 제어할 수 있다.  
예를들어 if나 반복문같은 내용을 표시하는 방법이다.  

Fragment의 각 연산을 Operator라고 한다.  
Guard는 간단한 한줄에 조건을 거는 것이고 Operator는 좀 더 복잡한 조건문/반복문이라고 보면 될것같다.  
Guard는 단일 메세지에 조건을 붙이는 개념으로 아래와 같은 경우 사용한다.  

가격이 10000원을 넘으면 배송비를 무료로 처리하도록 한다.

가격이 만원을 안넘으면 해당 메세지는 호출되지 않는다.

 

Operator는 아래의 종류가 있다.

operator description
alt  switch or if else 문, 조건에 만족하는 경로를 선택한다.
opt  else가 없는 if문, 조건을 만족하면 실행된다.
loop  메시지 반복 여부를 나타낸다.
break  조건을 만족하면 Box를 빠져나간다. Box가 없다면 시나리오가 종료된다.
seq  기본적으로 생략되며, 메시지의 순차적 진행을 표시한다. (weak order)
strict  엄격한 순서에 따라 메시지가 전송되는 영역을 나타낸다. (strict order)
par  병렬적으로 실행되는 메시지를 나타낸다. 내부 내용들이 동시에 실행된다.
critical  상호 배제를 보장하는 임계 영역을 정의한다. (atomic)
neg  예외 상황 또는 특정 조건이 충족되지 않는 경우의 메시지 시퀀스를 보여준다.
ignore  특정 메시지를 무시하고 다음 단계로 진행한다.
consider  특정 상황에 대한 고려 사항을 표시한다.
assert  특정 조건을 만족하면 메시지를 전송하고, 그렇지 않으면 예외를 발생한다.

 

alt나 opt 예시이다.

 

아래의 시퀀스 다이어그램의 경우 최소 min번, 조건이 맞다면 최대 max번 반복된다는 뜻이다.

 

아래의 다이어그램의 경우 loop를 돌면서 loop내부의 내용을 실행하다가  
break 조건을 만족하면 break내부의 내용을 실행하고 loop를 빠져나간다.  
즉 repeated를 계속 하다가 error가 발생하면 error message를 보내고 loop를 빠져나간다는 의미이다.  

 

5) Visibility(가시성)

A클래스가 B클래스에게 메시지를 보내려면 B클래스의 operationB operation을 사용한다.

그러려면 operationB가 A에게 보여야한다.

 

- Local Visibility : A클래스에서 getter나 new로 B의 객체를 가져오는 경우

- Global Visibility : B가 전역 접근이 가능한 경우

- Attribute Visibility : A가 B를 가지고 있는 경우

- Parameter Visibility : A메소드의 매개변수로 B를 받는 경우(메소드 내에서만 B가 존재)

 

 

 

mermaid 작성법

 

actor나 participant로 오브젝트를 생성할 수 있다.

as로 별명 지정도 가능하다.

---
title: Sequence Diagram example
---
  sequenceDiagram
    actor A
    participant B   
    actor C as Cookie
    participant D as Dragon
    
    A ->> B : step 1  
    B ->> C : step 2
    C ->> D : step 3

 

오브젝트를 생성한 후 화살표로 진행 흐름을 표시하고 : 뒤에 내용을 작성한다.

 

화살표 종류

 

sequenceDiagram
    participant A
    participant B

    A -> B: Solid line without arrow        
    A --> B : Dotted line without arrow     
    A ->> B : Solid line with arrowhead     %% 동기메세지, 자체메세지
    A -->> B : Dotted line with arrowhead   
    A -x B : Solid line with a cross at the end
    A --x B : Dotted line with a cross at the end.
    A -) B : Solid line with an open arrow at the end (async)   %% 비동기메세지
    A --) B : Dotted line with a open arrow at the end (async)  %% 반환메세지

 

상자(activation)를 만들고 싶으면

  sequenceDiagram
    participant A
    participant B

    A ->> +B : Synchronous Message
    B --) -A : Response Message
    
    A -) B : Asynchronous Message

상자가 생기는 지점에 +, 사라지는 지점에 - 를 붙여주면 된다.

다만 화살표 오른쪽에 있는 participant에 적어주면 된다.

 

또는 +, - 대신에 activate, deactivate 문구로 작성할 수도 있다.

 sequenceDiagram
    participant A
    participant B

    A ->> B : Synchronous Message
    activate B

    activate B
    B ->> B : Self Message
    deactivate B

    B --) A : Response Message
    deactivate B
    
    A -) B : Asynchronous Message

 

자기자신에게 메시지를 보내는건 해당 클래스 내에 다른 함수를 호출하는 경우 저런식으로 표기한다.

 

오브젝트 생성/삭제

create와 destroy 문구로 가능하다.

객체를 생성할땐 점선 화살표로 표시된다.
객체를 제거할땐 X표시 화살표로 표시된다.
다만 생성/제거는 create / destroy 문구로 하는거라 화살표를 직접 입력하지는 않는다.
새로 생성된 객체는 기존 객체보다 아래에 위치한다.

 sequenceDiagram
    participant A
    participant B

    A->>B : Quit
    activate B

    create participant Popup
    B --) Popup : Create
    destroy Popup
    B -x Popup : Click Cancel

    B --) A : Response Message
    deactivate B

 

노트와 주석

Note키워드로 메모를 남길 수 있고 %%로 주석을 사용한다.

 sequenceDiagram
    participant A
    participant B

    A ->> +B : Synchronous Message
    %% comment
    Note left of A : A is Actor
    B --) -A : Response Message
    Note over A, B : A <-> B<br/>Interaction
    
    A -) B : Asynchronous Message

 

 

Fragments

loop [text] ~ end

opt [text] ~ end 

break [text] ~ end

 sequenceDiagram
    participant A
    participant B
    
    loop min, max
      A ->> B : repeated
    end

    opt A to B 
      A -) B : optional      
    end

    break A to B  
      A -) B : exception
    end

 

alt [text] ~ [else] ~ end

par [text] ~ [and] ~ end

critical [text] ~ [option] ~ end

 sequenceDiagram
    participant A
    participant B
    
    alt condition 1
      A ->> B : alternative 1
    else condition 2
      A ->> B : alternative 2
    end

    par Action 1
      A ->> B : concurrent 1
    and Action 2
      A ->> B : concurrent 2
    end

    critical must be performed
      A ->> B : atomic 1
      option [Circumstance A]
      A ->> B : atomic 1      
    end

 

 

 

 

 

 

※ 참고 문헌

https://youtu.be/uZsDsmpjxbE?si=4UaIiWR4mGbY7c4e

https://bloodstrawberry.tistory.com/1391

https://bloodstrawberry.tistory.com/1409

https://brownbears.tistory.com/511