1. 의존성 추가
Activiti7 통합을 위한 Spring Boot Starter 의존성 설정:
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M4</version>
</dependency>
<dependency>
<groupId>org.activiti.dependencies</groupId>
<artifactId>activiti-dependencies</artifactId>
<version>7.1.0.M4</version>
<type>pom</type>
</dependency>
2. 핵심 컴포넌트
- Task: 작업 실행 단위
- HistoricTaskInstance: 완료/삭제된 과거 작업 기록
- Deployment: 프로세스 배포 관리
- ProcessDefinition: 프로세스 정의 정보
- ProcessInstance: 실행 중인 프로세스 인스턴스
3. 프로세스 배포(Deployment)
BPMN 파일을 Activiti 엔진에 등록하는 과정:
@PostMapping("/deploy/string")
public ResponseDTO deployByString(@RequestParam("bpmnContent") String bpmnContent) {
Deployment deployment = repositoryService.createDeployment()
.addString("workflow.bpmn", bpmnContent)
.name("배포예제")
.deploy();
return new ResponseDTO("SUCCESS", deployment.getId());
}
지원 배포 방식:
- BPMN 파일 직접 배포
- ZIP 압축 파일 배포
- 문자열 기반 배포
@Test
public void deployZip() {
InputStream zipStream = getClass().getResourceAsStream("/bpmn/workflows.zip");
repositoryService.createDeployment()
.addZipInputStream(new ZipInputStream(zipStream))
.deploy();
}
4. 프로세스 정의(ProcessDefinition)
배포된 워크플로우의 메타정보 관리:
@GetMapping("/definitions")
public List<ProcessDefinition> getProcessDefinitions() {
return repositoryService.createProcessDefinitionQuery()
.orderByProcessDefinitionVersion().desc()
.list();
}
5. 프로세스 인스턴스(ProcessInstance)
실행 중인 워크플로우 인스턴스 관리:
@PostMapping("/start/{processKey}")
public String startProcess(@PathVariable String processKey) {
ProcessInstance instance = runtimeService
.startProcessInstanceByKey(processKey);
return instance.getId();
}
인스턴스 상태 제어:
// 인스턴스 일시 정지
runtimeService.suspendProcessInstanceById(instanceId);
// 인스턴스 재개
runtimeService.activateProcessInstanceById(instanceId);
// 인스턴스 삭제
runtimeService.deleteProcessInstance(instanceId, "삭제사유");
6. 작업(Task) 관리
사용자 할당 작업 처리:
@GetMapping("/tasks")
public List<Task> getUserTasks(@RequestParam String assignee) {
return taskService.createTaskQuery()
.taskAssignee(assignee)
.list();
}
@PostMapping("/complete/{taskId}")
public void completeTask(@PathVariable String taskId) {
taskService.complete(taskId);
}
7. 비용 청구 워크플로우 구현
BPMN 설계 예시:
<process id="expenseProcess">
<startEvent id="start"/>
<userTask id="submitExpense" name="비용제출" assignee="제출자"/>
<userTask id="approveExpense" name="승인처리" assignee="승인자"/>
<endEvent id="end"/>
</process>
프로세스 실행 흐름:
// 배포
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("expense.bpmn")
.deploy();
// 인스턴스 시작
ProcessInstance instance = runtimeService
.startProcessInstanceByKey("expenseProcess");
// 작업 조회
Task task = taskService.createTaskQuery()
.processInstanceId(instance.getId())
.singleResult();