이번 장에서는 PlantUML을 이용하여 UML Diagram을 작성하는 방법에 대해 살펴보겠습니다. UML이란 Unified Modeling Language의 약자로서 통합 모델링 언어라고 합니다. UML은 아래 이미지와 같이 모델 간의 관계나 Process Flow 등을 시각적으로 표현하는 Diagram을 작성하는 데 사용합니다.

PlantUML은 간단한 텍스트를 이용하여 멋진 UML Diagram을 만들 수 있는 오픈소스 도구입니다. 텍스트로 작성되므로 Git과 같은 형상관리 툴 적용이 가능합니다. 소스 관리가 되므로 협업이 가능하며 언제든 변경 이력을 확인 하고 이전 내역으로도 복구가 가능합니다. 자세한 사용법은 아래 링크에서 확인할 수 있습니다.

https://plantuml.com/ko/

PlantUML을 이용하면 아래와 같은 다양한 형태의 Diagram을 쉽게 작성할 수 있습니다.

PlantUML로 UML Diagram 작성하기

UML 언어로 문서를 작성하면 시각적인 Diagram 형태로 변환하여 출력할 수 있습니다. PlantUML 문서 작성을 도와주는 몇 가지 도구에 대해 알아보겠습니다.

PlantUML Online

온라인에서 UML Diagram을 작성할 수 있는 PlantUML Web Server입니다. 추가적인 프로그램 설치 없이 UML을 작성하고 Diagram을 확인할 수 있는 가장 간단한 방법입니다. 작성된 UML Diagram은 마우스 오른쪽 메뉴를 호출하여 이미지로 다운로드 받을 수 있습니다.

http://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000

WordPress PlantUML Plugin

워드프레스에서 제공하는 PlantUML Plugin을 이용하면 문서 내에 UML Diagram을 Embed 할 수 있습니다. 다만 이 plugin의 경우 오래전에 만들어지고 업데이트가 되지 않아 최신 워드프레스에서 호환이 되지 않을 수 있습니다.

[plantuml]
Alice -> Bob: Authentication Request 
Bob --> Alice: Authentication Response 
Alice -> Bob: Another authentication Request 
Alice <-- Bob: another authentication Response 
[/plantuml]

Intellij PlantUML Plugin

Intellij에 PlantUML Plugin을 설치하면 IDE에서 문서를 작성하고 바로 Diagram을 확인할 수 있습니다. 오프라인에서도 사용할 수 있다는 장점이 있으며 렌더링 속도도 빠릅니다. 만들어진 UML Diagram은 저장 버튼을 눌러 PNG 이미지로 다운로드할 수 있습니다. IDE에서 작성하기 때문에 GitHub와 연동이 수월합니다. GitHub를 연동해두면 코드가 자주 변경되더라도 변경사항을 추적할 수 있고 협업에도 유리한 장점이 있습니다. 개인적으로 추천하는 방식입니다.

UML은 직관적인 언어로 정의되어 있습니다. 몇 가지 다이어그램을 직접 작성해 보면서 어떻게 동작하는지 실습해 보겠습니다.

시퀀스 다이어그램

시퀀스 다이어그램은 가장 많이 사용되는 다이어그램으로 두 참여자 간에 주고받는 메시지 흐름을 그려야 할 때 유용합니다.

  • 각각의 참여자는 선언하는 것만으로도 도형이 생성됩니다 ex) Foo1
  • 참여자 간의 화살표는 ->과 –>을 사용하여 그릴 수 있습니다. ->은 실선, –>은 점선이 출력됩니다.
  • 화살표 위에 설명을 붙이려면 : 뒤에 설명을 쓰면 됩니다.
  • 참여자 선언 시 키워드(actor ~ collections)를 사용하면 화면에 출력되는 참여자의 모습을 변경할 수 있습니다.
@startuml
actor Foo1
boundary Foo2
control Foo3
entity Foo4
database Foo5
collections Foo6
Foo1 -> Foo2 : To boundary
Foo1 -> Foo3 : To control
Foo1 -> Foo4 : To entity
Foo1 --> Foo5 : To database
Foo1 --> Foo6 : To collections
@enduml

#배경색 : 참여자의 배경색 설정

참여자를 선언하고 ‘#색상’을 문서에 적용하면 참여자 배경색을 설정할 수 있습니다.

@startuml
actor Foo1 #red
boundary Foo2 #blue
control Foo3 #orange
entity Foo4 #EF1010
database Foo5 #101010
collections Foo6
Foo1 -> Foo2 : To boundary
Foo1 -> Foo3 : To control
Foo1 -> Foo4 : To entity
Foo1 --> Foo5 : To database
Foo1 --> Foo6 : To collections
@enduml

