중급 Part06: 워크플로우 기능에 대하여

이 가이드에서는 Xplenty의 워크 플로 기능이란 무엇이며, 언제 사용하는지, 그리고 전후 관계가 있는 ETL 작업을 보다 효율적으로 관리할 수 있는 방법에 대해 설명합니다.

워크플로우란?

간단히 이야기 하면 워크 플로는 작업을 원하는 실행 순서로 설정할 수 있는 특수한 유형의 패키지입니다. 워크 플로의 태스크는 기존 데이터 플로 패키지 또는 SQL 쿼리 조작 중 하나가 될 수 있습니다. 드래그 앤 드롭 인터페이스를 통해 원하는 실행 순서로 작업을 배치할 수 있습니다.
Xplenty 워크 플로의 주요 기능은 다음과 같습니다.

1) 실행 결과의 상태에 따라 다른 실행 경로를 트리거합니다.

워크 플로를 사용하면 두 작업 간의 실행 관계를 기반으로 두 작업을 추가하고 연결할 수 있습니다. 
즉, 이전 태스크의 실행 상태(성공, 에러, 모조건)에 따라 다른 경로의 태스크를 실행할 수 있습니다. 간단한 예를 들어 보겠습니다.

thumbnail image

Xplenty가 지원하는 실행 결과의 상태는 다음 세 가지입니다.

  • on success
  • on failure
  • on completion

위 그림의 워크 플로를 실행하면 dataflow_task(Dataflow 패키지 실행)가 먼저 실행됩니다. 작업이 완료되면 post_completion_query가 실행되고 작업의 성공 여부에 따라 post_failure_query 혹은 post_success_query가 실행됩니다.

2) 선행 작업의 실행 상태에 따라 실행 조건 (제어) 추가

워크 플로를 사용하면 이전 작업의 실행 상태에 따라 모든 작업에 조건부 논리를 추가할 수 있습니다.

thumbnail image

현재 태스크의 실행 조건(3번)에, 선행 태스크들의 성공 조건에 대해서도 OR(모두) 또는 모두(AND)의 조건을 추가할 수 있습니다.

thumbnail image

위의 그림에서 정의한 워크 플로에서는 AND 조건이 설정되어 dataflow_task_1과 sql_query_1이 모두 성공적으로 실행된 경우(두 태스크 모두 true를 반환)에만 dataflow_task_2가 실행됩니다.
만약, dataflow_task_2에 "OR" 조건을 선택한 경우 dataflow_task_1 또는 sql_query_1이 성공적으로 실행될 때 실행됩니다.

위의 두 기능을 결합하여 패키지를 특정 순서로 실행하고 싶은 경우 (A가 B 앞, B가 C 앞, C가 D 앞 등), 이러한 실행이 각 작업의 성공 또는 완료에 의존하는 복잡한 실행 프로파일을 모델링 할 수 있습니다 (A가 실패하면 B를 실행하고 B와 C가 모두 성공하면 D를 실행하는 등).

3) 작업을 실행할 때 사용할 동적 변수 전달

데이터플로 패키지와 마찬가지로 워크플로에도 변수 범위가 있습니다. 변수가 데이터플로 패키지 레벨에서 정의된 경우 해당 값이 사용되고 데이터플로 패키지에서 변수 정의를 찾을 수 없는 경우 Xplenty는 워크플로우 레벨 변수를 참조합니다. 이러한 워크 플로 변수는 워크 플로를 만들 때 설정하고 잡이나 스케줄을 통해 실행할 경우는 해당 설정 화면에서 변수를 덮어쓸 수 있습니다.

그러나 워크 플로 변수와 데이터 플로 변수가 모두 같은 이름인 경우 워크 플로의 변수 화면에서 워크 플로 변수에 데이터 플로 변수를 지정해야 합니다. (자세한 내용은 아래에 나오는 [참고: 데이터플로 변수와 데이터플로 변수 간의 관계 이해]를 읽어 보시기 바랍니다)

