

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Java AWS Flow Framework 용 이해
<a name="concepts"></a>

 AWS Flow Framework for Java는 Amazon SWF와 함께 작동하여 확장 가능하고 내결함성 애플리케이션을 쉽게 생성하여 장기 실행, 원격 또는 둘 다일 수 있는 비동기 작업을 수행할 수 있습니다. “Hello World\$1” 의 예제에서는를 사용하여 기본 워크플로 애플리케이션을 구현하는 방법에 AWS Flow Framework 대한 기본 사항을 [AWS Flow Framework for Java란 무엇입니까?](welcome.md) 도입했습니다. 이 섹션에서는 AWS Flow Framework 애플리케이션의 작동 방식에 대한 개념 정보를 제공합니다. 첫 번째 섹션에서는 AWS Flow Framework 애플리케이션의 기본 구조를 요약하고, 나머지 섹션에서는 AWS Flow Framework 애플리케이션의 작동 방식에 대한 추가 세부 정보를 제공합니다.

**Topics**
+ [애플리케이션 구조](awsflow-basics-application-structure.md)
+ [안정적 실행](awsflow-basics-reliable-execution.md)
+ [분산 실행](awsflow-basics-distributed-execution.md)
+ [작업 목록 및 작업 실행](awsflow-basics-task-lists.md)
+ [확장 가능 애플리케이션](awsflow-basics-scalable.md)
+ [활동과 워크플로 간 데이터 교환](awsflow-basics-data-exchange-activities-workflows.md)
+ [애플리케이션과 워크플로 실행 간 데이터 교환](awsflow-basics-data-exchange-workflows-application.md)
+ [제한 시간 유형](swf-timeout-types.md)

# AWS Flow Framework 기본 개념: 애플리케이션 구조
<a name="awsflow-basics-application-structure"></a>

개념적으로 AWS Flow Framework 애플리케이션은 *워크플로 스타터*, *워크플로 작업자*, *활동 작업자*의 세 가지 기본 구성 요소로 구성됩니다. 한 개 이상의 호스트 애플리케이션에서 작업자(워크플로 및 활동)를 Amazon SWF에 등록하고 작업자를 시작하고 정리하는 작업을 담당합니다. 작업자는 워크플로 실행 메커니즘을 처리하며 여러 호스트에서 구현될 수 있습니다.

이 다이어그램은 기본 AWS Flow Framework 애플리케이션을 나타냅니다.