order 키워드 : 참여자의 출력 순서를 지정

참여자에 “order 순번”을 설정하면 숫자가 낮은 참여자부터 순서대로 출력됩니다.

@startuml
actor Foo1 order 10 #red 
boundary Foo2 order 200 #blue
control Foo3 order 5 #orange
entity Foo4 order 100 #EF1010
database Foo5 order 2 #101010
collections Foo6 order 1
Foo1 -> Foo2 : To boundary
Foo1 -> Foo3 : To control
Foo1 -> Foo4 : To entity
Foo1 --> Foo5 : To database
Foo1 --> Foo6 : To collections
@enduml

참여자 자신에게 메시지 보내기

양쪽 참여자를 동일하게 설정하고 화살표를 지정하면 되돌아오는 화살표로 화면에 표시됩니다.

@startuml
actor Foo1 order 10 #red
Foo1 -> Foo1 : 참여자는 자기 자신에게 화살표를 지정 하여 자신에게 메시지를 보낼 수 있다.\n \\n을 이용해서 여러줄로 쓰는것 도 가능하다.
@enduml

화살표 양쪽 끝 디자인 변경

@startuml
Foo ->x Bar
Foo -> Bar
Bob ->> Bar
Foo -\ Bar
Foo \\- Bar
Foo //-- Bar
Foo ->o Bar
Foo o\\-- Bar
Foo <-> Bar
Foo <->o Bar
@enduml

화살표 색상 변경

