[UML] 시퀀스 다이어그램(Sequence Diagram)
시퀀스 다이어그램(Sequence Diagram)
환경
- UML
시퀀스 다이어그램(Sequence Diagram)
시퀀스 다이어그램(Sequence Diagram)
- 시퀀스 다이어그램(Sequence Diagram): 객체들의 상호작용을 시간에 따라 표현한 UML 다이어그램

시퀀스 다이어그램(Sequence Diagram) 기본 표기법
- 객체(Object): 시퀀스 다이어그램에서 상호작용하는 개체(객체 또는 클래스)로 각 객체는 다이어그램 상단에 배치되며 수평선으로 이어진 생명선이 있다.
- 생명선(Lifeline): 객체의 존재와 상호작용이 시간에 따라 어떻게 이어지는지를 나타내는 점선으로 객체의 생명주기를 표현하며 시간은 위에서 아래로 흐른다. 활성화 된 경우에는 직사각형으로 표시된다.
- 메시지(Message): 객체들의 상호작용에 사용하는 요청 또는 응답으로 화살표로 표시된다.

메시지 유형
- 동기 메시지: Sender가 요청 후 응답 메시지를 받을 때까지 기다린다. 아래 그림처럼 화살표로 표시된다.
- 비동기 메시지: Sender가 요청 후 응답 메시지를 기다리지 않고 계속 하던 작업을 진행한다. 아래 그림처럼 화살표가 표시된다.
- 반환 메시지: 아래처럼 표시되며 불분명할 때는 생략 가능하다.

Combined Fragments
Guards
객체 간 소통 흐름을 표시할 때 조건을 이용해 흐름 제어를 하는 부분을 Guards라고 한다. 아래 IBM 문서에서는 “[pastDueBalance = 0]”로 나와있다.

Combined Fragments
시퀀스 다이어그램에서 흐름을 제어할 때 사용하는 여러 조건들이 있는데 아래와 같이 여러가지가 있다.
- Branches and Loops
- alt
- opt
- loop
- break
- Concurrency and Order
- seq
- strict
- par
- critical
- Filters and Assertions
- ignore
- consider
- assert
- neg
alt, opt
- alt: switch문으로 생각하면 되며 여러 조건을 명시해 흐름을 제어할 수 있다.
- opt: if문으로 생각하면 되며 하나의 특정 조건에 따른 흐름을 제어할 수 있다.




loop
- loop: 조건에 따른 반복문을 사용해 흐름을 제어할 수 있다.
- 아래의 경우 “[size<0]”을 만족하면 5부터 10까지 반복하는 경우다.


break
- break: 코드에서 exception과 같은 부분으로 조건을 만족하면 해당 fragment를 수행하고 기존에 남은 부분들을 수행하지 않고 바깥 fragment를 빠져나간다.
- 만약 아래의 경우에서 break fragment 아래 다른 내용들이 더 있었다면 해당 내용을 수행하지 않고 loop를 빠져나간다.


seq, strict
- seq: 기본으로 탑재되는 fragment로 기본 순서라 보면 된다.
- strict: 점선으로 나눠진 부분이 차례로 실행되어야 하는 분명한 순서가 존재하는 fragment다.
관련한 좋은 그림이 있어서 다른 블로그에서 가져왔다. seq와 strict의 차이를 알 수 있다. 마지막 그림의 경우 search_google() → search_bing() → search_yahoo() 순서다.



par
- par: parallel의 앞 글자로 말 그대로 병렬로 수행할 수 있는 걸 표현할 때 쓸 수 있다.
- 점선으로 나누어진 fragment별로 상호 간섭 없이 독립적으로 실행될 수 있다.
- 어떤 문서에서는 실제 parallelism은 아니고 concurrency라고 표현한 걸 봤다.
- 아래의 그림에서 add()와 remove()를 parallel하게 요청한다고 볼 수 있다.

critical
- critical: Atomic Area로 상호작용을 독점적으로 실행하고, 다른 요소들의 간섭을 방지할 때 사용한다.
- 해당 critical fragment 안에서의 순서는 기본 값인 seq와 동일하다.
- critical fragment에 들어온 경우에는 다른 메시지 상호작용이나 인터럽트 없이 해당 구역을 다 우선 수행하고 진행한다고 보면 된다.
- 아래의 그림의 경우 add()와 remove()가 순서 관계 없이 add()→remove() 또는 remove()→add() 이렇게 진행될 수 있지만 critical fragment에서는 둘 중 하나만 실행하고 다음 요청을 처리한다.

ignore
- ignore: 특정 유형의 메시지들을 무시하기 위해 사용한다.
- {} 안에 무시할 메시지를 명시한다.
- 아래의 경우 명시된 get과 set이 무시된다.

consider
- consider: 특정 유형의 메시지들을 표시하고 강조하고 나머지는 무시하기 위해 사용한다.
- {} 안에 강조하거나 표시할 메시지를 명시한다.
- 아래의 경우 add와 remove만 고려하고 다른 메시지는 무시한다고 보면 된다.

assert
- assert: 항상 참이어야 하는 상호작용의 일부를 정의하는 데 사용된다고 한다.
- {}로 조건이 명시되기도 하는데 해당 조건을 반드시 만족해야 한다.
neg
- neg: 유효하지 않거나 오류가 난 경우를 표현하기 위해 사용한다.
- neg가 아닌 모든 부분들은 정상 작동된 경우로 가정한다.
- 아래의 경우 timeout이 난 경우에는 잘못된 경우라는 표현이다.

기타
Reference
- 하나의 시퀀스 다이어그램과 다른 시퀀스 다이어그램을 연결할 때 사용하는 방법이다. ref 안에 다른 시퀀스 다이어그램이 존재한다고 보면 된다.

참고자료
- https://en.wikipedia.org/wiki/Sequence_diagram
- https://developer.ibm.com/articles/the-sequence-diagram/
- https://www.uml-diagrams.org/sequence-diagrams-combined-fragment.html
- https://jsdysw.tistory.com/334
- https://www.geeksforgeeks.org/unified-modeling-language-uml-sequence-diagrams/
- https://www.omg.org/spec/UML/2.5.1