워크플로우 파운데이션(Workflow Foundation) 소개

워크플로우 파운데이션(Workflow Foundation)는 여러 작업을 자동화하고 관리할 수 있게 도와주는 도구입니다.
간단하게 설명하자면, 일상에서의 ‘레시피’와 같은 것입니다.
빵을 굽기 위해선 먼저 재료를 준비하고, 반죽을 만든 후, 오븐에 굽는 등의 단계가 있죠. WF는 이런 단계를 컴퓨터가 이해할 수 있도록 도와주는 프로그램입니다.


1. 워크플로우(Workflow)란 무엇인가?

워크플로우는 일련의 작업이나 단계를 정해진 순서나 규칙에 따라 수행하는 것을 의미합니다.
예를 들어, 휴가를 신청할 때 양식을 작성하고, 상사의 승인을 받고, 인사팀에 제출하는 등의 단계가 있을 것입니다.
WF는 이러한 일련의 단계를 컴퓨터 프로그램에서 쉽게 만들고 관리할 수 있게 도와줍니다.



2. 기본 개념 쉽게 알아보기

  1. 액티비티(Activity): 이는 워크플로우의 각 단계를 나타냅니다. 예를 들어, ‘상사에게 메일 보내기’나 ‘데이터베이스에 정보 저장하기’ 같은 것이 될 수 있습니다.
  2. 워크플로우 런타임: 이는 워크플로우가 실제로 실행되는 ‘장소’입니다. 여기서 각 단계가 어떻게, 언제 실행될지를 관리합니다.
  3. 호스트 프로세스: 이는 워크플로우를 실행시키는 주체, 즉 ‘오븐’과 같은 것입니다. 여기서 워크플로우가 실제로 작동하게 됩니다.



3. 간단한 코드 예시


3-1. Say Hello 만들기

이 코드는 “Hello, World!”라고 출력하는 간단한 액티비티입니다.

using System.Activities;

namespace HelloWorld
{
    public class SayHello : CodeActivity
    {
        protected override void Execute(CodeActivityContext context)
        {
            Console.WriteLine("Hello, World!");
        }
    }
}


WorkflowInvoker.Invoke 메서드를 사용하여 SayHello 액티비티를 실행시킵니다.

using System.Activities;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            WorkflowInvoker.Invoke(new SayHello());
        }
    }
}


3-2. 입력을 받아 출력하기

이 코드는 입력을 받는 액티비티입니다.

using System.Activities;

namespace HelloWorld
{
    public class GetUserInput : CodeActivity<string>
    {
        public InArgument<string> Question { get; set; }

        protected override string Execute(CodeActivityContext context)
        {
            Console.Write(Question.Get(context));
            return Console.ReadLine();
        }
    }
}


사용자로부터 입력을 받아 “Hello, [입력받은 이름]”을 출력합니다.

using System.Activities;
using System.Collections.Generic;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            IDictionary<string, object> inputs = new Dictionary<string, object>
            {
                { "Question", "What is your name?" }
            };

            IDictionary<string, object> outputs = WorkflowInvoker.Invoke(new GetUserInput(), inputs);

            Console.WriteLine($"Hello, {outputs["Result"]}");
        }
    }
}



4. InArgument의 활용 (액티비티에 값 넘기기)

보통은 IDictionary<string, object> 타입의 딕셔너리를 사용하여 액티비티에 값을 전달합니다.
액티비티에선 InArgument를 사용하여 전달받은 값을 활용합니다.
이 딕셔너리의 키는 액티비티에서 정의한 InArgument의 이름과 일치해야 하며, 값은 해당 InArgument가 기대하는 타입의 값을 가지고 있어야 합니다.


예를 들어, 액티비티 클래스에서 다음과 같이 InArgument 타입의 Question 변수를 정의했다면,

public InArgument<string> Question { get; set; }

워크플로우를 호출할 때는 다음과 같이 딕셔너리를 사용해서 값을 전달할 수 있습니다.

IDictionary<string, object> inputs = new Dictionary<string, object>
{
    { "Question", "What is your name?" }
};

그리고 이 딕셔너리를 WorkflowInvoker.Invoke 메서드에 전달하면, 액티비티 내부에서 Question.Get(context)를 사용해 이 값을 가져와 사용할 수 있습니다.

