Qt Task Tree 모듈은 Qt C++ 세계에 선언적 API를 도입하며, 이는 비동기 워크플로우를 정의하는 방식에 혁신을 가져옵니다. 이 새로운 접근 방식의 주요 특징은 다음과 같습니다.
선언적 레시피와 태스크 트리
-
레시피(Recipe): 비동기 워크플로우의 선언적 설명을 담은 복사 가능한 값-타입 객체입니다. 이는 태스크 트리에 전달되며, 태스크 트리가 시작될 때 레시피를 읽어 복잡한 비동기 워크플로우를 자동으로 관리합니다.
-
태스크 트리(Task Tree): 레시피를 읽고 실행하는 역할을 합니다. 태스크의 동적 생성, 태스크 간 데이터 교환을 위한 데이터 객체 생성, 태스크 수명 주기 관리, 태스크 완료 시 후속 작업 실행 등을 담당합니다.
-
재사용성: 레시피는 재사용 가능하며, 더 일반적인 레시피의 일부가 될 수도 있고, 여러 번 실행되거나 병렬로 실행되는 여러 태스크 트리에 의해 실행될 수 있습니다.
카트리지와 플레이어 비유
Qt Task Tree는 레시피를 ‘카트리지’에, 태스크 트리를 ‘카트리지 플레이어’에 비유합니다. 레시피는 단순히 ‘무엇을 할지’에 대한 설명이며, 태스크 트리는 이 설명을 읽고 ‘어떻게 할지’를 실행합니다. 개발자는 플레이어(태스크 트리)를 변경할 필요 없이 새로운 카트리지(레시피)만 설계하여 복잡한 비동기 워크플로우를 정의할 수 있습니다.
책임 분리
-
레시피(사용자 정의): 실행할 태스크, 실행 순서, 실행 모드(순차/병렬), 워크플로우 정책, 중첩 그룹, 설정/완료 핸들러, 태스크 간 데이터 교환을 위한
Storage<DataType>객체, 조건부 표현식 등을 ‘설명’합니다. -
QTaskTree(자동 수행): 태스크 생성 및 파괴, 수명 관리, 레시피에 정의된 순서 존중, 실행 모드 및 워크플로우 정책에 따른 실행 제어, 핸들러 실행,
DataType객체 동적 생성 및 파괴, 조건부 표현식에 따른 실행 경로 선택 등 개발자가 일반적으로 처리해야 할 지루하고 반복적인 상용구 코드를 모두 자동화합니다.
다양한 비동기 API 통합
Qt Task Tree 모듈은 QProcess::start(), QNetworkAccessManager::get(), QtConcurrent::run(), QTimer::singleShot() 등 기존 Qt의 다양한 비동기 API들이 가진 시작, 완료, 파괴 방식의 비호환성 문제를 해결합니다. QTaskInterface와 QCustomTask를 활용한 공통 인터페이스를 통해 모든 유형의 비동기 작업을 통합하여 일관된 방식으로 관리할 수 있게 합니다.
실제 적용 및 예제
이 모듈은 2022년 말 QtCreator 프로젝트의 일부로 개발되어 현재 100여 곳 이상에서 빌드/배포/실행 구성 관리, 로케이터 필터 실행, VCS 명령, Axivion 플러그인 통신, Clang 도구 실행, 자동 테스트 등 다양한 용도로 활용되고 있습니다. 데모, 신호등, 이미지 스케일링과 같은 예제를 통해 실행 모드, 워크플로우 정책, 상태 머신 구현, 병렬 반복 실행 및 Storage 객체 활용법을 시연합니다.