두 손끝의 창조자

BPMN Event의 시작, 중간, 종료 본문

BPMN

BPMN Event의 시작, 중간, 종료

codinglog 2020. 5. 14. 14:24

Event는 처음, 중간, 끝이 있다

Event는 Process의 어느 위치에서 사용하느냐에 따라서 시작(Start), 중간(Intermediate), 종료(End) 3가지로 나눌 수 있다.

Start

Start

Process 나 Choreography 의 시작을 표시

Intermediate

Intermediate

Start와 End Event 사이에 존재한다. Process나 Choreography 의 흐름에 영향을 주지만 이 이벤트가 시작이나 프로세스의 종료를 의미하지는 않는다.

End

End

Process 나 Choreography 의 종료를 표시

 

Event 도 종류가 있다

시작과 중간 이벤트는 이 이벤트가 발생한 원인(Trigger)을 정의할 수 있다. 예를 들어 메시지를 수신했거나, 타이머가 동작했거나 하면 이 시작 또는 중간 이벤트가 잡아서(Catching) 처리할 수 있다.

반면 종료 이벤트는 프로세스의 결과를 던지는 이벤트만 정의할 수 있다. 예를들어 메시지를 보낸다던지 시그널을 보낸다던지 하는 식이다. 중간 이벤트도 마찬가지로 결과를 던지는 이벤트를 처리할 수 있다.

마커를 보면 잡는(Catching) 이벤트는 그림 내부가 비워져 있고, 던지는(Throwing) 이벤트들은 마커 내부가 색으로 채워져 있다.

 

Start Event

이름에서 알 수 있듯이 Process 의 시작을 알리는 이벤트 이다.  즉, 시퀀스 흐름의 측면에서, 시작 이벤트는 프로세스의 흐름을 시작하므로 들어오는 시퀀스 흐름이 없다. 따라서 어떤 시퀀스 흐름도 시작 이벤트에 연결할 수 없다.

시작 이벤트는 중간 이벤트와 종료 이벤트와 마찬가지로 비어있는 원 모양으로 생겼다. 비어있는 원 안에 다양한 마커를 넣어서 이벤트의 종류를 구별한다.

시작 이벤트는 있어도 되고 없어도 되는 이벤트이다. 프로세스 수준 (최상위 프로세스, 하위 프로세스 (내장) 또는 글로벌 프로세스 (프로세스))은 시작 이벤트를 가질 수 있다.

프로세스는 한개 이상 프로세스 레벨이 존재할 수 있다. 즉 확장된 서브 프로세스나 다른 프로세스를 호출하는 Activity 를 포함할 수 있다. 시작 및 종료 이벤트는 각 레벨별로 독립적으로 사용한다.

규칙과 사용 제안

프로세스가 복잡하고 시작 조건이 명확하지 않은 경우 시작 이벤트를 사용하는 것이 좋다.
시작 이벤트가 없으면 프로세스의 암묵적 시작 이벤트에 트리거가 없어야한다.
종료 이벤트가있는 경우 하나 이상의 시작 이벤트가 있어야한다.

프로세스가 글로벌 프로세스 (다른 프로세스에서 Call Activity로 호출 가능한 프로세스)이고 여러 시작 이벤트가 있는 경우 플로우가 상위 프로세스에서 글로벌 프로세스로 이동할 때 시작 이벤트 중 하나만 트리거 된다. Call Activity 에 targetRef 속성으로 호출할 이벤트를 식별한다.

시작 이벤트가 여러 개인 경우 다이어그램을 보는 사람이 프로세스 동작을 이해하기 어려울 수 있으므로 유의해야한다.

시작 이벤트에 대한 트리거가 발생하면 새 프로세스가 인스턴스화되고 해당 이벤트에서 나가는 각 시퀀스 플로우에 대해 토큰이 생성된다.

Start Event는 4가지 타입의 프로세스에서 사용할 수 있다. 각 프로세스 별로 사용할 수 있는 Event의 타입은 별도 포스트로 정리하겠다.

  • Top-level Process
  • Sub-Process
  • Global Process
  • Event Sub-Process

End Event

Process의 종료를 알리는 이벤트이다. 시퀀스 플로우와 관련하여 종료 이벤트는 프로세스 플로우를 종료하므로 나가는 시퀀스 플로우가 없다.

종료 이벤트는 시작 이벤트 및 중간 이벤트와 동일한 모양을 사용한다. 가운데가 빈 원은 마커를 원 안에 배치하여 이벤트의 타입을 나타낸다.

프로세스 내에서 생성 된 모든 토큰은 프로세스가 완료되기 전에 종료 이벤트에 의해 사용되어야 한다. 프로세스가 하위 프로세스(Sub-Process) 인 경우 인터럽트 중간 이벤트를 이용하여 정상적인 완료 전에 중지 할 수 있다.

규칙과 사용 제안

