본문 바로가기
프로그래밍/기타

[UML] 시퀀스 다이어그램 이해하기

by 사바라다 2020. 5. 15.

[UML] 클래스 다이어그램 이해하기
[UML] 시퀀스 다이어그램 이해하기

안녕하세요. 우리는 이전 포스팅에서 클래스 다이어그램에 대해서 이야기 해본적이 있습니다. 구조 다이어그램(Structural Diagram)의 대표로써 이야기 했었지요. 이어서 오늘은 동적 다이어그램(Behavioral Diagram)의 대표격인 시퀀스 다이어그램에 대해서 알아보는 시간을 가져보도록 하겠습니다.

정의와 목적

시퀀스 다이어그램(Sequence Diagram)은 어떠한 순서로 어떤 객체들과 어떻게 생호작용했는지를 표현하는 다이어그램입니다.이 다이어그램은 현재 존재하는 시스템이 이떠한 시나리오로 움직이고 있는지를 나타내는데 장점을 가지고 있습니다.

시퀀스 다이어그램을 이용하면 API 등의 유즈케이스를 디테일하게 알 수 있습니다. 또한 메서드 콜, DB 조회, 타 시스템의 API 호출등 로직을 모델링할 수 있습니다. 그렇기 때문에 시나리오를 파악하기 좋습니다.

유즈케이스

시퀀스 다이어그램은 다양한 View의 시나리오를 표현할 수 있습니다.

  • Object

    • class, Object 간의 함수, 프로시져의 상호작용을 표현하여 한 서비스(시스템)내에서의 로직을 표현할 수 있습니다.
  • Service

    • Object 보다 좀 더 높은 차원으로 서비스 간의 상호작용을 표현할 수 있습니다.

세부요소

시퀀스 다이어그램에서 사용되는 세부요소에 대해서 자세히 알아보도록 하겠습니다.

LifeLine

모델링 되는 개개의 인스턴스를 나타냅니다. LifeLine은 네모박스와 점선으로 이루어져 있으며 네모박스는 Object 관점이라면 Class, Service 관점이라면 Component가 될것입니다. 그리고 점선은 위에 아래로 내려올수록 시간이 경과됨을 나타냅니다.

lifeLine

Activations

Activations는 LifeLine의 인스턴스가 실제로 다른 인스턴스와 상호작용을 하며 활성화되어있는 것을 나타냅니다.

lifeline과 activations

message

메시지는 실제로 인스턴스간의 주고받는 데이터를 나타냅니다. 일반적으로 request(요청)과 response(응답)으로 구성됩니다.

call Message & return message (sync)

call message는 요청을 하는 메시지입니다. 메시지에 대해서 받은 인스턴스는 특정 작업을 진행할 것입니다. 그리고 작업을 마무리하고 return message를 돌려줍니다. call message를 통해 호출할 때 호출이름(파라미터)의 형식을 가집니다. 그리고 response에 대해서는 반환되는 값을 명시해주시면 됩니다. 아래 이미지는 DB 서비스에 selectPhoto를 실행시키며 파라미터로 id를 전달했습니다. 그리고 DB의 작업 후 photo를 Batch 인스턴스에 return하는 모습을 나타낸 것입니다.

message call & return

call Message (async)

파일을 쓰거나 타 서버와 통신을 할 때 등 우리는 async IO를 진행할 때가 있습니다. IO는 상대적으로 느리기 때문에 그 시간중에 다른일을 같이하기 위해서죠. 이런 async message에 대해서도 시퀀스 다이어그램은 지원해주고 있습니다. sync 메시지가 가득차있는 삼각형 화살표라면 async 메시지는 골격만 가지고 있는 화살표로 표시합니다. 아래 이미지를 참고하시죠.

async call

self & recursive

인스턴스간의 상호작용 뿐만 아니라 하나의 인스턴스에서 처리를 하는 방법도 종종있습니다. 이럴때는 self 메시지를 사용할 수 있습니다. self message는 본인의 lifeline으로 재귀 하는 화살표를 가지고 있습니다.

