개발/Architecture & Design Pattern

UML - 시퀀스 다이어그램 (Sequence Diagram)

피로물든딸기 2024. 3. 2. 22:41
반응형

Architecture & Design Pattern 전체 링크

 

참고

- 시퀀스 다이어그램 그리기

- https://www.ibm.com/docs/en/dma?topic=diagrams-interaction-operators-in-sequence

- 싱글턴 패턴

 

시퀀스 다이어그램 (Sequence Diagram)

- 시간에 따른 객체 또는 구성 요소 간의 상호작용을 나타낸다.
- 메시지 교환 순서를 보여주어 시스템의 제어 흐름을 모델링한다.


구성 요소

 

시퀀스 다이어그램에는 다음과 같은 구성 요소가 포함된다.

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

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

- 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(main)ClassAoperationA를 호출하고,

ClassA의 요소인 ClassB에서 operationB를 호출하고 0을 return 받는다.

이때 시퀀스 다이어그램은 다음과 같다.

 

Response (Ack)를 생략해서 다음과 같이 화살표를 그릴 수도 있다.

 

참고로 mermaid에서 그릴 수 있는 화살표는 항상 수평선이지만,

DB 응답 등으로 메서드 요청이 느린 경우(= Time-consuming Message) 방향을 바꿀 수 있다.


메시지 순서

 

다음과 같은 시퀀스 다이어그램이 있다고 하자.

a가 호출된 뒤, b로 응답을 받고, c가 호출되는 것 같지만,

a와 b는 같은 수직선(lifeline)에 있는 반면에, c는 별개의 수직선에 있다.

따라서 메시지 순서는 a → b → c / c → a → b  / a → c → b 가 가능하다.

 

만약 C와 D 사이에 d 가 호출된다고 하면, a, b, d는 의존성이 발생하고, c와 d도 의존성이 발생한다.

d b와 c 모두 끝났을 때 호출이 가능하므로  a → b → c d / c → a → b d / a → c → b d 가 가능하다.


메시지 종류

 

메시지는 sync / ack / async로 나누고 보통 아래와 같이 표시한다.

aysnc는 주로 스레드나 값을 언제 return 받을 지 알 수 없을 때 사용하는 메시지다.

 

객체 인스턴스를 생성한다면 점선 화살표를 사용하고, 제거하는 경우 X 표시를 한다.

새로 생성된 객체는 기존 객체보다 아래에 위치하게 된다.


Fragments and Operator

 

시퀀스 다이어그램은 Fragment를 이용해 흐름을 제어할 수 있다.

Fragment의 각 연산을 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  특정 조건을 만족하면 메시지를 전송하고, 그렇지 않으면 예외를 발생한다.

 

예를 들어 아래 loop는 최소 min번 반복되고, 조건이 만족하는 경우 최대 max번 반복한다.

 

break는 조건을 만족하는 경우, break 내부를 실행하고 바깥의 박스를 빠져나가게 된다.

B에서 C로 메시지를 반복해서 전송하다가 error가 발생하면 B error message를 받고 loop를 빠져나간다.

 

박스가 없는 경우, 시나리오가 종료된다.


Visibility (가시성)

 

Visibility는 어떤 오브젝트가 다른 오브젝트의 publicattributesoperations를 볼 수 있는 능력을 의미한다.

아래 다이어그램에서 A B에게 메시지를 보내려면(A가 B의 operation을 사용하려면), B A에게 보여야 한다.

 

Visibility 종류는 다음과 같다.

 

- Local Visibility : A 클래스에서 get 메서드new를 이용해서 B의 instance를 가져오는 경우

- Global Visibility : B가 전역 접근이 가능한 경우 (싱글턴 패턴)

- Attribute Visibility : A가 B를 가지고 있는 경우 (A가 존재하면 B도 같이 존재)

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

반응형