본문 바로가기
Concepts/UML

UML - 시퀀스 다이어그램 - 개요

by ocwokocw 2021. 2. 10.

- 이 글은 UML Distilled (마틴 파울러)책을 기반으로 작성하였습니다.

- 개요

교류 다이어그램(Interaction diagram)은 어떤 행동에서 객체들의 상호작용을 나타낸다. UML은 여러 종류의 교류 다이어그램이 있는데 그 중 시퀀스 다이어그램이 가장 많이 쓰인다. 보통 시퀀스 다이어그램은 한 가지 시나리오를 묘사하는데 예제를 살펴보자.

 

Order는 주문받은 모든 주문 품목(Order Line)을 보고 가격을 계산한다. 계산은 품목별 주문 내역(Order Line)의 상품(Product) 의 계산에 의해 이루어진다. 모든 Line Item 에 대해 계산이 끝나면 고객(Customer)에 대해 정의된 규칙에 따라 전체 할인을 계산한다.

시퀀스 다이어그램에서 쓰이는 용어를 위 다이어그램 예제를 들어 몇 가지 정리해보자.

  • 참가자: 다이어그램에서 an Order, an Order Line, a Product, a Customer를 가리킨다. 완전한 문법은 이름 : 클래스이다. 이름, 클래스는 선택사항이지만 클래스를 표기할 경우 :를 붙여야 한다.
  • 생명선: 각 참자가 아래 세로로 그어진 점선
  • 활성: 교류에서 참가자가 언제 활성인지를 보여주는 막대이다. 참가자의 메소드중 하나에 대응된다.
  • 메시지: 다른 참가자에게 보내는 메시지이다. 위 다이어그램에서 an Order는 2: getQuantity 나 3: getProduct 메시지를 an Order Line에게 보내고 있다.
  • 자기호출: 6: calculateBasePrice()나 7: calculateDiscounts() 호출처럼 자기자신을 호출한다.
  • 리턴: 4.aProduct 처럼 메소드의 리턴이다. 리턴은 점선 화살표로 표시한다.

위 다이어그램에서 3: getProduct() 호출에서 4: aProduct가 리턴 표시된것을 볼 수 있다. 하지만 사실 5: getPricingDetails() 에서도 aProduct가 리턴되는데 이를 표시하지 않았다. 리턴이 될 때 마다 다 표시해도 되지만 그렇게되면 시퀀스 다이어그램을 알아보기가 힘들어진다. 그래서 추가적인 정보를 줄 때만 표시하기도 하며, 심지어는 그런 경우이더라도 생략하기도 한다. 앞서도 말했지만 UML 사용시 모든것을 꼭 표시해야한다는 강박을 가지면 안된다.


- 다른 관점의 다이어그램

현실 세계의 문제를 해결하는 방법이 유일하지 않듯이, 앞서 설명한 시나리오를 다른 방식의 시퀀스 다이어그램으로도 표현할 수 있다.

위 다이어그램에서는 Order는 가격 계산을 Order Line 에게 맡긴다. Order Line은 다시 Product 에 가격 계산을 요청한다. Order는 할인가를 계산하기 위해 Customer에 요청한다.

 

1번째 시퀀스 다이어그램은 Order를 기반으로한 중앙 집중형 제어 였다면 2번째 다이어그램은 분산 제어형이다.

 

두 형식 모두 장단점이 존재한다. 중앙 집중형은 전체적인 흐름을 한눈에 파악하기 편하고 단순하다. 반면 분산 제어형은 시나리오를 파악하려면 흐름을 따라가야 한다. 대신 분산 제어형처럼 설계하면 변경의 영향을 최소화할 수 있다. 데이터와 해당 데이터의 행위가 한곳에 집중되기 때문에 변경의 이유가 하나라면 하나의 참가자만 변경한다.

또한 분산 제어로 설계하면 다형성도 더 쉽게 사용가능하다. 제품마다 어떤 행위가 다르다면 Product 하위 클래스를 이용하여 해당 행위를 커스터마이징 할 수 있다.

 

분산 제어형은 객체 설계에 익숙하지 않은 사람이 시도하기 쉽지 않지만, 익숙해지면 변경의 영향도가 적고 다형성을 이용할 기회가 많아지므로 객체 설계를 잘하고 싶다면 연습해보는것도 좋은 방법일것이다.

 

댓글