워크 플로의 SQL 작업은 값(쿼리 결과)을 반환할 수 있고 스칼라 값을 포함해서 워크 플로 변수에 저장할 수 있습니다.
이 값은 후속 SQL 태스크 또는 데이터플로 패키지 태스크로 전달될 수 있습니다.

thumbnail image

첫 번째 SQL 쿼리 작업은 시작전인 액티브 프로모션이 있는지 확인합니다. 그러한 프로모션이 있는 경우, 그 식별자는 변수 active_promotion_id 에 보관 됩니다.
(디폴트에서는, 반환된 결과의 첫 행, 첫 열에 값이 들어 있습니다). 그리고 이 식별자는 publish_promo 패키지의 데이터플로 패키지 변수로 전달됩니다. 

thumbnail image

앞선 SQL 태스크의 반환값을 담은 변수를 다음에 오는 데이터 플로 태스크의 변수에 대입하여 사용.

thumbnail image마지막으로 패키지가 성공적으로 실행되면 데이터베이스의 프로모션을 공개로 전환표시하는 쿼리 작업이 있습니다. 이 쿼리는 동일한 식별자를 사용하여 데이터베이스에서 프로모션을 찾습니다.

thumbnail image

워크플로 사용 예

Xplenty를 사용하는 전자상거래 회사는 비즈니스를 개선하기 위해 정기적으로 마케팅 캠페인 및 프로모션을 수행합니다.
캠페인을 시작하려면 몇 가지 준비 작업을 수행해야 하며, 캠페인이 끝난 후 일부 조정 작업을 수행하고 싶을 수도 있습니다.

워크 플로를 정의하는 방법은 다음과 같습니다.

  • 데이터베이스에서 SQL 쿼리를 실행하여 현재 시작된 캠페인이 있는지 확인합니다. 캠페인 식별자를 워크 플로 변수에 저장합니다.
  • 시작된 캠페인이 있는 경우 인게이지 먼트 수치를 수집하기 위한 테이블 만들기, 방문 페이지 CRM의 배너 콘텐츠 업데이트, 기타 부속 서비스(PDP, 고객 등)에 대한 데이터베이스의 업데이트, 일괄 메일 알림 준비 및 제출, 대상 고객에 대한 캐시 워밍 활동과 같은 ETL 작업을 실시합니다. 처음 저장한 캠페인 식별자 변수는 이들 후속 작업으로 전달됩니다.
  • 이런 전후 작업은 올바른 순서로 실행되도록 배치됩니다(Bootstrap 데이터 테이블 → 방문 페이지 배너 업데이트 → 캐시 워밍 → 대량 메일 알림 생성). 이러한 태스크들 중 하나가 실패하면 데이터베이스(SQL 쿼리)에 실패 상태를 저장하거나, 태스크를 스케줄링하거나, 진단을 수행하는 API를 호출하는 등의 조치를 실시하는 복구 태스크가 있을 수 있습니다. 그게 아니면 상황을 관련 팀들에 경고 할 수 있습니다. 모든 태스크가 성공적으로 실행되는 경우에도 유사한 조치를 정의할 수 있습니다.
  • 워크 플로 내에서 최근에 만료된 캠페인이 있는지 확인하고, 이후에 분석을 위한 지표 집계나 정리를 수행하는 작업을 예약하는 SQL 쿼리 작업을 추가할 수 있습니다. 일단 구축된 워크 플로는 정기적으로(예를 들어, 매일 밤 11:30에) 실행되도록 스케줄링 될 수 있으며, 서로 의존하는 다른 태스크가 수동 실행의 개입 없이 협력하여 실행된다.

