# PlantUML ## Editor - https://plantuml-editor.kkeisuke.com/ ## plantuml 사용법 [[http://plantuml.com/index.html|홈페이지]]에 있는 내용입니다. ## 종합 비교 ``` A -> B note right : 기본으로 시퀀스가 그려집니다. ``` A -> B note right : 기본으로 시퀀스가 그려집니다. :A: -> (B) note left of A : :: 을 사용하여 액터로 표시. note right of B : () 을 사용하여 유즈케이스로 표시. :A: -> (B) note left of A : :: 을 사용하여 액터로 표시. note right of B : () 을 사용하여 유즈케이스로 표시. A -> B B : B클래스 note right of B : : 를 사용하여 클래스로 표시 A -> B B : B클래스 note right of B : : 를 사용하여 클래스로 표시 :A; :B; note right : :; 를 사용하여 액티비티로 표시 :A; :B; note right : :; 를 사용하여 액티비티로 표시 ()A -> [B] note left of A : () 을 사용하여 인터페이스로 표시. note right of B : [] 을 사용하여 컴포넌트로 표시. ()A -> [B] note left of A : () 을 사용하여 인터페이스로 표시. note right of B : [] 을 사용하여 컴포넌트로 표시. [*] -> A A : A State note right of A : [*] 을 사용하여 스테이트로 표시. [*] -> A A : A State note right of A : [*] 을 사용하여 스테이트로 표시. ## Sequence ### Basic examples * 화살표 \-\> * 점선 \-\-\> Alice -> Bob: Authentication Request Bob --> Alice: Authentication Response Alice -> Bob: Another authentication Request Alice <-- Bob: another authentication Response Alice -> Bob: Authentication Request Bob --> Alice: Authentication Response Alice -> Bob: Another authentication Request Alice <-- Bob: another authentication Response ### 주석 * 한줄 주석 : ' 로 시작 * 문단 주석 : /' ........... '/ ### Declaring participant actor Foo1 boundary Foo2 control Foo3 entity Foo4 database Foo5 Foo1 -> Foo2 : To boundary Foo1 -> Foo3 : To control Foo1 -> Foo4 : To entity Foo1 -> Foo5 : To database actor Foo1 boundary Foo2 control Foo3 entity Foo4 database Foo5 Foo1 -> Foo2 : To boundary Foo1 -> Foo3 : To control Foo1 -> Foo4 : To entity Foo1 -> Foo5 : To database #### 색 지정 actor Bob #red ' The only difference between actor 'and participant is the drawing participant Alice participant "I have a really\nlong name" as L #99FF99 /' You can also declare: participant L as "I have a really\nlong name" #99FF99 '/ Alice->Bob: Authentication Request Bob->Alice: Authentication Response Bob->L: Log transaction actor Bob #red ' The only difference between actor 'and participant is the drawing participant Alice participant "I have a really\nlong name" as L #99FF99 /' You can also declare: participant L as "I have a really\nlong name" #99FF99 '/ Alice->Bob: Authentication Request Bob->Alice: Authentication Response Bob->L: Log transaction ### Participant creation Bob -> Alice : hello create Other Alice -> Other : new create control String Alice -> String note right : You can also put notes! Alice --> Bob : ok Bob -> Alice : hello create Other Alice -> Other : new create control String Alice -> String note right : You can also put notes! Alice --> Bob : ok ## Use Case Diagram ### Usecases * 괄호를 사용해서 표현 ( ) * usecase 키워드 사용 (First usecase) (Another usecase) as (UC2) usecase UC3 usecase (Last\nusecase) as UC4 (First usecase) (Another usecase) as (UC2) usecase UC3 usecase (Last\nusecase) as UC4 ### Actors * 콜론을 사용해서 표현 : : * actor 키워드 사용 :First Actor: :Another\nactor: as Men2 actor Men3 actor :Last actor: as Men4 :First Actor: :Another\nactor: as Men2 actor Men3 actor :Last actor: as Men4 ### 확장 * <|-- 심볼 사용 :Main Admin: as Admin (Use the application) as (Use) User <|-- Admin (Start) <|-- (Use) :Main Admin: as Admin (Use the application) as (Use) User <|-- Admin (Start) <|-- (Use) ### 노트 * note left of * note right of * note top of * note bottom * .. : 점선연결 :Main Admin: as Admin (Use the application) as (Use) User -> (Start) User --> (Use) Admin ---> (Use) note right of Admin : This is an example. note right of (Use) A note can also be on several lines end note note "This note is connected\nto several objects." as N2 (Start) .. N2 N2 .. (Use) :Main Admin: as Admin (Use the application) as (Use) User -> (Start) User --> (Use) Admin ---> (Use) note right of Admin : This is an example. note right of (Use) A note can also be on several lines end note note "This note is connected\nto several objects." as N2 (Start) .. N2 N2 .. (Use) ### 화살표 방향 변경 * \-\- : 수직 연결 * \- : 수평 연결 * .. : 점선 연결 * left, right, up or down :user: -left-> (dummyLeft) :user: -right-> (dummyRight) :user: -up-> (dummyUp) :user: -down-> (dummyDown) :user: -left-> (dummyLeft) :user: -right-> (dummyRight) :user: -up-> (dummyUp) :user: -down-> (dummyDown) ### 방향 * 기본 : top to bottom * 변경 : top to bottom left to right direction user1 --> (Usecase 1) user2 --> (Usecase 2) left to right direction user1 --> (Usecase 1) user2 --> (Usecase 2) ### Complete example left to right direction skinparam packageStyle rect actor customer actor clerk rectangle checkout { customer -- (checkout) (checkout) .> (payment) : include (help) .> (checkout) : extends (checkout) -- clerk } left to right direction skinparam packageStyle rect actor customer actor clerk rectangle checkout { customer -- (checkout) (checkout) .> (payment) : include (help) .> (checkout) : extends (checkout) -- clerk } ## Class Diagram ### Relations between classes |Extension| <%%|%%\-\- | |Composition| *\-\- | |Agregation| o\-\- | scale 900 width Class01 <|-- Class02 Class03 *-- Class04 Class05 o-- Class06 Class07 .. Class08 Class09 -- Class10 Class11 <|.. Class12 Class13 --> Class14 Class15 ..> Class16 Class17 ..|> Class18 Class19 <--* Class20 scale 900 width Class01 <|-- Class02 Class03 *-- Class04 Class05 o-- Class06 Class07 .. Class08 Class09 -- Class10 Class11 <|.. Class12 Class13 --> Class14 Class15 ..> Class16 Class17 ..|> Class18 Class19 <--* Class20 ### Label on relations * cardinality : "" * label : : Class01 "1" *-- "many" Class02 : contains Class03 o-- Class04 : agregation Class05 --> "1" Class06 Class01 "1" *-- "many" Class02 : contains Class03 o-- Class04 : agregation Class05 --> "1" Class06 ### Defining visibility ^ Character ^ Visibility ^ |-|private| |#|protected| |~|package private| |+|public| class Dummy { -field1 #field2 ~method1() +method2() } class Dummy { -field1 #field2 ~method1() +method2() } ### Abstract and Static * {abstract} * {static} or {classifier} class Dummy { {static} String id {abstract} void methods() } class Dummy { {static} String id {abstract} void methods() } ### Advanced class body * \-\- * .. * == * \_\_ class Foo1 { You can use several lines .. as you want and group == things together. __ You can have as many groups as you want -- End of class } class User { .. Simple Getter .. + getName() + getAddress() .. Some setter .. + setName() __ private data __ int age -- crypted -- String password } class Foo1 { You can use several lines .. as you want and group == things together. __ You can have as many groups as you want -- End of class } class User { .. Simple Getter .. + getName() + getAddress() .. Some setter .. + setName() __ private data __ int age -- crypted -- String password } ### Packages package "Classic Collections" #DDDDDD { Object <|-- ArrayList } package net.sourceforge.plantuml { Object <|-- Demo1 Demo1 *- Demo2 } package "Classic Collections" #DDDDDD { Object <|-- ArrayList } package net.sourceforge.plantuml { Object <|-- Demo1 Demo1 *- Demo2 } ### Splitting large files * page (hpages)x(vpages) ' Split into 4 pages page 2x2 class BaseClass namespace net.dummy #DDDDDD { .BaseClass <|-- Person Meeting o-- Person .BaseClass <|- Meeting } namespace net.foo { net.dummy.Person <|- Person .BaseClass <|-- Person net.dummy.Meeting o-- Person } BaseClass <|-- net.unused.Person ' Split into 4 pages page 2x2 class BaseClass namespace net.dummy #DDDDDD { .BaseClass <|-- Person Meeting o-- Person .BaseClass <|- Meeting } namespace net.foo { net.dummy.Person <|- Person .BaseClass <|-- Person net.dummy.Meeting o-- Person } BaseClass <|-- net.unused.Person ## Activity title Servlet Container (*) --> "ClickServlet.handleRequest()" --> "new Page" if "Page.onSecurityCheck" then ->[true] "Page.onInit()" if "isForward?" then ->[no] "Process controls" if "continue processing?" then -->[yes] ===RENDERING=== else -->[no] ===REDIRECT_CHECK=== endif else -->[yes] ===RENDERING=== endif if "is Post?" then -->[yes] "Page.onPost()" --> "Page.onRender()" as render --> ===REDIRECT_CHECK=== else -->[no] "Page.onGet()" --> render endif else -->[false] ===REDIRECT_CHECK=== endif if "Do redirect?" then ->[yes] "redirect request" --> ==BEFORE_DESTROY=== else if "Do Forward?" then -left->[yes] "Forward request" --> ==BEFORE_DESTROY=== else -right->[no] "Render page template" --> ==BEFORE_DESTROY=== endif endif --> "Page.onDestroy()" -->(*) title Servlet Container (*) --> "ClickServlet.handleRequest()" --> "new Page" if "Page.onSecurityCheck" then ->[true] "Page.onInit()" if "isForward?" then ->[no] "Process controls" if "continue processing?" then -->[yes] ===RENDERING=== else -->[no] ===REDIRECT_CHECK=== endif else -->[yes] ===RENDERING=== endif if "is Post?" then -->[yes] "Page.onPost()" --> "Page.onRender()" as render --> ===REDIRECT_CHECK=== else -->[no] "Page.onGet()" --> render endif else -->[false] ===REDIRECT_CHECK=== endif if "Do redirect?" then ->[yes] "redirect request" --> ==BEFORE_DESTROY=== else if "Do Forward?" then -left->[yes] "Forward request" --> ==BEFORE_DESTROY=== else -right->[no] "Render page template" --> ==BEFORE_DESTROY=== endif endif --> "Page.onDestroy()" -->(*) ### Activity Beta 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) :redirect process; else if (do forward?) then (yes) :Forward request; else (no) :Render page template; endif endif stop 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) :redirect process; else if (do forward?) then (yes) :Forward request; else (no) :Render page template; endif endif stop ## Component Diagram ## State ## Obejct ## Gantt Diagram Project starts the 20th of september 2018 saturday are closed sunday are closed [Prototype design] lasts 13 days and is colored in Lavender/LightBlue [Test prototype] lasts 9 days and is colored in Coral/Green and starts 3 days after [Prototype design]'s end [Write tests] lasts 5 days and ends at [Prototype design]'s end [Hire tests writers] lasts 6 days and ends at [Write tests]'s start [Init and write tests report] is colored in Coral/Green [Init and write tests report] starts 1 day before [Test prototype]'s start and ends at [Test prototype]'s end ## deployment diagram - http://plantuml.com/deployment-diagram ``` actor actor agent agent artifact artifact boundary boundary card card cloud cloud component component control control database database entity entity file file folder folder frame frame interface interface node node package package queue queue stack stack rectangle rectangle storage storage usecase usecase ``` actor actor agent agent artifact artifact boundary boundary card card cloud cloud component component control control database database entity entity file file folder folder frame frame interface interface node node package package queue queue stack stack rectangle rectangle storage storage usecase usecase