

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

# 하위 워크플로 실행
<a name="childworkflow"></a>

지금까지의 예시에서는 워크플로 실행을 애플리케이션에서 직접 시작하였습니다. 그러나 생성된 클라이언트에 있는 워크플로 진입점 메서드를 호출하는 방식으로 워크플로 내에서 워크플로 실행을 시작할 수 있습니다. 워크플로 실행이 다른 워크플로 실행의 맥락에서 시작되는 경우 이를 가리켜 하위 워크플로 실행이라고 합니다. 이를 통해 복잡한 워크플로를 더 작은 유닛으로 리팩토링한 후 이를 서로 다른 워크플로에서 공유할 수 있습니다. 예를 들어 결제 처리 워크플로를 생성한 후 이를 주문 처리 워크플로에서 호출할 수 있습니다.

의미상 하위 워크플로 실행은 다음 차이점을 제외하고는 독립 실행형 워크플로와 동일하게 작동합니다.

1. 사용자의 명시적인 작업(예: `TerminateWorkflowExecution` Amazon SWF API 호출 또는 시간 초과로 인해 종료)으로 인해 상위 워크플로가 종료되는 경우 하위 워크플로 실행은 하위 정책에 따라 결정됩니다. 이 하위 정책에서 하위 워크플로 실행을 종료, 취소 또는 중단(계속 실행)하도록 설정할 수 있습니다.

1. 하위 워크플로의 결과(진입점 메서드의 반환 값)는 비동기식 메서드에서 반환하는 `Promise<T>`와 마찬가지로 상위 워크플로 실행에서 사용할 수 있습니다. 이것은 애플리케이션이 Amazon SWF API를 사용하여 출력을 얻어야 하는 독립 실행형 실행과는 다릅니다.

다음 예시의 `OrderProcessor` 워크플로에서는 `PaymentProcessor` 하위 워크플로를 생성합니다.

```
@Workflow
@WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 60,
              defaultTaskStartToCloseTimeoutSeconds = 10)
public interface OrderProcessor {

    @Execute(version = "1.0")
    void processOrder(Order order);
}

public class OrderProcessorImpl implements OrderProcessor {
    PaymentProcessorClientFactory factory
         = new PaymentProcessorClientFactoryImpl();

    @Override
    public void processOrder(Order order) {
        float amount = order.getAmount();
        CardInfo cardInfo = order.getCardInfo();

        PaymentProcessorClient childWorkflowClient = factory.getClient();
        childWorkflowClient.processPayment(amount, cardInfo);
    }

}

@Workflow
@WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 60,
                 defaultTaskStartToCloseTimeoutSeconds = 10)
public interface PaymentProcessor {

    @Execute(version = "1.0")
    void processPayment(float amount, CardInfo cardInfo);

}

public class PaymentProcessorImpl implements PaymentProcessor {
    PaymentActivitiesClient activitiesClient = new PaymentActivitiesClientImpl();

    @Override
    public void processPayment(float amount, CardInfo cardInfo) {
        Promise<PaymentType> payType = activitiesClient.getPaymentType(cardInfo);
        switch(payType.get()) {
        case Visa:
            activitiesClient.processVisa(amount, cardInfo);
            break;
        case Amex:
            activitiesClient.processAmex(amount, cardInfo);
            break;
      default:
         throw new UnSupportedPaymentTypeException();
        }
    }

}

@Activities(version = "1.0")
@ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 3600,
                             defaultTaskStartToCloseTimeoutSeconds = 3600)
public interface PaymentActivities {

    PaymentType getPaymentType(CardInfo cardInfo);

    void processVisa(float amount, CardInfo cardInfo);

    void processAmex(float amount, CardInfo cardInfo);

}
```