![\[스키마 AWS Flow Framework 애플리케이션\]](http://docs.aws.amazon.com/ko_kr/amazonswf/latest/awsflowguide/images/swf-application-model.png)


**참고**  
세 가지 애플리케이션에서 이들 구성 요소를 구현하는 것이 개념상 편리하지만, 애플리케이션을 생성하여 이 기능을 다양한 방식으로 구현할 수 있습니다. 예를 들어 활동 및 워크플로 작업에 대해 단일 호스트 애플리케이션을 사용하거나 별도 활동 및 워크플로 호트를 사용할 수 있습니다. 또한 각기 별도 호스트에서 일련의 다른 활동을 처리하는 등의 작업을 수행하는 여러 개의 활동 작업자를 보유할 수 있습니다.

세 구성 AWS Flow Framework 요소는 요청을 관리하는 Amazon SWF로 HTTP 요청을 전송하여 간접적으로 상호 작용합니다. Amazon SWF는 다음을 수행합니다.
+ 워크플로 작업자가 수행할 다음 작업을 결정하는 하나 이상의 결정 작업 목록을 유지 관리합니다.
+ 활동 작업자가 수행할 작업을 결정하는 하나 이상의 활동 작업 목록을 유지 관리합니다.
+ 상세한 단계별 워크플로 실행 내역을 유지 관리합니다.

를 사용하면 AWS Flow Framework애플리케이션 코드가 Amazon SWF로 HTTP 요청을 보내는 등 그림에 표시된 많은 세부 정보를 직접 처리할 필요가 없습니다. AWS Flow Framework 메서드를 호출하기만 하면 프레임워크가 백그라운드에서 세부 정보를 처리합니다.

## 활동 작업자의 역할
<a name="aws-flow-concepts-activity-worker"></a>

활동 작업자는 워크플로에서 완수해야 하는 다양한 작업을 수행합니다. 작업자는 다음 요소로 구성되어 있습니다.
+ 워크플로를 위해 특정 작업을 수행하는 일련의 활동 메서드가 포함된 활동 구현
+ [ActivityWorker](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/simpleworkflow/flow/ActivityWorker.html) 객체는 HTTP 긴 폴링 요청을 사용하여 수행할 활동 작업에 대해 Amazon SWF를 폴링하는 데 사용됩니다. 작업이 필요한 경우 Amazon SWF는 작업 수행에 필요한 정보를 전송하여 요청에 응답합니다. 그러면 [ActivityWorker](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/simpleworkflow/flow/ActivityWorker.html) 객체에서 적절한 활동 메서드를 호출하여 그 결과를 Amazon SWF로 반환합니다.

## 워크플로 작업자의 역할
<a name="aws-flow-concepts-workflow-worker"></a>

워크플로 작업자는 다양한 활동의 실행을 조율하고 데이터 흐름을 관리하며 실패한 활동을 처리합니다. 작업자는 다음 요소로 구성되어 있습니다.
+ 활동 조율 로직을 포함하고 실패한 활동을 처리하는 등의 역할을 하는 워크플로 구현
+ 활동 작업자의 프록시 역할을 하고 워크플로 작업자가 비동기식으로 실행할 활동을 예약할 수 있게 해주는 활동 클라이언트
+ [WorkflowWorker](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/simpleworkflow/flow/WorkflowWorker.html) 객체는 HTTP 긴 폴링 요청을 사용하여 의사 결정 작업을 위해 Amazon SWF를 폴링합니다. 워크플로 작업 목록에 작업이 있는 경우 Amazon SWF는 작업 수행에 필요한 정보를 반환하여 요청에 응답합니다. 그러면 프레임워크에서는 워크플로를 실행하여 작업을 수행하고 그 결과를 Amazon SWF에 반환합니다.

## 워크플로 시작자의 역할
<a name="aws-flow-concepts-workflow-starter"></a>

워크플로 시작자는 *워크플로 실행*이라고도 하는 워크플로 인스턴스를 시작하고, 워크플로 작업자에게 추가 데이터를 전송하거나 현재 워크플로 상태를 얻기 위해 실행 중에 인스턴스와 상호 작용할 수 있습니다.

워크플로 시작자는 워크플로 클라이언트를 사용하여 워크플로 실행을 시작하고, 실행 중에 필요에 따라 워크플로와 상호 작용하며, 정리 작업을 합니다. 워크플로 시작자는 로컬에서 실행되는 애플리케이션, 웹 애플리케이션, AWS CLI 또는가 될 수 있습니다 AWS Management Console.

## Amazon SWF가 애플리케이션과 상호 작용하는 방식
<a name="aws-flow-concepts-swf-app-interaction"></a>

Amazon SWF는 워크플로 구성 요소 간의 상호 작용을 조정하고 상세한 워크플로 기록을 유지합니다. Amazon SWF는 구성 요소와의 통신을 시작하지 않고 구성 요소의 HTTP 요청을 기다린 다음 필요에 따라 요청을 관리합니다. 예:
+ 요청이 작업자에게서 발신된 것이면 Amazon SWF는 사용 가능 작업에 대해 폴링하면서 작업이 사용 가능한 경우 작업자에게 직접 응답합니다. 폴링 작동 방식에 대한 자세한 내용은 *Amazon Simple* Workflow Service 개발자 [안내서의 태스크 폴링을](https://docs.aws.amazon.com/amazonswf/latest/developerguide/swf-dg-basic.html#swf-dev-comm-proto) 참조하십시오.
+ 요청이 활동 작업자가 보낸 작업 완료 알림인 경우 Amazon SWF는 실행 이력에 정보를 기록하고 작업을 결정 작업 리스트에 추가하여 워크플로 작업자에게 작업이 완료되었음을 알림으로써 다음 작업을 계속 진행하도록 합니다.
+ 요청이 워크플로 작업자가 보낸 것으로서 활동을 실행하라는 알림인 경우 Amazon SWF는 실행 이력에 정보를 기록하고 작업을 활동 작업 리스트에 추가하여 활동 작업자에게 적절한 활동 메서드를 실행하도록 지시합니다.

이 접근 방식을 통해 작업자는 Amazon EC2 인스턴스, 기업 데이터 센터, 클라이언트 컴퓨터 등 인터넷이 연결된 모든 시스템에서 실행할 수 있습니다. 작업자는 동일한 운영 체제를 실행할 필요조차 없습니다. HTTP 요청은 작업자에서 시작되므로 외부에 보이는 포트가 필요 없습니다. 따라서 작업자는 방화벽 뒤에서 실행될 수 있습니다.

## 자세한 정보
<a name="for-more-information"></a>

Amazon SWF의 작동 방식에 대한 자세한 내용은 [Amazon Simple Workflow Service 개발자 안내서](https://docs.aws.amazon.com/amazonswf/latest/developerguide/)를 참조하십시오.

# AWS Flow Framework 기본 개념: 신뢰할 수 있는 실행
<a name="awsflow-basics-reliable-execution"></a>

비동기식 분산 애플리케이션에서는 기존 애플리케이션에서는 발생하지 않는 다음과 같은 안정성 문제에 대처해야 합니다.
+ 원격 시스템의 장기 실행 구성 요소와 같은 비동기식 분산 구성 요소 간에 *안정적 통신이 이루어지게* 하는 방법
+ 특히 장기 실행 애플리케이션에서 구성 요소가 실패하거나 연결이 끊어지는 경우 *결과물이 분실되지 않도록 하는* 방법
+ *실패한 분산 구성 요소를 처리*하는 방법

애플리케이션은 AWS Flow Framework 및 Amazon SWF를 사용하여 이러한 문제를 관리할 수 있습니다. 사용자의 워크플로가 장기 실행 중이고 컴퓨터에서 인간 상호 작용을 통해 수행되는 비동기식 작업에 의존하는 경우에도 안정적이고 예측 가능한 방식으로 작동하는지 확인할 수 있는 메커니즘을 Amazon SWF에서 어떻게 제공하는지 살펴보겠습니다.

## 안정적 통신 제공
<a name="awsflow-basics-reliable-execution-communication"></a>

AWS Flow Framework 는 Amazon SWF를 사용하여 분산된 활동 작업자에게 작업을 디스패치하고 워크플로 작업자에게 결과를 반환함으로써 워크플로 작업자와 활동 작업자 간의 안정적인 통신을 제공합니다. Amazon SWF는 다음과 같은 방법을 사용하여 작업자와 활동 간의 안정적인 커뮤니케이션을 보장합니다.
+ Amazon SWF는 예약된 활동과 워크플로 작업을 내구성을 고려해 저장하고 최대 1회 수행되도록 보장합니다.
+ Amazon SWF는 활동 작업이 성공적으로 완료되어 유효한 결과를 반환하거나 그렇지 않은 경우 워크플로 작업자에게 작업이 실패했음을 알리도록 보장합니다.
+ Amazon SWF는 완료된 각 활동의 결과를 내구성을 고려해 저장하거나 실패한 활동의 경우 이와 관련된 오류 정보를 저장합니다.

 AWS Flow Framework 그런 다음는 Amazon SWF의 활동 결과를 사용하여 워크플로 실행을 진행하는 방법을 결정합니다.

## 결과 분실 방지
<a name="awsflow-basics-reliable-execution-history"></a>

### 워크플로 내역 보관
<a name="maintaining-workflow-history"></a>

페타바이트 규모의 데이터에 관해 데이터 마이닝 작업을 수행하는 활동은 완료되는 데 *몇 시간*이 걸릴 수 있고, 인간 작업자에게 복잡한 작업을 수행하도록 지시하는 활동은 *며칠*, 심지어 *몇 주*가 걸릴 수도 있습니다.

이러한 시나리오를 수용하기 위해 AWS Flow Framework 워크플로 및 활동을 완료하는 데 임의로 시간이 걸릴 수 있습니다. 워크플로 실행*의 한도는 최대 1년*입니다. 장기 실행 프로세스를 안정적으로 실행하려면 워크플로의 실행 내역을 내구성을 고려해 지속적으로 저장할 수 있는 메커니즘이 필요합니다.

는 각 워크플로 인스턴스의 실행 기록을 유지 관리하는 Amazon SWF에 따라 이를 AWS Flow Framework 처리합니다. 워크플로의 내역은 워크플로 진행에 관한 온전하고 신뢰할 수 있는 기록으로서, 예약되고 완료된 모든 워크플로 및 활동 작업과 완료되거나 실패한 활동에서 반환하는 정보가 포함되어 있습니다.

AWS Flow Framework 애플리케이션은 필요한 경우 액세스할 수 있지만 일반적으로 워크플로 기록과 직접 상호 작용할 필요가 없습니다. 대부분의 경우 애플리케이션에서는 프레임워크가 이면의 워크플로 내역과 상호 작용하도록 허용할 수 있습니다. 워크플로 기록에 대한 전체 논의는 *Amazon Simple Workflow Service 개발자 안내서*의 [워크플로 기록](https://docs.aws.amazon.com/amazonswf/latest/developerguide/swf-dg-basic.html#swf-dev-about-workflow-history)을 참조하십시오.

### 상태 비저장 실행
<a name="stateless-execution"></a>

실행 내역을 통해 워크플로 작업자는 *상태 비저장* 상태가 될 수 있습니다. 워크플로 또는 활동 작업자 인스턴스가 여러 개인 경우 모든 작업자가 모든 작업을 수행할 수 있습니다. 작업자는 Amazon SWF에서 작업을 수행하는 데 필요한 모든 상태 정보를 수신합니다.

이러한 접근 방식을 통해 워크플로는 더 안정화됩니다. 예를 들어 활동 작업자가 실패해도 워크플로를 다시 시작할 필요가 없습니다. 작업자를 다시 시작하기만 하면 실패가 발생한 시점에 상관없이 작업 리스트를 폴링하고 목록에 있는 모든 작업을 처리하기 시작합니다. 사용자는 별도 시스템 상에 있을 수 있는 워크플로 및 활동 작업자를 두 개 이상 사용하여 전체 워크플로가 내결함성을 갖도록 할 수 있습니다. 그러면 작업자 중 하나가 실패하면 다른 작업자가 계속해서 예약된 작업을 처리하므로 워크플로 진행이 중단되지 않습니다.

## 실패한 분산 구성 요소 처리
<a name="awsflow-basics-reliable-execution-errors"></a>

활동은 짧은 시간 동안 접속이 끊기는 등 일시적인 이유로 실패하는 경우가 많으므로, 실패한 활동을 처리하는 범용 전략은 활동을 재시도하는 것입니다. 애플리케이션에서는 복잡한 메시지 전달 전략을 시행하여 재시도 프로세스를 처리하는 대신에 AWS Flow Framework를 사용할 수 있습니다. 또한 실패한 활동을 재시도하기 위한 몇 가지 메커니즘과 워크플로 내에서 비동기식, 분산형 작업 실행을 통해 작동하는 내장 예외 처리 메커니즘을 제공합니다.

# AWS Flow Framework 기본 개념: 분산 실행
<a name="awsflow-basics-distributed-execution"></a>

*워크플로 인스턴스*는 기본적으로 실행 중인 활동 및 오케스트레이션 로직을 여러 원격 컴퓨터에 분산할 수 있는 가상 실행 스레드입니다. Amazon SWF 및 AWS Flow Framework 함수는 다음을 통해 가상 CPU에서 워크플로 인스턴스를 관리하는 운영 체제입니다.
+ 각 인스턴스의 실행 상태 유지
+ 인스턴스 간 전환
+ 전환된 시점에 인스턴스의 실행을 다시 시작

## 워크플로 다시 재생
<a name="replaying-workflows"></a>

활동은 장시간 동안 실행될 수 있기 때문에 활동이 완료될 때까지 단순히 워크플로를 차단하는 것은 바람직하지 않습니다. 대신는 Amazon SWF에서 유지 관리하는 워크플로 기록을 기반으로 에피소드에서 워크플로를 실행하는 *재생* 메커니즘을 사용하여 워크플로 실행을 AWS Flow Framework 관리합니다.

각 에피소드에서는 *각 활동을 한 번만 실행*하는 방식으로 워크플로 로직을 다시 재생하고, 활동 및 비동기식 메서드는 이들의 [Promise](awsflow-basics-data-exchange-activities-workflows.md) 객체가 준비 상태가 될 때까지 실행되지 않도록 합니다.

워크플로 시작자는 워크플로 실행을 시작할 때 첫 번째 다시 재생 에피소드를 시작합니다. 프레임워크에서는 워크플로의 진입점 메서드를 호출하고 다음 작업을 수행합니다.

1. 모든 활동 클라이언트 메서드를 호출하는 것을 비롯해 활동 완료에 의존하지 않는 모든 워크플로 작업을 실행합니다.

1. 실행을 위해 예약할 활동 작업 목록을 Amazon SWF에 제공합니다. 첫 번째 에피소드의 경우 이 목록은 Promise에 의존하지 않고 즉시 실행할 수 있는 활동으로만 구성됩니다.

1. 에피소드가 완료되었음을 Amazon SWF에 알립니다.

Amazon SWF는 활동 작업을 워크플로 내역에 저장하고 활동 작업 목록에 배치하여 실행 예약을 합니다. 활동 작업자는 작업 목록을 폴링하고 작업을 실행합니다.

활동 작업자는 작업을 완료하면 그 결과를 Amazon SWF에 반환합니다. 그러면 이를 워크플로 실행 내역에 기록하고 워크플로 작업 목록에 배치하여 워크플로 작업자를 위해 새 *워크플로 작업*을 예약합니다. 워크플로 작업자는 작업 목록을 폴링하고 작업을 받으면 다음과 같이 그다음 다시 재생 에피소드를 실행합니다.

1. 프레임워크에서는 워크플로의 진입점 메서드를 다시 실행하고 다음 작업을 수행합니다.
   + 모든 활동 클라이언트 메서드를 호출하는 것을 비롯해 활동 완료에 의존하지 않는 모든 워크플로 작업을 실행합니다. 그러나 프레임워크에서는 실행 내역을 점검하여 중복되는 활동 작업은 예약하지 않습니다.
   + 내역을 점검하여 어떤 활동 작업이 완료되었는지 확인하고 그러한 활동에 의존하는 모든 비동기식 워크플로 메서드를 실행합니다.

1. 실행할 수 있는 모든 워크플로 작업이 완료되면 다음과 같이 프레임워크에서는 Amazon SWF에 이를 보고합니다.
   + 지난 에피소드 이후 입력 `Promise<T>` 객체가 준비 상태가 되어 실행 예약을 할 수 있는 모든 활동의 목록을 Amazon SWF에 제공합니다.
   + 에피소드에서 추가 활동 작업을 생성하지 않았지만 여전히 완료되지 않은 활동이 있을 경우 프레임워크에서는 Amazon SWF에 에피소드가 완료되었음을 알립니다. 그다음에 다른 활동이 완료되길 기다렸다가 그다음 다시 재생 에피소드를 시작합니다.
   + 에피소드에서 추가 활동 작업을 생성하지 않았고 모든 활동이 완료되었다면 프레임워크에서는 Amazon SWF에 워크플로 실행이 완료되었음을 알립니다.

다시 재생 동작의 예는 [AWS Flow Framework for Java 재생 동작](programming-replay.md) 단원을 참조하십시오.

## 다시 재생 및 비동기식 워크플로 메서드
<a name="awsflow-basics-distributed-execution-async"></a>

비동기식 워크플로 메서드는 모든 입력 `Promise<T>` 객체가 준비 상태가 될 때까지 실행을 연기하므로 활동과 흡사한 방식으로 사용되는 경우가 많습니다. 그러나 다시 재생 메커니즘에서는 활동과는 다른 방식으로 비동기식 메서드를 처리합니다.
+ 다시 재생한다고 해서 비동기식 메서드가 한 번만 실행된다는 보장은 없습니다. 다시 재생에서는 입력 Promise 객체가 준비 상태가 될 때까지 비동기식 메서드에서 실행을 연기하지만, 그다음에는 모든 후속 에피소드에 대해 이 메서드를 실행합니다.
+ 비동기식 메서드가 완료되면 새 에피소드를 시작하지 않습니다.

비동기식 워크플로 다시 재생의 한 가지 예가 [AWS Flow Framework for Java 재생 동작](programming-replay.md)에 나와 있습니다.

## 다시 재생 및 워크플로 구현
<a name="awsflow-basics-distributed-execution-impl"></a>

대부분의 경우 다시 재생 메커니즘의 세부 정보를 일일이 신경 쓸 필요가 없습니다. 그것은 이면에서 기본적으로 일어나는 일일 뿐입니다. 그러나 다시 재생에는 워크플로 구현과 관련해 두 가지 중요한 의미가 있습니다.
+ 워크플로 메서드를 사용해 장시간 실행되는 작업을 수행해서는 안 되는데, 그 이유는 다시 재생에서 작업을 여러 번 반복할 것이기 때문입니다. 심지어 비동기식 워크플로 메서드도 일반적으로 두 번 이상 실행됩니다. 그 대신에 장시간 실행되는 작업에 대해서는 활동을 사용하십시오. 그러면 다시 재생에서 활동을 한 번만 실행합니다.
+ 워크플로 로직은 완전히 결정적인 것이어야 하고, 모든 에피소드에서는 동일한 제어 흐름 경로를 받아들여야 합니다. 예를 들어 제어 흐름 경로는 현재 시간에 의존해서는 안 됩니다. 다시 재생 및 결정주의 요건에 관한 자세한 설명은 [불확정성](details.md#details.non) 단원을 참조하십시오.

# AWS Flow Framework 기본 개념: 작업 목록 및 작업 실행
<a name="awsflow-basics-task-lists"></a>

 Amazon SWF는 워크플로와 활동 작업을 이름이 지정된 목록에 게시하는 방법으로 관리합니다. Amazon SWF는 워크플로 작업자 및 활동 작업자 각각에 대해 하나씩, 최소 두 가지 작업 목록을 보관합니다.

**참고**  
사용자는 목록마다 다른 작업자를 할당하여 필요한 개수 만큼 작업 목록을 지정할 수 있습니다. 작업 목록의 개수에는 제한이 없습니다. 일반적으로 작업자 객체를 생성할 때 작업자 호스트 애플리케이션에 작업자의 작업을 지정합니다.

다음은 `HelloWorldWorkflow` 호스트 애플리케이션에서 발췌한 것으로서, 새 활동 작업자를 생성하여 이를 `HelloWorldList` 활동 작업 목록에 할당합니다.

```
public class GreeterWorker  {
    public static void main(String[] args) throws Exception {
    ...
    String domain = " helloWorldExamples";
    String taskListToPoll = "HelloWorldList";

    ActivityWorker aw = new ActivityWorker(service, domain, taskListToPoll);
    aw.addActivitiesImplementation(new GreeterActivitiesImpl());
    aw.start();
    ...
  }
}
```

기본적으로 Amazon SWF는 `HelloWorldList` 목록의 작업자 작업을 예약합니다. 그런 다음 작업자는 작업에 대해 이 목록을 폴링합니다. 작업 목록에는 어떤 이름도 지정할 수 있습니다. 심지어 워크플로 및 활동 목록에 같은 이름을 사용할 수도 있습니다. 내부적으로 Amazon SWF는 워크플로 및 활동 작업 목록 이름을 여러 가지 네임스페이스에 배치하므로 두 목록은 서로 구분됩니다.

작업 목록을 지정하지 않으면 작업자가 Amazon SWF에 유형을 등록할 때가 기본 목록을 AWS Flow Framework 지정합니다. 자세한 내용은 [워크플로 및 활동 유형 등록](features.registration.md) 단원을 참조하십시오.

특정 작업자 또는 작업자 그룹에서 특정 작업을 수행하도록 하는 것이 더 좋은 경우가 때로 있습니다. 예를 들면 이미지 처리 워크플로에서는 한 활동을 사용하여 이미지를 다운로드하고 다른 활동을 사용하여 이미지를 처리할 수 있습니다. 동일 시스템에서 두 가지 작업을 수행하여 네트워크를 통해 대규모 파일을 전송하는 오버헤드를 피하는 것이 더 효율적입니다.

그러한 상황을 지원하기 위해 `schedulingOptions` 파라미터가 포함된 오버로드를 사용하여 활동 클라이언트 메서드를 호출할 때 작업 목록을 명시적으로 지정할 수 있습니다. 메서드에 적절하게 구성된 `ActivitySchedulingOptions` 객체를 전달하여 작업 목록을 지정합니다.

예를 들어 `HelloWorldWorkflow` 애플리케이션의 `say` 활동을 `getName` 및 `getGreeting`과는 다른 활동 작업자가 호스팅한다고 가정합시다. 다음 예시에서는 `say`에서 `getName` 및 `getGreeting`이 처음부터 서로 다른 목록에 할당되었다 하더라도 이 둘과 동일한 작업 목록을 사용하도록 하는 방법을 보여줍니다.

```
public class GreeterWorkflowImpl implements GreeterWorkflow {
  private GreeterActivitiesClient operations1 = new GreeterActivitiesClientImpl1(); //getGreeting and getName
  private GreeterActivitiesClient operations2 = new GreeterActivitiesClientImpl2(); //say
  @Override
  public void greet() {
    Promise<String> name = operations1.getName();
    Promise<String> greeting = operations1.getGreeting(name);
    runSay(greeting);
  }
  @Asynchronous
  private void runSay(Promise<String> greeting){
    String taskList = operations1.getSchedulingOptions().getTaskList();
    ActivitySchedulingOptions schedulingOptions = new ActivitySchedulingOptions();
    schedulingOptions.setTaskList(taskList);
    operations2.say(greeting, schedulingOptions);
  }
}
```

비동기식 `runSay` 메서드는 클라이언트 객체로부터 `getGreeting` 작업 목록을 가져옵니다. 그런 다음 `say`에서 `getGreeting`과 동일한 작업 목록을 폴링하도록 하는 `ActivitySchedulingOptions` 객체를 생성 및 구성합니다.

**참고**  
사용자가 `schedulingOptions` 파라미터를 활동 클라이언트 메서드에 전달하면 이 메서드에서는 이 활동 실행에 대해서만 원본 작업 목록을 재정의합니다. 사용자가 작업 목록을 지정하지 않고 활동 클라이언트 메서드를 다시 직접적으로 호출하면 Amazon SWF가 작업을 원본 목록에 할당하고 활동 작업자는 이 목록을 폴링합니다.

# AWS Flow Framework 기본 개념: 확장 가능한 애플리케이션
<a name="awsflow-basics-scalable"></a>

Amazon SWF에는 현재 로드를 처리하기 위해 워크플로 애플리케이션의 규모를 쉽게 조정할 수 있는 다음 두 가지 주요 기능이 있습니다.
+ 상태 비저장 애플리케이션을 구현할 수 있게 해주는 전체 워크플로 실행 내역
+ 작업 실행과 느슨하게 결합된 작업 일정 조정을 통해 현재 요구에 맞게 애플리케이션의 규모를 쉽게 조정할 수 있는 기능

Amazon SWF는 워크플로 및 활동 작업자와 직접 통신하는 것이 아니라 작업을 동적으로 할당된 작업 목록에 게시하는 방식으로 작업의 일정을 조정합니다. 그 대신에 작업자는 HTTP 요청을 사용하여 작업의 해당 목록을 폴링합니다. 이 접근 방식에서는 작업 일정 조정을 작업 실행에 느슨하게 결합하여 작업자가 Amazon EC2 인스턴스, 기업 데이터 센터, 클라이언트 컴퓨터 등 적합한 모든 시스템에서 실행될 수 있게 합니다. HTTP 요청은 작업자에 의해 시작되므로 외부에서 볼 수 있는 포트가 필요하지 않으므로 작업자가 방화벽 뒤에서 실행할 수도 있습니다.

작업자가 작업에 대한 폴링에 사용하는 긴 폴링 메커니즘을 사용하면 작업자가 오버로드되지 않습니다. 예약된 작업에 스파이크가 있다 하더라도 작업자는 자신의 고유 속도로 작업을 가져옵니다. 그러나 작업자는 상태 비저장이므로 추가 작업자 인스턴스를 시작하여 애플리케이션의 규모를 증가된 로드에 맞게 동적으로 조정할 수 있습니다. 각 인스턴스는 서로 다른 시스템에서 실행 중일지라도 동일한 작업 목록을 폴링하고 첫 번째 사용 가능 작업자 인스턴스에서는 작업자의 위치나 시작 시점에 상관없이 각 작업을 실행합니다. 로드가 감소하면 이에 따라 작업자의 수를 줄일 수 있습니다.

# AWS Flow Framework 기본 개념: 활동과 워크플로 간의 데이터 교환
<a name="awsflow-basics-data-exchange-activities-workflows"></a>

비동기식 활동 클라이언트 메서드를 직접적으로 호출하면 이 메서드에서는 즉시 *Promise*(*Future*라고도 함) 객체를 반환하는데, 이 객체에서는 활동 메서드의 반환 값을 표시합니다. 처음에 이 Promise는 준비되지 않은 상태이고 반환 값은 정의되어 있지 않습니다. 활동 메서드에서 작업을 완료하고 값을 반환하면 프레임워크에서는 이 반환 값을 네트워크를 통해 워크플로 작업자에게 마샬링합니다. 그러면 이 작업자는 Promise에 값을 할당하고 객체를 준비 상태로 둡니다.

활동 메서드에 반환 값이 없다 하더라도 사용자는 여전히 워크플로 실행 관리에 Promise를 사용할 수 있습니다. 활동 클라이언트 메서드 또는 비동기식 워크플로 메서드에 반환된 Promise를 전달하면 해당 메서드에서는 객체가 준비 상태가 될 때까지 실행을 연기합니다.

Promise를 활동 클라이언트 메서드에 한 개 이상 전달하면 프레임워크에서는 작업을 대기열에 배치하기는 하지만 모든 객체가 준비 상태가 될 때까지 예약을 연기합니다. 그런 다음 각 Promise에서 데이터를 추출하여 이를 인터넷을 통해 활동 작업자에게 마샬링합니다. 그러면 이 작업자는 이를 활동 메서드에 표준 유형으로 전달합니다.

**참고**  
워크플로 및 활동 작업자 사이에 데이터를 대량 전송해야 하는 경우 선호되는 방식은 데이터를 편리한 위치에 저장하고 검색 정보를 전달하는 것입니다. 예를 들어 Amazon S3 버킷에 데이터를 저장하고 관련 URL을 전달할 수 있습니다.

## Promise<T> 유형
<a name="awsflow-basics-data-exchange-activities-workflows.promise"></a>

`Promise<T>` 유형은 몇 가지 점에서 Java `Future<T>` 유형과 비슷합니다. 두 유형에서는 비동기식 메서드에서 반환하는 값을 표시하며 처음에는 정의되어 있지 않습니다. 사용자는 `get` 메서드를 직접적으로 호출하여 객체의 값에 액세스합니다. 이것 말고도 이 두 유형은 상당히 다르게 동작합니다.
+ `Future<T>`는 동기화 구성으로서, 애플리케이션이 비동기식 메서드가 완료될 때까지 대기할 수 있게 해줍니다. `get`을 직접적으로 호출하였는데 객체가 준비 상태가 아니면 객체가 준비 상태가 될 때까지 차단합니다.
+ `Promise<T>`의 경우 동기화는 프레임워크에서 처리됩니다. `get`을 직접적으로 호출하였는데 객체가 준비 상태가 아니면 `get`에서 예외가 발생합니다.

`Promise<T>`의 기본 목적은 한 활동에서 다른 활동으로의 데이터 흐름을 관리하는 것입니다. 이를 통해 입력 데이터가 유효할 때까지 활동이 실행되지 않게 합니다. 많은 경우 워크플로 작업자는 `Promise<T>` 객체에 직접 액세스할 필요가 없습니다. 즉 한 활동에서 다른 활동으로 객체를 전달하기만 하고 세부 정보는 프레임워크 및 활동 작업자가 처리하도록 합니다. 워크플로 작업자에 있는 `Promise<T>` 객체의 값에 액세스하려면 그 객체가 준비 상태인지 확인한 후에 `get` 메서드를 직접적으로 호출해야 합니다.
+ 선호되는 방식은 `Promise<T>` 객체를 비동기식 워크플로 메서드에 전달하고 거기에서 값을 처리하는 것입니다. 비동기식 메서드에서는 모든 입력 `Promise<T>` 객체가 준비 상태가 될 때가 실행을 연기합니다. 이를 통해 사용자가 객체의 값에 안전하게 액세스할 수 있도록 보장합니다.
+ `Promise<T>`에서는 객체가 준비 상태가 되면 `true`를 반환하는 `isReady` 메서드를 노출합니다. `isReady`를 사용하여 `Promise<T>` 객체를 폴링하는 것은 좋지 않지만, 특정 환경에서는 `isReady`가 유용합니다.

Java AWS Flow Framework 용 에는에서 파생`Promise<T>`되고 유사한 동작을 갖는 `Settable<T>` 유형도 포함되어 있습니다. 차이점은 프레임워크가 일반적으로 `Promise<T>` 객체의 값을 설정하고 워크플로 작업자가의 값을 설정할 책임이 있다는 것입니다`Settable<T>`.

어떤 상황에서는 워크플로 작업자가 `Promise<T>` 객체를 생성하고 그 값을 설정해야 합니다. 예를 들어 `Promise<T>` 객체를 반환하는 비동기식 메서드에서는 반환 값을 생성해야 합니다.
+ 입력된 값을 표시하는 객체를 생성하려면 적절한 유형의 `Promise<T>` 객체를 생성한 후 값을 설정하고 이 값을 준비 상태에 입력하는 정적 `Promise.asPromise` 메서드를 직접적으로 호출합니다.
+ `Promise<Void>` 객체를 생성하려면 정적 `Promise.Void` 메서드를 직접적으로 호출합니다.

**참고**  
`Promise<T>`에서는 유효한 유형은 모두 표시할 수 있습니다. 그러나 데이터가 인터넷을 통해 마샬링되어야 하는 경우 그 유형은 데이터 변환기와 호환되어야 합니다. 자세한 내용은 다음 단원을 참조하십시오.

## 데이터 변환기 및 마샬링
<a name="awsflow-basics-data-exchange-activities-workflows.data"></a>

는 데이터 변환기를 사용하여 인터넷에서 데이터를 AWS Flow Framework 마샬링합니다. 기본적으로 프레임워크에서는 [Jackson JSON 프로세서](https://github.com/codehaus/jackson) 기반 데이터 변환기를 사용합니다. 그러나 이 변환기에는 몇 가지 제한 사항이 있습니다. 예를 들면 문자열을 키로 사용하지 않는 맵은 마샬링할 수 없습니다. 기본 변환기로는 애플리케이션에 충분하지 않은 경우 사용자 지정 데이터 변환기를 구현할 수 있습니다. 자세한 내용은 [DataConverters](dataconverters.md) 섹션을 참조하십시오.

# AWS Flow Framework 기본 개념: 애플리케이션과 워크플로 실행 간의 데이터 교환
<a name="awsflow-basics-data-exchange-workflows-application"></a>

워크플로 진입점 메서드에는 파라미터가 한 개 이상 있을 수 있는데, 이를 통해 워크플로 시작자는 초기 데이터를 워크플로로 전달할 수 있습니다. 실행 중에 추가 데이터를 워크플로에 제공하는 것도 유용할 수 있습니다. 예를 들어 고객이 자신의 배송지 주소를 변경하면 주문 처리 워크플로에 알려주어 적절히 변경할 수 있게 할 수 있습니다.

Amazon SWF를 통해 워크플로는 *신호* 메서드를 구현할 수 있습니다. 이로써 워크플로 시작자와 같은 애플리케이션에서는 데이터를 언제든지 워크플로로 전달할 수 있습니다. 신호 메서드에는 원하는 대로 이름과 파라미터를 지정할 수 있습니다. 사용자는 워크플로 인터페이스 정의를 포함하고 메서드 선언에 `@Signal` 주석을 붙여 신호 메서드로 지정합니다.

다음 예에서는 신호 메서드인 `changeOrder`를 선언하고 이를 통해 워크플로가 시작된 후에 워크플로 시작자가 원래 주문을 변경할 수 있게 해주는 주문 처리 워크플로 인터페이스를 보여줍니다.

```
@Workflow
@WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 300)
public interface WaitForSignalWorkflow {
    @Execute(version = "1.0")
    public void placeOrder(int amount);
    @Signal
    public void changeOrder(int amount);
}
```

프레임워크의 주석 프로세서는 신호 메서드와 동일한 이름의 워크플로 클라이언트 메서드를 생성하고, 워크플로 시작자는 클라이언트 메서드를 직접적으로 호출하여 데이터를 워크플로로 전달합니다. 예제는 [AWS Flow Framework 레시피](https://aws.amazon.com/code/2535278400103493)를 참조하십시오.

# Amazon SWF 제한 시간 유형
<a name="swf-timeout-types"></a>

워크플로 실행이 올바르게 실행되도록 Amazon SWF를 사용하여 다양한 유형의 제한 시간을 설정할 수 있습니다. 워크플로 전체를 얼마나 오래 실행할 수 있는지 지정하는 제한 시간도 있고, 활동 작업이 작업자에게 할당되기까지 걸리는 시간 및 예약 시점으로부터 완료되기까지 걸리는 시간을 지정하는 제한 시간도 있습니다. Amazon SWF API의 모든 제한 시간은 초 단위로 지정됩니다. Amazon SWF는 `NONE` 문자열을 제한 시간 값으로도 지원하며 이는 제한 시간이 없음을 나타냅니다.

결정 작업 및 활동 작업과 관련된 제한 시간의 경우, Amazon SWF는 워크플로 실행 내역에 이벤트를 추가합니다. 이러한 이벤트의 속성은 발생한 제한 시간의 유형과 해당하는 결정 작업 또는 활동 작업에 대한 정보를 제공합니다. Amazon SWF는 결정 작업을 예약합니다. 새 결정 작업을 받은 결정자는 내역에 표시된 제한 시간 이벤트를 보고 [RespondDecisionTaskCompleted](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondDecisionTaskCompleted.html) 작업을 호출해 적절한 조치를 취합니다.

작업은 예약 시점부터 닫힐 때까지 열린 상태로 간주됩니다. 따라서 작업자가 작업을 처리하는 동안에는 열려 있는 상태로 보고됩니다. 작업자가 작업을 [완료됨](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondActivityTaskCompleted.html), [취소됨](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondActivityTaskCanceled.html) 또는 [실패](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondActivityTaskFailed.html)로 보고하면 작업이 닫힙니다. 제한 시간으로 인해 Amazon SWF에서 작업을 종료할 수도 있습니다.

## 워크플로 및 결정 작업의 제한 시간
<a name="swf-timeout-types-workflow"></a>

다음 다이어그램은 워크플로 및 결정 제한 시간이 워크플로의 수명과 어떤 관계인지 보여줍니다.

![\[제한 시간이 있는 워크플로의 수명\]](http://docs.aws.amazon.com/ko_kr/amazonswf/latest/awsflowguide/images/workflow_timeouts.png)


워크플로 및 결정 작업과 관련된 제한 시간 유형은 다음 두 가지입니다.
+ **워크플로 시작-닫기(`timeoutType: START_TO_CLOSE`)** – 이 제한 시간은 워크플로 실행이 완료되는 데 걸리는 최대 시간을 지정합니다. 워크플로 등록 과정에서 기본값으로 설정되지만 워크플로가 시작될 때 다른 값으로 재정의할 수 있습니다. 이 제한 시간을 초과하면 Amazon SWF는 워크플로 실행을 종료하고 워크플로 실행 기록에 [WorkflowExecutionTimedOut](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_WorkflowExecutionTimedOutEventAttributes.html) 유형의 [이벤트](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_HistoryEvent.html)를 추가합니다. `timeoutType`을 비롯한 이벤트 속성으로 이 워크플로 실행에 적용되는 `childPolicy`를 지정합니다. 하위 정책은 상위 워크플로 실행 시간이 초과되거나 그렇지 않고 종료되면 하위 워크플로 실행을 처리하는 방법을 지정합니다. 예를 들어, `childPolicy`를 TERMINATE로 설정하면 하위 워크플로 실행이 종료됩니다. 워크플로 실행이 시간 초과되면 가시성 호출 이외의 조치를 취할 수 없습니다.
+ **결정 작업 시작-닫기(`timeoutType: START_TO_CLOSE`)** – 이 제한 시간은 해당 결정자가 결정 작업을 완료하는 데 소요할 수 있는 최대 시간을 지정합니다. 이 값은 워크플로 유형 등록 중 설정합니다. 이 제한 시간을 초과하면 워크플로 실행 내역에 해당 작업이 시간 초과된 것으로 표시되고, Amazon SWF는 워크플로 내역에 [DecisionTaskTimedOut](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_DecisionTaskTimedOutEventAttributes.html) 유형의 이벤트를 추가합니다. 이벤트 속성에는 결정 작업이 예약되었을 때 해당하는 이벤트의 ID(`scheduledEventId`)와 결정 작업이 시작되었을 때 해당하는 이벤트의 ID(`startedEventId`)가 포함됩니다. Amazon SWF는 이벤트를 추가하는 한편 새 결정 작업을 예약해 결정자에게 이 결정 작업이 시간 초과되었음을 알립니다. 시간 초과가 발생한 후 `RespondDecisionTaskCompleted`를 사용해 시간 초과된 결정 작업을 완료하려고 하면 실패합니다.

## 활동 작업의 제한 시간
<a name="swf-timeout-types-activity"></a>

다음 다이어그램은 제한 시간이 활동 작업의 수명과 어떻게 관련이 있는지를 보여줍니다.

![\[제한 시간이 있는 작업의 수명\]](http://docs.aws.amazon.com/ko_kr/amazonswf/latest/awsflowguide/images/activity_timeouts.png)


여기에는 활동 작업과 관련된 제한 시간 유형이 4개 있습니다.
+ **활동 작업 시작-닫기(`timeoutType: START_TO_CLOSE`)** – 이 제한 시간은 활동 작업자가 작업을 수신한 후 작업을 처리하기 위해 보낼 수 있는 최대 시간을 지정합니다. [RespondActivityTaskCanceled](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondActivityTaskCanceled.html), [RespondActivityTaskCompleted](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondActivityTaskCompleted.html) 및 [RespondActivityTaskFailed](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondActivityTaskFailed.html)를 사용해 시간 초과된 활동 작업을 닫으려고 하면 실패합니다.
+ **활동 작업 하트비트(`timeoutType: HEARTBEAT`)** – 이 제한 시간은 `RecordActivityTaskHeartbeat` 작업을 통해 진행 상황을 제공하기 전에 작업을 실행할 수 있는 최대 시간을 지정합니다.
+ **활동 작업 예약-시작(`timeoutType: SCHEDULE_TO_START`)** – 활동 작업을 수행할 작업자가 없을 때 Amazon SWF는 이 제한 시간만큼 기다렸다가 활동 작업을 시간 초과로 처리합니다. 시간이 초과로 만료된 작업은 다른 작업자에게 할당되지 않습니다.
+ **활동 작업 예약-닫기(`timeoutType: SCHEDULE_TO_CLOSE`)** – 이 제한 시간은 예약 시간부터 완료될 때까지 걸릴 수 있는 기간을 지정합니다. 이 값은 작업 예약-시작 제한 시간과 작업 시작-닫기 제한 시간의 합보다 크면 안 됩니다.

**참고**  
각 제한 시간 유형에는 기본값이 있는데, 일반적으로 `NONE`(무한정)으로 설정되어 있습니다. 그러나 활동 실행의 최대 시간은 1년으로 제한됩니다.

활동 유형 등록 중 활동에 대한 기본값을 설정하지만 활동 작업을 [예약](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_ScheduleActivityTaskDecisionAttributes.html)할 때 새 값으로 기본값을 재정의할 수 있습니다. 이러한 제한 시간 중 하나가 발생하면 Amazon SWF는 워크플로 기록에 [ActivityTaskTimedOut](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_ActivityTaskTimedOutEventAttributes.html) 유형의 [이벤트](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_HistoryEvent.html)를 추가합니다. 이 이벤트의 `timeoutType` 값 속성은 어떤 제한 시간이 발생했는지 지정합니다. 각 제한 시간의 경우 `timeoutType`의 값은 괄호 안에 표시됩니다. 또한 이벤트 속성에는 활동 작업이 예약되었을 때 해당하는 이벤트의 ID(`scheduledEventId`)와 결정 작업이 시작되었을 때 해당하는 이벤트의 ID(`startedEventId`)가 포함됩니다. Amazon SWF는 이벤트를 추가하는 한편 새 결정 작업을 예약해 결정자에게 시간 초과가 발생했음을 알립니다.