앞에서 설명한 워크 플로 기능과는 별도로 몇 가지 유용한 기능을 소개합니다.

  • 워크 플로 내에서 사용하는 태스크는 데이터 플로 패키지로서 그 자체로 완료되는 1개의 처리로 정의할 수가 있습니다. 이를 통해 모듈화하고 유지 관리하기 쉬운 작업단위를 수행할 수 있으며, 각 팀과 구성원에게 효율적으로 작업을 할당할 수 있습니다.
  • 워크 플로는 구현의 복잡성을 추상화하면서 이런 작업들이 올바른 순서로 실행되도록 배치합니다. 이를 통해 다양한 시스템이 어떻게 상호작용하는지 가시적으로 볼 수 있습니다.
  • 버전 관리가 있어서 문제가 발생하면 이전 버전으로 되돌아 갈 수 있습니다.
  • Xplenty 대시보드를 사용하면 워크 플로의 실행 상태를 모니터링과 실패 알림의 파악 및 실행 스케줄을 변경할 수 있습니다.
  • 이러한 메커니즘을 자체적으로 유지하는 것은 시간과 자원을 많이 소모합니다. 시스템에는 데이터베이스 연결 관리, cron 식 및 다중 프로세스 유지, 전후 관계 설정, 경고 시스템 추가 등이 포함됩니다. Xplenty는 기존 워크 플로에 적절히 녹아들어가는 사용하기 쉬운 로우코드 인터페이스를 통해 이 모든 것을 제공합니다.

참고: 워크 플로 레벨 변수와 데이터 플로 레벨 변수 간의 관계 이해

워크 플로 패키지의 변수는 데이터 플로 레벨의 변수를 덮어쓰기(재정의)에 사용할 수 있습니다.

예 1: 워크 플로 레벨 변수(워크플로쪽에 설정한 변수)와 데이터 플로 레벨 변수가 같은 변수 이름인 경우

보통 이 경우는 같은 변수라도 워크 플로의 태스크로 사용될 경우와 데이터 플로 단독으로 사용되는 경우의 설정값이 서로 틀릴 경우입니다. 즉, 워크 플로의 태스크로 실행되는 경우에는 상위 레벨인 워크 플로의 값으로 데이터 플로를 실행하지만, 에러 복구의 이유로 데이터 플로를 단독으로 돌려야 할 경우 변수 값은 다르게 설정되는 경우가 그 좋은 예입니다.

테스크에서 워크 플로 변수값을 데이터 플로에 적용할 경우, 워크 플로의 태스크 설정의 변수 설정(태스크로 지정된 데이터 플로의 변수 설정)에서 워크플로 변수를 데이터 플로의 변수로 대입해야 합니다. (워크플로 변수와 데이터플로 변수가 같은 변수 이름인 경우, 워크 플로 변수를 데이터 플로 변수에 할당 할 필요가 있습니다.)
태스크에 지정된 데이터 플로에 데이터 플로 레벨에 변수가 정의되지 않았지만 워크 플로우 레벨에서 정의 된 변수가 데이터 플로 패키지에서 사용된다면, 데이터 플로 태스크는 워크 플로 변수의 값을 사용합니다.
thumbnail image

예 2: 워크 플로 레벨에서만 변수가 정의된 경우

워크 플로의 데이터 플로(태스크)가 해당 데이터 플로에 정의되지 않은 변수를 사용하더라도 워크 플로 레벨에서 값이 설정된 경우 데이터 플로(태스크)는 워크 플로 변수의 값을 사용하여 실행됩니다. 다음과 같은 경우 데이터 플로 레벨 실행은 실패하지만 워크 플로를 실행하면 제대로 작동합니다.

  • Dataflow 변수 $today정의 없음  # 하지만, 소스 컴포넌트의 Filter조건에 [CreatedAt > $today]가 존재
  • Workflow 변수 $today정의 있음

변수 표기법 참고:

  • SQL에서 변수를 지정하는 방법 : ${변수이름}
  • 일반 패키지의 URL 및 파일 경로 등 : $변수이름

요약

Xplenty의 워크플로 기능은 간단하지만 매우 유용한 기능입니다. 워크플로 사용에 대한 자세한 내용은 이 도움말 에서 확인할 수 있습니다.