@startuml
Bob -[#green]> Alice : hello
Alice -[#red]->Bob : hello
@enduml

autonumber : 메시지 순서에 번호 매기기

autonumber [시작번호]의 형태로 표시하면 특정번호로 시작할 수 있으며 autonumber [시작번호] [증가값]으로 표시할 경우 증가값만큼 번호가 +되어 매겨집니다.

@startuml
autonumber
Bob -> Alice : Authentication Request
Bob <- Alice : Authentication Response
autonumber 15
Bob -> Alice : Another authentication Request
Bob <- Alice : Another authentication Response
autonumber 40 10
Bob -> Alice : Yet another authentication Request
Bob <- Alice : Yet another authentication Response
@enduml

페이지 제목, 머리말 꼬리말

title 키워드를 이용하여 페이지에 제목을 추가할 수 있습니다.
또한 header와 footer를 사용하여 머리말과 꼬리말도 표현할 수 있습니다.

@startuml
header 페이지헤더
footer Page %page% of %lastpage%
title 제목
Alice -> Bob : message 1 
Alice -> Bob : message 2
@enduml

메시지 그룹화 하기

다음과 같은 키워드들을 사용하여 메시지를 그룹화할 수 있습니다.

  • alt/else
  • opt
  • loop
  • par
  • break
  • critical
  • group
@startuml
Alice -> Bob: Authentication Request
alt successful case
Bob -> Alice: Authentication Accepted
else some kind of failure
Bob -> Alice: Authentication Failure
group My own label
Alice -> Log : Log attack start
loop 1000 times
Alice -> Bob: DNS Attack
end
Alice -> Log : Log attack end
end
else Another type of failure
Bob -> Alice: Please repeat
end
@enduml

메시지에 노트 추가하기

메시지 다음에 note left 나 note right 키워드를 이용하여, 메시지에 노트를 추가할 수 있습니다. 한 번에 여러 줄의 노트를 추가하는 경우에는 end note 를 이용하여, 노트의 끝을 표시해 주어야 합니다. note left of , note right of, note over 키워드를 이용하여 참여자의 상대적인 위치에 노트를 추가할 수 도 있습니다. 노트의 배경색을 변경 함으로써 노트를 강조하는 것도 가능합니다.

@startuml
participant Alice
participant Bob
note left of Alice #aqua
This is displayed
left of Alice.
end note
note right of Alice: This is displayed right of Alice.
note over Alice: This is displayed over Alice.
note over Alice, Bob #FFAAAA: This is displayed\n over Bob and Alice.
note over Bob, Alice
This is yet another
example of
a long note.
end note
@enduml

시퀀스 다이어그램으로 비즈니스 로직 Flow Diagram 작성 예제

@startuml
title 뽑기권 페이지 진입 시 필요 정보 조회 - 포인트로 뽑기권 돌릴때\n(giftboxService.getDrawingInfoUsingPointV2)
actor Client
Client -> Membership: /v2/gift/drawing/info( usePoint == true )
Membership -> Admin : 포인트 캠페인 정보 조회
Membership <- Admin : 데이터 있음
Membership -> Point : 포인트 잔액 조회
Membership -> Point : 전체대상 선물함 조회\n(GIFT_BOX)
Membership <- DB : 포인트 잔액이 있으나 캠페인 Prize price보다 적음
Membership -> Client : not available point amount\n(isSufficientPoint = false)
Membership -> Membership : 포인트 뽑기권 유효 체크(캠페인 종료일자 체크)
Membership -> Admin : 뽑기권이 유효하면 리워드 정보 조회
Membership -> Membership : 메인 리워드 타입 결정
Membership -> Point : 포인트 사용된 리워드인지 조회
group 받은 리워드인 경우
Membership -> Admin : 전체 리워드 아이템 조회
Membership -> Membership: 리워드 정보 or 뽑기권 아이템정보 or 받은 뽑기권 정보가 없음
Membership -> Client: No corresponding gift
Membership -> Curation: 컨텐츠 정보 조회
Membership -> BI: 지급된 리워드 정보 조회
Membership -> Membership: 받은 정보 취합
end group
Membership -> Client : 뽑기권 정보 전달\n(유효여부, 뽑기권 정보, 메인 리워드 정보 등...)
@enduml

클래스 다이어그램

클래스 다이어그램은 클래스 간에 관계를 표현하는 다이어그램을 그리는데 유용합니다. 아래와 같이 클래스 간의 관계를 표현하기 위한 다양한 방법을 제공합니다.

@startuml
Class01 <|-- Class02
Class03 *-- Class04
Class05 o-- Class06
Class07 .. Class08
Class09 -- Class10
@enduml
@startuml
Class11 <|.. Class12
Class13 --> Class14
Class15 ..> Class16
Class17 ..|> Class18
Class19 <--* Class20
@enduml
@startuml
Class21 #-- Class22
Class23 x-- Class24
Class25 }-- Class26
Class27 +-- Class28
Class29 ^-- Class30
@enduml

클래스 다이어그램을 이용한 Table간 관계 Diagram 작성 예제

@startuml
entity "board" as board {
    *board_id : bigint(19) <<generated>>
    --
    name : varchar(255)
    created_at : datetime
    modified_at : datetime
}

entity "post" as post {
   post_id : bigint(19) <<generated>>
   --
   * board_id : bigint(19) <<FK>> - Board ID
   * msrl : bigint(19) <<FK>> - 회원번호
   title : varchar(255) - 타이틀
   author : varchar(255) - 작성자
   content : varchar(255) - 내용
   created_at : datetime
   modified_at : datetime

}

entity "user" as user {
   msrl : bigint(19) <<generated>>
   --
   uid : bigint(19)
   name : varchar(100) - 이름
   password : varchar(100) - 비밀번호
   provider : varchar(100) - 서비스 제공자
   content : varchar(255) - 내용
   created_at : datetime
   modified_at : datetime

}

board --{ post
post }-- user
@enduml

액티비티 다이어그램

어떠한 일을 처리하는 과정을 순서대로 도식화하는 flowchart를 손쉽게 그릴 수 있도록 도와주는 다이어그램입니다.

@startuml
(*) --> "Initialization"
if "Some Test" then
-->[true] "Some Activity"
--> "Another activity"
-right-> (*)
else
->[false] "Something else"
-->[Ending process] (*)
endif
@enduml

복잡한 형태의 flow chart 작성 예제

@startuml
start
:ClickServlet.handleRequest();
:new page;
if (Page.onSecurityCheck) then (true)
:Page.onInit();
if (isForward?) then (no)
:Process controls;
if (continue processing?) then (no)
stop
endif
if (isPost?) then (yes)
:Page.onPost();
else (no)
:Page.onGet();
endif
:Page.onRender();
endif
else (false)
endif
if (do redirect?) then (yes)
PlantUML 언어참조가이드 (1.2019.9) 73 / 171
5.15 Complete example 5 ACTIVITY DIAGRAM (BETA)
:redirect process;
else
if (do forward?) then (yes)
:Forward request;
else (no)
:Render page template;
endif
endif
stop
@enduml

여기까지 plantUML을 사용하여 UML Diagram을 그리는 방법에 대해 알아보았습니다. plantUML을 이용하면 작성자의 응용에 따라 무궁무진한 내용을 시각적으로 표현 가능합니다.

포스팅에서는 대표적으로 사용하는 다이어그램에 대해서만 간단히 알아봤지만 다음 레퍼런스 가이드를 참고하면 보다 복잡하고 어려운 로직의 Diagram도 작성할 수 있을 것입니다.

https://daddyprogrammer.org/wp-content/uploads/2020/06/PlantUML_Language_Reference_Guide_ko.pdf

PlantUML 레퍼런스 가이드

PlantUML_Language_Reference_Guide_ko