IDictionary<string, object> outputs = WorkflowInvoker.Invoke(new GetUserInput(), inputs);

딕셔너리의 키(“Question”이라는 문자열)는 InArgument의 변수 이름(“Question”)과 일치해야 하고, 값의 타입은 InArgument가 정의된 타입과 일치해야 합니다.
이런 방식으로 InArgument를 통해 워크플로우 액티비티에 값을 전달할 수 있습니다.



5. 결론

워크플로우 파운데이션은 여러 작업을 순서대로 자동화하고 효율적으로 만들어주는 도구입니다.
복잡한 것 같아도 기본적으로는 우리가 일상에서 경험하는 ‘단계’와 ‘순서’를 컴퓨터가 이해할 수 있게 번역해주는 것이죠.






정규표현식의 유용한 패턴
#집합찾기 #반복찾기 #역참조 #조건달기
A 액티비티에서 B 액티비티로 데이터 전달하기
#WorkflowFoundation #InArgument #OutArugment #Variables
Microsoft UI Automation Framework 이해하기
#AutomationElement #TreeWalker #ControlPatterns
AppDomain 탐구
#AppDomain #격리 #어셈블리별도실행 #플러그인시스템
Chrome Extension 활용하여여 웹 페이지 XPath 정보 가져오기
#ChromeExtension #크롬확장프로그램 #XPath
Workflow 디자이너와 액티비티의 관계
#WorkflowFoundation #Designer #Activity #ModelItem
ExpressionTextBox와 ModelItem의 바인딩 관계
#WorkflowFoundation #ExpressionTextBox #ModelItem #Binding
Windows 레지스트리 간단 정리
#Windows #Registry #레지스트리
WPF MVVM 패턴, 그리고 Binding
#WPF #MVVM #Binding #Modle #View #ViewModel
오라클 SQL 성능 최적화 - 바인드 변수와 Shared Memory 이해하기
#Oracle #바인드변수 #SharedMemory #LibraryCache #SqlPlan
ActivityDesigner와 CodeActivity 이해하기
#WorkflowFoundation #ActivityDesigner #CodeActivity
Selenium Implicit vs Explicit - 웹 요소 기다리기
#Selenium #IWebDriver #Implicit #Explicit
.NET에서 Selenium 활용하기 - 3가지 실전 예제
#Selenium #ChromeDriver #FindElements
.NET에서 CommandBinding 활용하기
#.NET #CommandBinding #디자인패턴
워크플로우 파운데이션(Workflow Foundation) 소개
#WorkflowFoundation #소개 #기본개념
AWS SAA 준비 - (4) 비용에 최적화된 아키텍처 설계
(정리) Exam Readiness - AWS Solutions Architect Associate
AWS SAA 준비 - (3) 안전한 아키텍처
(정리) Exam Readiness - AWS Solutions Architect Associate
AWS SAA 준비 - (2) 성능이 뛰어난 아키텍처 설계
(정리) Exam Readiness - AWS Solutions Architect Associate
AWS SAA 준비 - (1) 복원력을 갖춘 아키텍처 설계
(정리) Exam Readiness - AWS Solutions Architect Associate
15분 안에 ToC를 구현해보자!
Vanilla JS로 Table of Contents 구현하기
모듈
모던 자바스크립트 Deep Dive | 48장 | 모듈
에러 처리
모던 자바스크립트 Deep Dive | 47장 | 에러 처리
제너레이터와 async/await
모던 자바스크립트 Deep Dive | 46장 | 제너레이터와 async/await
프로미스
모던 자바스크립트 Deep Dive | 45장 | 프로미스
REST API
모던 자바스크립트 Deep Dive | 44장 | REST API
Ajax
모던 자바스크립트 Deep Dive | 43장 | Ajax
비동기 프로그래밍
모던 자바스크립트 Deep Dive | 42장 | 비동기 프로그래밍
타이머
모던 자바스크립트 Deep Dive | 41장 | 타이머
Set과 Map
모던 자바스크립트 Deep Dive | 37장 | Set과 Map
디스트럭처링
모던 자바스크립트 Deep Dive | 36장 | 디스트럭처링
브라우저의 렌더링 과정
모던 자바스크립트 Deep Dive | 38장 | 브라우저의 렌더링 과정
스프레드 문법
모던 자바스크립트 Deep Dive | 35장 | 스프레드 문법
이터러블
모던 자바스크립트 Deep Dive | 34장 | 이터러블
7번째 데이터 타입 Symbol
모던 자바스크립트 Deep Dive | 33장 | 7번째 데이터 타입 Symbol
String
모던 자바스크립트 Deep Dive | 32장 | String
RegExp
모던 자바스크립트 Deep Dive | 31장 | RegExp
Date
모던 자바스크립트 Deep Dive | 30장 | Date
Math
모던 자바스크립트 Deep Dive | 29장 | Math
DOM
모던 자바스크립트 Deep Dive | 39장 | DOM
Number
모던 자바스크립트 Deep Dive | 28장 | Number
배열
모던 자바스크립트 Deep Dive | 27장 | 배열
이벤트
모던 자바스크립트 Deep Dive | 40장 | 이벤트
ES6 함수의 추가 기능
모던 자바스크립트 Deep Dive | 26장 | ES6 함수의 추가 기능
클래스
모던 자바스크립트 Deep Dive | 25장 | 클래스
this
모던 자바스크립트 Deep Dive | 22장 | this
빌트인 객체
모던 자바스크립트 Deep Dive | 21장 | 빌트인 객체
strict mode
모던 자바스크립트 Deep Dive | 20장 | strict mode
클로저
모던 자바스크립트 Deep Dive | 24장 | 클로저
프로토타입
모던 자바스크립트 Deep Dive | 19장 | 프로토타입
함수와 일급 객체
모던 자바스크립트 Deep Dive | 18장 | 함수와 일급 객체
실행 컨텍스트
모던 자바스크립트 Deep Dive | 23장 | 실행 컨텍스트
생성자 함수에 의한 객체 생성
모던 자바스크립트 Deep Dive | 17장 | 생성자 함수에 의한 객체 생성
프로퍼티 어트리뷰트
모던 자바스크립트 Deep Dive | 16장 | 프로퍼티 어트리뷰트
let, const 키워드와 블록 레벨 스코프
모던 자바스크립트 Deep Dive | 15장 | let, const 키워드와 블록 레벨 스코프
전역 변수의 문제점
모던 자바스크립트 Deep Dive | 14장 | 전역 변수의 문제점
스코프
모던 자바스크립트 Deep Dive | 13장 | 스코프
함수
모던 자바스크립트 Deep Dive | 12장 | 함수
원시 값과 객체의 비교
모던 자바스크립트 Deep Dive | 11장 | 원시 값과 객체의 비교
객체 리터럴
모던 자바스크립트 Deep Dive | 10장 | 객체 리터럴
타입 변환과 단축 평가
모던 자바스크립트 Deep Dive | 9장 | 타입 변환과 단축 평가
제어문
모던 자바스크립트 Deep Dive | 8장 | 제어문
연산자
모던 자바스크립트 Deep Dive | 7장 | 연산자
데이터 타입
모던 자바스크립트 Deep Dive | 6장 | 데이터 타입
표현식과 문
모던 자바스크립트 Deep Dive | 5장 | 표현식과 문
변수
모던 자바스크립트 Deep Dive | 4장 | 변수
Iteration와 Generator
코드스피츠 77 ES6+ 3화 참조
WHATWG 탄생 배경
WHATWG, W3C, HTML의 관련에 대한 역사
프론트엔드(FE) 면접 질문 정리
FE관련 면접 질문 및 답변 정리한 내용입니다.
쿠버네티스(kubernetes, k8s) 용어 정리
쿠버네티스(kubernetes, k8s) 용어 정리
젠킨스(Jenkins) 정리
젠킨스(Jenkins) 정리
Docker 용어 정리
Docker 용어 정리
Git 용어 정리
Git 용어 정리
반응형 웹 디자인(Responsive Web Design)
CSS responsive 에 대하여
JS this에 대하여
this에 대해 알아보자
SQL*PLUS에 대하여
SQL*PLUS 정의 및 사용방법
Oracle에서 SQL Plan 확인하기
Oracle에서 SQL Plan을 확인해보자