한 프로세스에서 다수의 종료 이벤트를 가실 수 있다.
종료 이벤트는 선택적으로 사용할 수 있다.
만약 종료 이벤트가 없으면 프로세스는 결과를 가져서는 안된다.
시작 이벤트가 있으면 반드시 종료이벤트가 있어야 한다. 
종료 이벤트가 없을 때 나가는 플로우가 없는 객체들에게는 경로의 끝임을 표시해야 한다. 그러나 병렬로 처리된 모든 흐름이 종료될 때까지 프로세스가 종료되면 안된다.

프로세스는 확장된 서브 프로세스 또는 다른 프로세스를 호출하는 Call Activity 등 여러 단계를 가질 수 있다. 시작과 종료 이벤트는 각 레벨에서 독립적이다.

종료 이벤트가 없는 프로세스는 경로의 마지막 오브젝트에서 종료한다. 모든 토큰이 프로세스를 통과하면 프로세스는 종료 상태가 된다.

종료 이벤트 결과

종료 이벤트는 [None, Message, Escalation, Error, Cancel, Compensation, Signal, Terminate, Multiple] 9개의 타입을 가지고 있다.  이러한 유형은 종료 이벤트에 도달 한 결과를 정의합니다. 이를 종료 이벤트 결과라고합니다.

시퀀스 플로우 연결

엔드 이벤트는 항상 들어오는 연결만 있어야 한다. 나가는 연결이 있으면 안된다. 모델링상 편의를 위해서 경로에 별도로 엔드 이벤트를 추가해도 상관없다. 하지만 시작 이벤트에서 만들어진 토큰은 종료 이벤트에 항상 도달할 수 있어야 한다. 

메시지 플로우 연결

모든 메시지 플로우는 두 개의 개별 풀을 연결해야 한다. 풀 경계나 객체와 연결할 수 있다. 동일한 풀 내에서는 연결 할 수 없다. 메시지 플로우는 엔드 이벤트를 타겟으로 연결할 수 없다.

종료 이벤트에서 메시지 플로우가 나갈 수 있다. 이 경우에는 결과 속성이 메시지에 포함되어야 한다.

Intermediate Event

시작 이벤트와 종료 이벤트 사이에 존재한다. 프로세스의 흐름에 영향을 주지만 직접적으로 시작하거나 종료하지 않는다. 중간 이벤트는 아래 이유로 사용한다.

  • 프로세스 내에서 메시지가 예상되거나 전송되는 위치 표시
  • 지연이 예상되는 곳
  • 예외 처리를 통한 정상 흐름 중단
  • 보상에 필요한 추가 작업 표시

중간 이벤트는 Task나 Sub-Process의 경계에 둔다. 중간 이벤트는 Activity 경계의 어느 위치에나 붙일 수 있으며 나가는 시퀀스 플로우는 모든 방향으로 흐를 수 있다. 그러나 다이어그램의 명확성을 위해 모델러는 경계에서 일관된 위치를 선택하는 것이 좋다. 예를 들어, 다이어그램 방향이 수평 인 경우 중간 이벤트를 Activity의 맨 아래에 붙이고 시퀀스 플로우를 아래로 향하게 한 다음 오른쪽으로 연결할 수 있다. 다이어그램 방향이 수직이면 중간 이벤트를 활동의 왼쪽 또는 오른쪽에 첨부 할 수 있으며 시퀀스 플로우는 왼쪽 또는 오른쪽으로 지정한 다음 아래로 향할 수 있다.

Intermediate Event Trigger

BPMN에는 12 가지 유형의 중간 이벤트 (None, Message, Timer, Escalation, Error, Cancel, Compensation, Conditional, Link, Signal, Multiple, Parallel Multiple)가 있다. 각 유형의 중간 이벤트는 중간 이벤트 셰이프의 중앙에 서로 다른 아이콘이 배치되어 서로 구별된다.

중간 이벤트는 둘 중 한가지 방법으로 사용한다.

  • 일반적인 Process flow에서 이벤트를 잡거나 보내기 위해서 사용한다.
  • Activity 경계에 붙어 있는 이벤트는 이벤트를 잡기위해서만 사용한다.

일반적인 흐름속 Intermediate Event

프로세스내에 있는 중간 이벤트에 토큰이 도착하면 이벤트를 던지거나, 이벤트가 발생할 때까지 기다린다. 이 이벤트 대산에 Receive Task 를 사용해도 된다.

Activity 경계에 있는 Intermediate Event

경계 이벤트는 붙여 있는 Activity에서 발생하는 이벤트를 잡는 이벤트이다. 즉, Activity가 동작중일 때 해당 이벤트가 발생하고 있는지 보고 있다가 발생하면 잡는다.

이벤트를 잡았을 때 2가지 타입으로 동작한다.

1. Interrupting boundary event : 동작중이던 Activity는 중단되고 흐르고 있떤 플로우는 이벤트 쪽으로 빠진다.

2. Non-interrupting boundary event : Activity에 토큰이 유지되고 새로운 토큰이 발행되어 Event 밖으로 흘러간다.

반응형
Comments