self call

흐름제어 : guard & Sequence Fragments

프로그램 로직을 구성하다 보면 반드시 작성하게 되는것이 if, for, while 등과 같은 흐름 제어 표현입니다. Sequence Diagram은 시간 순의 인스턴스간의 상호작용을 표현하기 때문에 흐름 제어 표현들이 필요 할 수 있습니다. 이때 사용하는 요소가 guard와 Sequence Fragments입니다.

먼저 guard에 대해서 알아보도록 하겠습니다. guard는 단일 메시지에 대해서 조건을 명시할 수 있는 방법입니다. guard는 메시지의 Text의 앞쪽에 []로 감싼 후 조건을 명시하면 됩니다. 만약 a라는 값이 0보다 커야한다고 한다면 [a>0]으로 명시하면 좋습니다. 아래 이미지는 photo의 갯수를 불러오고 photo.size의 값이 0보다 크다면 putPhoto(photo)로 호출한다는 의미입니다. 만약 size가 0이라면 해당 메시지는 발생하지 않습니다.

guard

guard가 한 메시지에 대해서 조건을 명시했다면, sequnce fragments는 범위로 조건을 명시할 수 있습니다. 즉, 특정 부분에 대해서 일정 부분의 메시지를 반복하던지 조건을 명시하던지 할때는 sequence fragments가 명확할 수 있습니다.

sequnce fragments로 명시할 수 있는 대표적인 것은 3가지 입니다. alternatives, options, loop를 알아보도록 하겠습니다.

alternatives는 줄여서 alt로 표기합니다. 이 타입은 if / else 구문을 나타낼 수 있습니다. 아래의 예제를 보겠습니다. 아래는 alt를 이용한 if / else 구문입니다. 여기서도 if에 대해서 guard를 사용할 수 있습니다. guard를 보시면 id값이 짝수일 경우 입니다. 즉 이 시퀀스 다이어그램은 id가 짝수이면 insertOdd 메시지를 보내고 그렇지 않다면 logging이라는 메시지를 보내는것을 알 수 있습니다.

alternatives

options는 opt로 표기할 수 있습니다. 이 타입은 if 구문을 나타낼 수 있습니다. 아래 예제를 보도록 하겠습니다. 아래는 opt를 이용한 if 구문입니다. guard는 sequence fragments에서도 적용할 수 있으며 이는 opt에서도 마찬가지입니다. 아래 예제에서는 guard로 photo.resolution이 1280이라면 Pixel을 조절한다고 되어있습니다.

options

loop는 우리가 일반적으로 아는 for 또는 while과 같은 loop 구문을 나타낸 seqence fragments입니다. 사용법은 guard로 condition을 작성하며 seqnece fgragments 안에서 로직을 작성하면 됩니다.

loop

예제

seqence diagram example

위에서 구성요소에 대해서 살펴보며 만들어본 Sequence Diagram입니다. 우리는 이 예제가 시퀀스 다이어그램만으로 id를 통해 photo를 가져와 해상도를 조절하는 구나라는 사실을 알 수 있었습니다. 이렇게 시퀀스 다이어그램을 이용하면 시나리오가 어떤 것을 하고자 하는지 이정도면 한눈에 들어온다고 볼 수 있습니다.

마무리

오늘은 이렇게 시퀀스 다이어그램에 대해서 알아보았습니다. 문서를 만드는 것은 개발자로서 가지고 있어야하는 덕목이라고 생각합니다. 하지만 정말 귀찮은 일이라는 것은 누구나 아는 사실입니다. 하지만 클래스 다이어그램, 시퀀스 다이어그램 그리고 API 문서정도는 작성할 줄 아는게 좋은 덕목이지 않을까 생각해 봅니다.

감사합니다.

참조

what-is-sequence-diagram/

understanding-basics-sequence-diagrams

댓글