

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

# Amazon SWF를 사용하여 독점적 선택 구현
<a name="swf-dg-exclusive-choice"></a>

일부 시나리오에서는 이전 활동의 결과에 따라 여러 활동 세트를 예약하려고 할 수 있습니다. 전용 선택 패턴을 사용하면 애플리케이션의 복잡한 요구 사항을 충족하는 유연한 워크플로를 생성할 수 있습니다.

Amazon SWF에는 특정 배타적 선택 작업이 없습니다. 독점적인 선택을 구현하려면 결정자 로직을 작성하여 이전 활동의 결과를 기반으로 결정을 내려야 합니다. 독점적 선택의 적용 사례는 다음과 같습니다.
+ 이전 활동의 결과가 실패인 경우 정리 활동 수행
+ 고객이 기본 또는 고급 요금제를 구입했는지 여부에 따라 다른 활동 예약
+ 고객의 주문 내역에 따라 다른 고객 인증 활동 수행

전자 상거래의 예에서 독점적 선택을 사용하면 신용카드 청구 결과에 따라 주문을 배송 또는 취소할 수 있습니다. 다음 그림에서 결정자는 신용카드가 성공적으로 청구된 경우 주문 발송 및 완료 기록 활동 작업을 예약합니다. 그렇지 않으면 주문 취소 및 고객에게 이메일 보내기 활동 작업을 예약합니다.

![고객 주문 워크플로 다이어그램](http://docs.aws.amazon.com/ko_kr/amazonswf/latest/developerguide/images/swf-dg-customer-order-workflow.png)


신용카드에 성공적으로 청구되면 결정자가 `ShipOrder` 활동을 예약합니다. 그렇지 않으면 결정자는 `CancelOrder` 활동을 예약합니다.

이 경우 내역을 해석하고 신용카드에 성공적으로 청구되었는지 여부를 확인하도록 결정자를 프로그래밍합니다. 이렇게 하려면 다음과 유사한 로직이 있어야 합니다.

```
IF lastEvent = "WorkflowExecutionStarted"
	addToDecisions ScheduleActivityTask(ActivityType = "VerifyOrderActivity")

ELSIF lastEvent = "ActivityTaskCompleted"
	    AND ActivityType = "VerifyOrderActivity"
	addToDecisions ScheduleActivityTask(ActivityType = "ChargeCreditCardActivity")

#Successful Credit Card Charge Activities
ELSIF lastEvent = "ActivityTaskCompleted"
      AND ActivityType = "ChargeCreditCardActivity"
  addToDecisions ScheduleActivityTask(ActivityType = "ShipOrderActivity")

ELSIF lastEvent = "ActivityTaskCompleted"
	    AND ActivityType = "ShipOrderActivity"
  addToDecisions ScheduleActivityTask(ActivityType = "RecordOrderCompletionActivity")

ELSIF lastEvent = "ActivityTaskCompleted"
	    AND ActivityType = "RecordOrderCompletionActivity"
	addToDecisions CompleteWorkflowExecution

#Unsuccessful Credit Card Charge Activities
ELSIF lastEvent = "ActivityTaskFailed"
      AND ActivityType = "ChargeCreditCardActivity"
  addToDecisions ScheduleActivityTask(ActivityType = "CancelOrderActivity")

ELSIF lastEvent = "ActivityTaskCompleted"
	    AND ActivityType = "CancelOrderActivity"
	addToDecisions ScheduleActivityTask(ActivityType = "EmailCustomerActivity")

ELSIF lastEvent = "ActivityTaskCompleted"
	    AND ActivityType = "EmailCustomerActivity"
	addToDecisions CompleteWorkflowExecution

ENDIF
```

신용카드에 성공적으로 청구되면 결정자는 `RespondDecisionTaskCompleted`로 응답해 `ShipOrder` 활동을 예약해야 합니다.

```
https://swf.us-east-1.amazonaws.com
RespondDecisionTaskCompleted
{
  "taskToken": "12342e17-80f6-FAKE-TASK-TOKEN32f0223",
  "decisions":[
      {
          "decisionType":"ScheduleActivityTask",
          "scheduleActivityTaskDecisionAttributes":{
              "control":"OPTIONAL_DATA_FOR_DECIDER",
              "activityType":{
                  "name":"ShipOrder",
                  "version":"2.4"
              },
              "activityId":"3e2e6e55-e7c4-fee-deed-aa815722b7be",
              "scheduleToCloseTimeout":"3600",
              "taskList":{
                  "name":"SHIPPING"
              },
              "scheduleToStartTimeout":"600",
              "startToCloseTimeout":"3600",
              "heartbeatTimeout":"300",
              "input": "123 Main Street, Anytown, United States"
          }
      }
  ]
}
```

신용카드에 성공적으로 청구되지 않으면 결정자는 `RespondDecisionTaskCompleted`로 응답해 `CancelOrder` 활동을 예약해야 합니다.

```
https://swf.us-east-1.amazonaws.com
RespondDecisionTaskCompleted
{
  "taskToken": "12342e17-80f6-FAKE-TASK-TOKEN32f0223",
  "decisions":[
      {
          "decisionType":"ScheduleActivityTask",
          "scheduleActivityTaskDecisionAttributes":{
              "control":"OPTIONAL_DATA_FOR_DECIDER",
              "activityType":{
                  "name":"CancelOrder",
                  "version":"2.4"
              },
              "activityId":"3e2e6e55-e7c4-fee-deed-aa815722b7be",
              "scheduleToCloseTimeout":"3600",
              "taskList":{
                  "name":"CANCELLATIONS"
              },
              "scheduleToStartTimeout":"600",
              "startToCloseTimeout":"3600",
              "heartbeatTimeout":"300",
              "input": "Out of Stock"
          }
      }
  ]
}
```

Amazon SWF에서 `RespondDecisionTaskCompleted` 작업의 데이터를 확인할 수 있는 경우 Amazon SWF는 다음과 유사한 성공적인 HTTP 응답을 반환합니다.

```
HTTP/1.1 200 OK
Content-Length: 11
Content-Type: application/json
x-amzn-RequestId: 93cec6f7-0747-11e1-b533-79b402604df1
```